1、 部署 依赖: yum -y install automake yum -y install libtool yum -y install autoconf yum -y install bzip2

安装redis-migrate-tool unzip redis-migrate-tool-master.zip cd redis-migrate-tool-master autoreconf -fvi ./configure make

检查安装是否成功,如下图所示即为正确 src/redis-migrate-tool -h

参数说明: -d 以守护进程执行 -I 输出有用的信息 -n 不接收目标redis的回应 -v 设置日志等级,默认5,最小0,最大11 -o 输出到日志 -c 配置文件 -p 进程文件,默认没有 -m 存储器缓冲大小,默认512字节,和机器磁盘一个扇区一样,我猜的 -C 默认redis_migrate,就是迁移命令 -r 源类型,默认single,还可以是twemproxy或者redis_cluster -R 目标类型,默认single,还可以是twemproxy或者redis_cluster -T 线程数,使用多少线程来跑这个job,默认1 -b 默认可以使用128T的缓存来运行这个job -f 源ip:port -t 目标ip:port -S 默认1,用于解析请求的步骤,数值越大,迁移越快,内存占用也就越大

使用: 可以将这些设置写入到配置文件中 vim /tmp/rmt.conf [source] type:single servers:

  • 192.168.1.150:6379

[target] type:single servers:

  • 192.168.1.172:6379

[common] listen:0.0.0.0:8910 threads:2 mbuf_size:512

运行测试: 从150迁到172,并且在迁移过程中,150继续写入 150 172 ./redis-migrate-tool -c /tmp/rmt.conf -o log -d 可以看到迁移程序运行中 结果什么都没有发生,查看log,发现报错了 [2018-08-30 11:24:04.392] rmt_redis.c:6446 ERROR: Can't handle RDB format version -1219911672 [2018-08-30 11:24:04.392] rmt_redis.c:6715 ERROR: Rdb file for node[192.168.1.150:6379] parsed failed 因为redis每个版本的rdb都不一样,所以原因可能是不支持redis4.0.1的rdb解析

没办法了,换3.2.12试试 我在172上设置了3.2版本的6379和6380 修改下配置文件 [source] type:single servers:

  • 192.168.1.172:6379

[target] type:single servers:

  • 192.168.1.172:6380

[common] listen:0.0.0.0:8910 threads:2 mbuf_size:512 还是之前的数据 6379 6380 执行migrate 查看6380,如下图,已经同步 接着再在6379上写入 查看6380,如下图已复制过来。 证明redis-migrate-tool是实时的 上面这些操作,我均没有添加认证,那么我添加认证会如何呢? 6379,6380同时添加认证 看,认证已生效 再来测试,是否会实时同步 6379写入 6380查看,如下图,显然没有同步过来。 日志循环报如下报错: 那么能不能通过配置文件加认证呢?不清楚,但可以试试 答案是可以,在配置文件中的[source][target]下加入redis_auth:111111 重启migrate,再查看6380,已经迁移过来

上面测试的是同一个库下的,那么不同库下的呢? 6379 查看6380 结果,在6379的2库和3库中的数据都插入到了6380的0库 这个看已解决的issues中,是要改一个文件。 我进行了改完,但结果也只是把db 0改成了db n,并没有将源多个库中的数据一一对应到目标数据库中。所以源存在多库时候慎用。

迁移cluster和single一样,区别是type,所以不过多叙述 type:redis cluster

2、 总结 A、 不适用4.0.x版本。 B、 源中存在多库时,禁用,避免发生键值覆盖。

3、 多源配置: 文档源自测试结果,达到了目的,但是有限制,由于没有别的文档可查阅 [source] type:single servers:

  • 192.168.1.172:6379
  • 192.168.1.172:6381 redis_auth:111111

[target] type:single servers:

  • 192.168.1.172:6380 redis_auth:111111

[common] listen:0.0.0.0:8910 threads:2 mbuf_size:512

多源设置如上配置,要不都不带密码,要不源是同一个密码,否则无法启动,在线变更密码可以通过config set requirepass 密码 来进行操作 6379的所有key 共11个 6381的所有Key 共7个 目标6381 自带1个重复的测覆盖用

我的为啥是10号库,因为我改文件了……

执行之后如下图,看到6379,6381的全部过来了,并且把原本的ttl6的值给覆盖了 同时6379和6381继续写入 查看结果,已经追加过来了

4、 测试过滤器 说是过滤器,其实是这个过滤器指定哪个,哪个才能被迁移过来。 限制:没有找到可以同时过滤多个的写法,只能写1个 看测试结果 先清空6380 过滤条件加入filter:ttl*,也就是ttl开头的都迁移过来 [common] listen:0.0.0.0:8910 threads:2 mbuf_size:512 filter:ttl*

查看结果: 可以看到只迁移过来了ttl开头的key 6379,6381继续写一些包含ttl开头还有其他 查看6380,都已经迁移过来

一个想法,我要是启多个migrate呢?是不是能过滤多个条件? 再启动一个migrate,换个端口,再添加个配置文件,修改filter:name* 哎呦,都追加过来了 再在6379上同时写入1个ttl开头,1个name开头的 查看6380,都已经追加过来 但是这种双开的方法我不确定靠不靠谱哈