工具的git地址:https://github.com/vipshop/redis-migrate-tool
linux环境需要安装资源:autoconf automake libtool bzip2 (使用yum install指令)
编译:
$ cd redis-migrate-tool
$ autoreconf -fvi
$ ./configure
$ make
$ src/redis-migrate-tool -h
执行:
src/redis-migrate-tool -c rmt.conf -o log -d
日志:
tail log
查看迁移信息:
# rmt.conf配置中的listen的端口(8888),地址(127.0.0.1)
redis-cli -h 127.0.0.1 -p 8888
127.0.0.1:8888> info
抽取/校验数据:
#默认抽取1000个数据比对
src/redis-migrate-tool -c rmt.conf -o log -C "redis_check 2000"
插入测试:
#默认1000,rmt.conf中若有filter,效果不佳
src/redis-migrate-tool -c rmt.conf -o log -C "redis_testinsert 2000"
整合两个单点数据的配置(rmt.conf):
[source]
type: single
servers:
- 127.0.0.1:6380
- 127.0.0.1:6381
[target]
type: single
servers:
- 127.0.0.1:6382
[common]
listen: 0.0.0.0:8888
两个单点转一个单点,需要确保不存在键值相同的,不然数据可能会被脏数据覆盖。
[common]下属性解释:
filter:用于过滤不符合要求的键值 ,需满足Glob-Style模式,目前发现只能使用*,?,[],^,没有{},这将导致以某两个字符串开头的需求需要双开工具才能实现。(有人知道其他方式吗?)
双开注意:
重新创建一个conf文件,修改listen的端口,修改source和target。启动指令中的rmt.conf改为新建配置文件。
场景不可用:
A库搬迁到B库,B库修改某个key的值后,重启rmt,会发现B库数据修改的数据被还原。这是由于,rmt启动时会将A库的所有数据生成oplog(写操作),发送给B库执行,故数据被覆盖。