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节点/主从版模式。sentinel
:sentinel
模式。cluster
: 集群模式。proxy
: proxy模式。 -
source.address
: 源redis的地址,从1.6版本开始支持集群版,不同的类型对应不同的地址:standalone
模式下,需要填写单个db节点的地址,主从版需要输入master或者slave的地址。sentinel
模式下,需要填写sentinel_master_name:master_or_slave@sentinel_cluster_address
。sentinel_master_name
表示sentinel配置下master的名字,master_or_slave
表示从sentinel中选择的db是master还是slave,sentinel_cluster_address
表示sentinel的单节点或者集群地址,其中集群地址以分号(;)分割。例如:mymaster:master@127.0.0.1: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_address
。sentinel_master_name
表示sentinel配置下master的名字,sentinel_cluster_address
表示sentinel的单节点或者集群地址,其中集群地址以分号(;)分割。例如:mymaster@127.0.0.1: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
: master@10.1.1.1: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表示源端没有数据变化。