Redis迁移及数据同步(Redis-Shake)

redis-shake是阿里云Redis&MongoDB团队开源的用于redis数据同步的工具。它支持解析、恢复、备份、同步四个功能。

  • 恢复restore:将RDB文件恢复到目的redis数据库。
  • 备份dump:将源redis的全量数据通过RDB文件备份起来。
  • 解析decode:对RDB文件进行读取,并以json格式解析存储。
  • 同步sync:支持源redis和目的redis的数据同步,支持全量和增量数据的迁移,支持单节点、主从版、集群版之间的互相同步。需要注意的是,如果源端是集群版,需要搭建多条链路从不同的db结点进行拉取,同时源端不能开启move slot功能;对于目的端,如果是集群版,写入可以是1个或者多个db结点。
  • 同步rump:支持源redis和目的redis的数据同步,仅支持全量的迁移。采用scan和restore命令进行迁移,支持不同云厂商不同redis版本的迁移。

迁移同步是使用sync模式,可支持单节点(主从)-->单节点(主从)、单节点(主从)-->cluster、cluster-->cluster、cluster-->单节点(主从)等情况。

1.  下载

redis-shake的下载地址为:redis-shake下载地址。直接下载二进制包,可免编译直接使用,目前最新版本为1.6.23。

注:每次使用,请下载使用最新的版本。

2.  修改配置文件

默认sync模式只需要配置以下几个内容:

  • source.type: 源redis的类型,支持一下4种类型:
    standalone: 单db节点/主从版模式。
    sentinelsentinel模式。
    cluster: 集群模式。
    proxy: proxy模式。
  • source.address: 源redis的地址,从1.6版本开始支持集群版,不同的类型对应不同的地址:
    standalone模式下,需要填写单个db节点的地址,主从版需要输入master或者slave的地址。
    sentinel模式下,需要填写sentinel_master_name:master_or_slave@sentinel_cluster_addresssentinel_master_name表示sentinel配置下master的名字,master_or_slave表示从sentinel中选择的db是master还是slave,sentinel_cluster_address表示sentinel的单节点或者集群地址,其中集群地址以分号(;)分割。例如:mymaster:[email protected]:26379;127.0.0.1:26380
    cluster模式下,需要填写集群地址,以分号(;)分割。例如:10.1.1.1:20331;10.1.1.2:20441。支持自动发现机制,以@开头。
    proxy模式下,需要填写单个proxy的地址,此模式目前仅用于rump
  • source.password_raw:源redis的密码。
  • target.type: 目的redis的类型,与source.type一致。
  • target.address:目的redis的地址。从1.6版本开始支持集群版,不同的类型对应不同的地址。 
    standalone模式,参见source.address
    sentinel模式,需要填写sentinel_master_name@sentinel_cluster_addresssentinel_master_name表示sentinel配置下master的名字,sentinel_cluster_address表示sentinel的单节点或者集群地址,其中集群地址以分号(;)分割。例如:[email protected]:26379;127.0.0.1:26380
    cluster模式,参见source.address
    proxy模式下,填写proxy的地址,如果是多个proxy,则round-robin循环负载均衡连接,保证一个源端db连接只会对应一个proxy。
  • target.password_raw:目的redis的密码。

配置完配置文件,然后以不同的模式启动即可:./redis-shake -conf=../conf/redis-shake.conf -type=sync

2.1 单个节点到单个节点配置举例。

  • source.type: standalone
  • source.address: 10.1.1.1:6379
  • source.password: 12345
  • target.type: standalone
  • target.address: 10.1.1.1:6379
  • target.password: 12345

2.2 集群版cluster到集群版cluster配置举例

  • source.type: cluster
  • source.address: 10.1.1.1:7000;10.1.1.2:7000;10.1.1.3:7000
  • source.password: 12345
  • target.type: cluster
  • target.address: 10.1.2.1:7000;10.1.2.1:7000;10.1.2.1:7000
  • target.password: 12345

  对于source.address或者target.address,用户可以启用自动发现机制,地址以'@'开头,redis-shake将会根据cluster nodes命令自动去探测有几个节点。

对于source.address,用户可以在'@'前面配置master(默认)或者slave表示分表从master或者slave进行拉取;对于target.address,只能是master或者不配置:

  • source.type: cluster
  • source.address: [email protected]:7000 # 将会自动探测到10.1.1.1:7000 集群下的所有节点,并从所有master进行拉取。
  • source.password: 12345
  • target.type: cluster
  • target.address: @10.1.2.1:7000 # 将会自动探测到10.1.2.1:7000 集群下的所有节点,并写入所有master。
  • target.password: 12345

3. 启动

转后台使用nohup启动:

nohup ./redis-shake -conf=../conf/redis-shake.conf -type=sync &

4. 日志信息

日志文件在配置文件中的log.file配置,默认为同步分为三个阶段:

1) 等待源端save rdb完毕并从rdb头部读取size大小,日志如下:

2019/06/06 15:14:56 [INFO] dbSyncer[0] +
2019/06/06 15:14:57 [INFO] dbSyncer[0] -
2019/06/06 15:14:57 [INFO] dbSyncer[0] +

2) 全量同步阶段,显示百分比:

2019/06/06 15:15:41 [INFO] dbSyncer[0] total=924836132 -      9155943 [  0%]  entry=2109
2019/06/06 15:15:42 [INFO] dbSyncer[0] total=924836132 -     16107663 [  1%]  entry=4411
2019/06/06 15:15:43 [INFO] dbSyncer[0] total=924836132 -     22914262 [  2%]  entry=6750
2019/06/06 15:15:44 [INFO] dbSyncer[0] total=924836132 -     29707595 [  3%]  entry=9060
2019/06/06 15:15:45 [INFO] dbSyncer[0] total=924836132 -     35741354 [  3%]  entry=11067
2019/06/06 15:15:46 [INFO] dbSyncer[0] total=924836132 -     42911547 [  4%]  entry=13480

3)增量同步,出现字样sync rdb done:

2019/07/09 16:34:05 [INFO] dbSyncer[0] sync:  +forwardCommands=1      +filterCommands=0      +writeBytes=4
2019/07/09 16:34:06 [INFO] dbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2019/07/09 16:34:07 [INFO] dbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2019/07/09 16:34:08 [INFO] dbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2019/07/09 16:34:09 [INFO] dbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2019/07/09 16:34:10 [INFO] dbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
2019/07/09 16:34:11 [INFO] dbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0

其中forwardCommands表示发送的命令个数,filterCommands表示过滤的命令个数,比如opinfo或者指定了filter都会被过滤,writeBytes表示发送的字节数。都为0表示源端没有数据变化。

猜你喜欢

转载自blog.csdn.net/yujia_666/article/details/107328160