更新时间:2024-08-01 GMT+08:00
分享

Pika到GeminiDB Redis的迁移

Pika是一个可持久化的大容量Redis存储服务,解决了Redis由于存储数据量巨大而导致内存不够用的容量瓶颈。但其集群管理功能较为薄弱,需要使用twemproxy或者codis实现静态数据分片。同时由于数据全部存储在磁盘中,相比于社区版Redis,性能明显下降。

GeminiDB Redis接口是一款兼容Redis生态的云原生NoSQL数据库,基于共享存储池的多副本强一致机制,保证数据的安全可靠。GeminiDB Redis接口实现了冷热分离,解决了缓存(cache)与数据库(Data Base,DB)之间交互访问的问题,提高了程序可读性与程序运行效率。同时对RocksDB进行深度定制,实现秒级分裂弹性扩容,扩缩容无需搬迁数据,快速而平滑。通过proxy代理,使上层业务可以不感知内核处理扩缩容过程中的数据迁移。

本章节主要介绍Pika到GeminiDB Redis接口的迁移方案。

迁移原理

pika-port伪装成Pika的从节点运行,通过主从复制的方式进行数据迁移。Pika主节点通过比较pika-port和自己的binlog偏移量判断做全量迁移还是增量迁移。如果需要做全量迁移,Pika主节点会将全量数据快照发送给pika-port,pika-port将解析后的快照数据发送给GeminiDB Redis。全量迁移结束后进入增量迁移,pika-port将增量数据解析后以redis命令的形式发送给GeminiDB Redis

图1 迁移原理

Pika-migrate的迁移原理和pika-port相似,将工具虚拟为pika的从库,然后从主库获取到数据转发给目标redis,同时支持增量同步,实现在线热迁的功能。

pika-migrate 通过 dbsync 请求获取主库全量 DB 数据,以及当前 DB 数据所对应的 binlog 点位。获取到主库当前全量 DB 数据之后,扫描 DB,将 DB 中的数据打包转发给 Redis。通过之前获取的 binlog 的点位向主库进行增量同步, 在增量同步的过程中,将从主库获取到的 binlog 重组成redis命令,转发给redis。

适用版本

Pika到Redis迁移工具Pika-Port适用于Pika v2.x和v3.0.x版本,具体使用步骤请参考pika-port迁移工具使用说明或者pika到pika、redis迁移工具。如果使用Pika v3.2及以上版本,需使用迁移工具Pika-Migrate,具体步骤请参考pika-migrate迁移工具使用说明

使用须知

  • Pika迁移工具伪装成源端Pika的从节点,只读取全量和增量数据,无数据受损风险。
  • 源端增加了和Pika迁移工具的主从同步流程,可能会影响源端性能。
  • 全量和增量结合迁移可以不停服,业务切入GeminiDB Redis时短暂停服。

pika-port迁移工具使用说明

  • 部署迁移工具pika-port
    • 迁移工具下载

      从Github上直接下载编译好的对应pika版本的pika-port开源迁移工具(如pika3.0.x版本就使用3.0.x版本的开源工具),网址为:https://github.com/ipixiu/pika-port-bin

      图2 迁移工具下载
    • 部署位置和目录结构

      以pika_portv1.6.0为例,将解压后的整个文件重命名为pika_port3,复制在部署了pika的环境上(或者任一能与pika实例和GeminiDB Redis实例网络互通的服务器上),解压后的pika_port3文件夹目录结构如下:

    • 迁移前准备

      由于sbin目录下的pika-port二进制文件需要引用lib目录下的库文件,迁移之前需在pika_port3路径执行如下命令:

      export LD_LIBRARY_PATH=./lib:${LD_LIBRARY_PATH} //链接库文件

      rm -rf ./rsync_dump/ //删除文件夹

      rm -rf ./sync_log/ //删除sync日志

  • pika单机数据迁移
    • 启动命令

      执行如下命令,启动pika_port迁移工具:

      ./sbin/pika_port -i master_ip -o master_port -m forward_ip -n forward_port -x forward_thread_num -y forward_passwd -f filenum -s offset -w password -r rsync_dump_path -l log_path

      -h -- show this help

      -t -- local host ip(OPTIONAL default: 127.0.0.1),输入本机IP

      -p -- local port(OPTIONAL),默认即可

      -i -- Pika主节点IP

      -o -- Pika主节点port

      -m -- GeminiDB Redis ELB IP

      -n -- GeminiDB Redis port

      -x -- 发送线程数量(OPTIONAL default: 1)

      -y -- GeminiDB Redis密码

      -f -- binlog文件数量,默认即可(OPTIONAL default: local offset)

      -s -- binlog offset,默认即可(OPTIONAL default: local offset)

      -w -- Pika主节点密码

      -r -- rsync dump文件到本地目录,默认即可(OPTIONAL default: ./rsync_dump)

      -l -- 产生的日志文件目录,默认即可(OPTIONAL default: ./log)

      -b -- max batch number when port rsync dump data. 默认即可 (OPTIONAL default: 512)

      -d -- 是否后台运行(OPTIONAL)

      示例:

      ./sbin/pika_port -t 28.80.60.200 -p 12345 -i 28.80.60.200 -o 9221 -m 28.80.60.201 -n 6379 -x 7 -y a -w a

      【注】上例中,28.80.60.200为源端pika IP,28.80.60.201为目标端redis IP。

    • 等待结果

      等待数据迁移,若执行日志中出现如下信息,代表全量数据同步完成,此后数据迁移进入增量同步阶段。

  • pika集群数据迁移

    迁移步骤同pika单机数据迁移步骤,为每个pika实例创建一个工作流即可。

pika-migrate迁移工具使用说明

  • 迁移工具部署
  • 迁移步骤
    1. 修改配置文件

      根据目标端(redis)的信息,修改迁移工具的配置文件conf/pika.conf 中的如下参数:

      target-redis-host:Redis 的 IP 地址。

      target-redis-port:Redis 的端口号。

      target-redis-pwd:Redis 默认账号的密码。

      masterauth:Pika主库的密码(如Pika主库没有设置密码则不填)。

      • binlog文件为log/log_db0目录下记录了所有操作的同步日志文件,这部分文件在增量同步数据阶段使用
      • 将全量数据写入到Redis这段时间可能耗时很长,而导致Pika主库原先的binlog文件被清理。需要在Pika主库上保留足够的binlog⽂件个数,确保后续该⼯具请求增量同步的时候,对应的binlog文件还存在。
      • binlog文件占用磁盘空间,可以根据观察Pika主库实际生成该文件的情况确定保留binlog的数量。
    2. 在pika主库上执行“config set expire-logs-nums 10000”命令,让 PIKA 主库保留10000个 binlog 文件。

    3. 在工具包的路径下执行如下命令,启动 pika-migrate 工具,并查看控制台回显信息: bin/pika -c conf/pika.conf。

    4. 在pika-migrate客户端执行如下命令,将迁移工具伪装成 Slave,向主库请求同步,并观察控制台是否打印报错信息。

      slaveof [pika主库ip] [pika主库port]

      如果主从关系建立,此时回显信息为:

    5. 确认主从关系建立成功之后,pika-migrate开始向目标端Redis转发数据。在pika主库和从库执行“info Replication”命令,查看主从同步延迟。可在主库写入⼀个特殊的 key,然后在 Redis 侧查看是否可立即获取到该 key,判断数据同步完毕。

  • 注意事项
    • pika-migrate在线迁移只支持单DB场景,不支持多DB场景。
    • pika-migrate在线迁移不支持集群模式:严格来说,pika进程有两种模式启动,一种是classic,一种是sharding,其中sharding模式不支持pika-migrate迁移。

      具体模式可以在pika.conf里进行查看:

  • 常见问题
    • 如果从库一直未收到主库响应,会一直停留在Need To Sync阶段:

    • 可能原因
      • pika主库未使用root启动导致rsync无权限,请参考网址:https://github.com/OpenAtomFoundation/pika/issues/553。
      • rsync使用端口未开启监听,请开启监听。
      • rsync使用端口已被其他进程占用,请解除端口占用。

迁移后数据校验

使用redis数据校验工具RedisFullCheck进行校验,在redis源端或者目标端执行以下命令:

/redis-full-check -s {源端IP}:{源端端口} -p {源端密码} -t {目标端IP}:{目标端端口} -a {目标端密码} -m 比较模式

示例:

./redis-full-check -s 28.80.60.201:6379 -t 28.80.60.200:9221 -p a -a a -m 1

【注】上例中,28.80.60.200为源端pika IP,28.80.60.201为目标端redis IP。

等待校验完毕,如出现如下信息表示迁移成功,redis源端与目的端数据相同。

【注意事项】用redis-full-check进行数据校验时,会先使用 info keyspace命令判断需要迁移哪些DB;由于pika的keyspace解析与redis不一致,所以用redis-full-check进行数据校验时,源端必须填写redis的IP和port。

迁移性能参考

  • 环境:Pika(单节点)和pika-port同时部署在华为云8U32GB的弹性云服务器上,目标端为8U16GB,3节点GeminiDB Redis实例。
  • 预置数据:使用memtier_benchmark工具预置200GB数据。
  • 迁移性能:约50000qps。

相关文档