GitHub地址:https://github.com/vipshop/redis-migrate-tool.git
Redis-Migrate-Tool是在redis集群之间迁移数据方便而有用的工具。
一、特点
- 快速
- 多线程
- 基于redis复制
- 实时迁移
- 迁移过程中,不影响源集群对外服务
- 异构迁移
- 支持Twemproxy集群和redis cluster集群
- 当目标是twemproxy集群,数据会跳过twemproxy直接导入到后端的redis
- 迁移状态显示
- 完善的数据校验
迁移工具的来源可以是:单独的redis实例,twemproxy集群,redis cluster,rdb文件,aof文件。
迁移工具的目标可以是:单独的redis实例,twemproxy集群,redis cluster,rdb文件。
二、依赖
在安装之前需要提前安装automake, libtool, autoconf和bzip2
yum -y install automake libtool autoconf bzip2
三、编译安装
git clone https://github.com/vipshop/redis-migrate-tool.gitcd redis-migrate-toolautoreconf -fvi./configuremake
四、运行命令
src/redis-migrate-tool -c rmt.conf -o log -d
五、注意事项
(1)、在运行此工具之前,请确保源redis主机具有足够的内存,允许至少一个redis生成rdb文件。如果源机器的内存足够大,允许所有redis同时生成rdb文件,那么可以在rm .conf中设置“source_safe: false”。
(2)、不允许一下的的命令传输到目标redis组,因为这些命令可能跨越不同的redis节点,如下:
RENAMERENAMENXRPOPLPUSHBRPOPLPUSHFLUSHALLFLUSHDBBITOPMOVEGEORADIUSGEORADIUSBYMEMBEREVALEVALSHASCRIPTPFMERGE
六、配置文件简介
配置文件名为rmt.conf,主要由三个部分组成: source, target and common,如下:
[source]type: twemproxyhash: fnv1a_64hash_tag: "{}"distribution: ketamaservers :-127.0.0.1:12345:1 server1-127.0.1.1:12345:1 server2-127.0.2.1:12345:1 server3-127.0.3.1:12345:1 server4[target]type: redis clusterservers:-127.0.0.1:23456[common]listen: 0.0.0.0:8888
6.1 source和target
(1)、type:redis的组类型,有如下几种类型:
single # redis单节点twemproxy # twemproxy集群redis cluster # redis cluster集群rdb file # RDB文件aof file # AOF文件
(2)、hash:hash函数的名称,仅支持type类型是twemproxy,有如下几种:
one_at_a_timemd5crc16crc32 (crc32 implementation compatible with libmemcached)crc32a (correct crc32 implementation as per the spec)fnv1_64fnv1a_64fnv1_32fnv1a_32hsiehmurmurjenkins
(3)、hash_tag:一个两个字符的字符串,指定用于散列的键的一部分。例如“{}”或“$$”。散列标记允许将不同的键映射到同一服务器,只要标记中的键的部分相同。仅支持类型是twemproxy。
(4)、distribution:密文分发模式,仅支持类型是twemproxy。有如下几种模式:
ketamamodularandom
(5)、servers:组中的redis地址列表。如果类型是twemproxy,这与twemproxy配置文件相同。如果类型是rdb文件,这就是文件名。
(6)、redis_auth:连接redis服务的身份验证。
(7)、timeout:读写的超时时间。
6.2 common
主要是redis-migrate-tool的配置信息
listen: 监听地址和端口,比如 127.0.0.1:8888.max_clients: 客户端最大连接数, 比如 100.threads: redis-migrate-tool的最大线程数. 默认是CPU核心数.step: 解析请求的步骤,数字越大,迁移的速度越快,但是使用的内存越多,默认为1.mbuf_size: 请求的Mbuf大小. 默认为512.noreply: 是否检查目标组. 默认是 false.source_safe: 内存安全保护,避免内存不足导致宕机. 默认是true.dir: 工作路径,用于存储文件(比如RDB,AOF文件). 默认就是当前目录.filter: 过滤.如果键和默认不匹配就过滤键,模式是全局模式.默认是NULL,它支持正则匹配。
七、配置文件示例
示例1:从redis cluster集群迁移数据到twemproxy集群
[source]type: redis clusterservers:- 127.0.0.1:6379- 127.0.0.1:6380- 127.0.0.1:6381- 127.0.0.1:6382[target]type: twemproxyhash: fnv1a_64hash_tag: "{}"distribution: ketamaservers:- 127.0.0.1:6380:1 server1- 127.0.0.1:6381:1 server2- 127.0.0.1:6382:1 server3- 127.0.0.1:6383:1 server4[common]listen: 0.0.0.0:8888threads: 2step: 1mbuf_size: 1024source_safe: true
示例2:从twemproxy迁移到redis集群
[source]type: twemproxyhash: fnv1a_64hash_tag: "{}"distribution: ketamaservers:- 127.0.0.1:6379- 127.0.0.1:6380- 127.0.0.1:6381- 127.0.0.1:6382[target]type: redis clusterservers:- 127.0.0.1:7379[common]listen: 0.0.0.0:8888step: 1mbuf_size: 512
示例3:从redis集群迁移到redis集群
[source]type: redis clusterservers:- 127.0.0.1:8379[target]type: redis clusterservers:- 127.0.0.1:7379[common]listen: 0.0.0.0:8888
示例4:从RDB文件恢复到redis集群
[source]type: rdb fileservers:- /data/redis/dump1.rdb- /data/redis/dump2.rdb[target]type: redis clusterservers:- 127.0.0.1:7379[common]listen: 0.0.0.0:8888step: 2mbuf_size: 512source_safe: false
示例5:从redis集群保存RDB文件
[source]type: redis clusterservers:- 127.0.0.1:7379[target]type: rdb file[common]listen: 0.0.0.0:8888source_safe: true
示例6:从AOF文件恢复到redis集群
[source]type: aof fileservers:- /data/redis/appendonly1.aof- /data/redis/appendonly2.aof[target]type: redis clusterservers:- 127.0.0.1:7379[common]listen: 0.0.0.0:8888step: 2
八、数据校验
迁移数据之后,可以使用redis_check命令检查源组和目标组中的数据。如下:
$src/redis-migrate-tool -c rmt.conf -o log -C redis_checkCheck job is running...Checked keys: 1000Inconsistent value keys: 0Inconsistent expire keys : 0Other check error keys: 0Checked OK keys: 1000All keys checked OK!Check job finished, used 1.041s
如果要检查更多的keys,可以使用如下命令:
$src/redis-migrate-tool -c rmt.conf -o log -C "redis_check 200000"Check job is running...Checked keys: 200000Inconsistent value keys: 0Inconsistent expire keys : 0Other check error keys: 0Checked OK keys: 200000All keys checked OK!Check job finished, used 11.962s
九、状态检查
通过redis-cli连接redis-migrate-tool监控的端口,运行info命令。如下:
$redis-cli -h 127.0.0.1 -p 8888127.0.0.1:8888> info# Serverversion:0.1.0os:Linux 2.6.32-573.12.1.el6.x86_64 x86_64multiplexing_api:epollgcc_version:4.4.7process_id:9199tcp_port:8888uptime_in_seconds:1662uptime_in_days:0config_file:/ect/rmt.conf# Clientsconnected_clients:1max_clients_limit:100total_connections_received:3# Memorymem_allocator:jemalloc-4.0.4# Groupsource_nodes_count:32target_nodes_count:48# Statsall_rdb_received:1all_rdb_parsed:1all_aof_loaded:0rdb_received_count:32rdb_parsed_count:32aof_loaded_count:0total_msgs_recv:7753587total_msgs_sent:7753587total_net_input_bytes:234636318total_net_output_bytes:255384129total_net_input_bytes_human:223.77Mtotal_net_output_bytes_human:243.55Mtotal_mbufs_inqueue:0total_msgs_outqueue:0127.0.0.1:8888>
