redis迁移工具redis-migrate-tool测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis迁移工具redis-migrate-tool测试相关的知识,希望对你有一定的参考价值。

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,都已经追加过来
技术分享图片
但是这种双开的方法我不确定靠不靠谱哈

以上是关于redis迁移工具redis-migrate-tool测试的主要内容,如果未能解决你的问题,请参考以下文章

Redis上云迁移实践

redis迁移工具redis-migrate-tool测试

redis 版本升级数据迁移使用Redis-Shake

redis集群同步迁移方法:通过redis-migrate-tool实现

单机redis升级及数据迁移方案

codis/redis数据数据迁移至阿里云redis服务器