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

  1. yum -y install automake libtool autoconf bzip2

三、编译安装

  1. git clone https://github.com/vipshop/redis-migrate-tool.git
  2. cd redis-migrate-tool
  3. autoreconf -fvi
  4. ./configure
  5. make

四、运行命令

  1. src/redis-migrate-tool -c rmt.conf -o log -d

五、注意事项

(1)、在运行此工具之前,请确保源redis主机具有足够的内存,允许至少一个redis生成rdb文件。如果源机器的内存足够大,允许所有redis同时生成rdb文件,那么可以在rm .conf中设置“source_safe: false”。
(2)、不允许一下的的命令传输到目标redis组,因为这些命令可能跨越不同的redis节点,如下:

  1. RENAME
  2. RENAMENX
  3. RPOPLPUSH
  4. BRPOPLPUSH
  5. FLUSHALL
  6. FLUSHDB
  7. BITOP
  8. MOVE
  9. GEORADIUS
  10. GEORADIUSBYMEMBER
  11. EVAL
  12. EVALSHA
  13. SCRIPT
  14. PFMERGE

六、配置文件简介

配置文件名为rmt.conf,主要由三个部分组成: source, target and common,如下:

  1. [source]
  2. type: twemproxy
  3. hash: fnv1a_64
  4. hash_tag: "{}"
  5. distribution: ketama
  6. servers :
  7. -127.0.0.1:12345:1 server1
  8. -127.0.1.1:12345:1 server2
  9. -127.0.2.1:12345:1 server3
  10. -127.0.3.1:12345:1 server4
  11. [target]
  12. type: redis cluster
  13. servers:
  14. -127.0.0.1:23456
  15. [common]
  16. listen: 0.0.0.0:8888

6.1 source和target

(1)、type:redis的组类型,有如下几种类型:

  1. single # redis单节点
  2. twemproxy # twemproxy集群
  3. redis cluster # redis cluster集群
  4. rdb file # RDB文件
  5. aof file # AOF文件

(2)、hash:hash函数的名称,仅支持type类型是twemproxy,有如下几种:

  1. one_at_a_time
  2. md5
  3. crc16
  4. crc32 (crc32 implementation compatible with libmemcached)
  5. crc32a (correct crc32 implementation as per the spec)
  6. fnv1_64
  7. fnv1a_64
  8. fnv1_32
  9. fnv1a_32
  10. hsieh
  11. murmur
  12. jenkins

(3)、hash_tag:一个两个字符的字符串,指定用于散列的键的一部分。例如“{}”或“$$”。散列标记允许将不同的键映射到同一服务器,只要标记中的键的部分相同。仅支持类型是twemproxy。

(4)、distribution:密文分发模式,仅支持类型是twemproxy。有如下几种模式:

  1. ketama
  2. modula
  3. random

(5)、servers:组中的redis地址列表。如果类型是twemproxy,这与twemproxy配置文件相同。如果类型是rdb文件,这就是文件名。

(6)、redis_auth:连接redis服务的身份验证。

(7)、timeout:读写的超时时间。

6.2 common

主要是redis-migrate-tool的配置信息

  1. listen: 监听地址和端口,比如 127.0.0.1:8888.
  2. max_clients: 客户端最大连接数, 比如 100.
  3. threads: redis-migrate-tool的最大线程数. 默认是CPU核心数.
  4. step: 解析请求的步骤,数字越大,迁移的速度越快,但是使用的内存越多,默认为1.
  5. mbuf_size: 请求的Mbuf大小. 默认为512.
  6. noreply: 是否检查目标组. 默认是 false.
  7. source_safe: 内存安全保护,避免内存不足导致宕机. 默认是true.
  8. dir: 工作路径,用于存储文件(比如RDB,AOF文件). 默认就是当前目录.
  9. filter: 过滤.如果键和默认不匹配就过滤键,模式是全局模式.默认是NULL,它支持正则匹配。

七、配置文件示例

示例1:从redis cluster集群迁移数据到twemproxy集群

  1. [source]
  2. type: redis cluster
  3. servers:
  4. - 127.0.0.1:6379
  5. - 127.0.0.1:6380
  6. - 127.0.0.1:6381
  7. - 127.0.0.1:6382
  8. [target]
  9. type: twemproxy
  10. hash: fnv1a_64
  11. hash_tag: "{}"
  12. distribution: ketama
  13. servers:
  14. - 127.0.0.1:6380:1 server1
  15. - 127.0.0.1:6381:1 server2
  16. - 127.0.0.1:6382:1 server3
  17. - 127.0.0.1:6383:1 server4
  18. [common]
  19. listen: 0.0.0.0:8888
  20. threads: 2
  21. step: 1
  22. mbuf_size: 1024
  23. source_safe: true

示例2:从twemproxy迁移到redis集群

  1. [source]
  2. type: twemproxy
  3. hash: fnv1a_64
  4. hash_tag: "{}"
  5. distribution: ketama
  6. servers:
  7. - 127.0.0.1:6379
  8. - 127.0.0.1:6380
  9. - 127.0.0.1:6381
  10. - 127.0.0.1:6382
  11. [target]
  12. type: redis cluster
  13. servers:
  14. - 127.0.0.1:7379
  15. [common]
  16. listen: 0.0.0.0:8888
  17. step: 1
  18. mbuf_size: 512

示例3:从redis集群迁移到redis集群

  1. [source]
  2. type: redis cluster
  3. servers:
  4. - 127.0.0.1:8379
  5. [target]
  6. type: redis cluster
  7. servers:
  8. - 127.0.0.1:7379
  9. [common]
  10. listen: 0.0.0.0:8888

示例4:从RDB文件恢复到redis集群

  1. [source]
  2. type: rdb file
  3. servers:
  4. - /data/redis/dump1.rdb
  5. - /data/redis/dump2.rdb
  6. [target]
  7. type: redis cluster
  8. servers:
  9. - 127.0.0.1:7379
  10. [common]
  11. listen: 0.0.0.0:8888
  12. step: 2
  13. mbuf_size: 512
  14. source_safe: false

示例5:从redis集群保存RDB文件

  1. [source]
  2. type: redis cluster
  3. servers:
  4. - 127.0.0.1:7379
  5. [target]
  6. type: rdb file
  7. [common]
  8. listen: 0.0.0.0:8888
  9. source_safe: true

示例6:从AOF文件恢复到redis集群

  1. [source]
  2. type: aof file
  3. servers:
  4. - /data/redis/appendonly1.aof
  5. - /data/redis/appendonly2.aof
  6. [target]
  7. type: redis cluster
  8. servers:
  9. - 127.0.0.1:7379
  10. [common]
  11. listen: 0.0.0.0:8888
  12. step: 2

八、数据校验

迁移数据之后,可以使用redis_check命令检查源组和目标组中的数据。如下:

  1. $src/redis-migrate-tool -c rmt.conf -o log -C redis_check
  2. Check job is running...
  3. Checked keys: 1000
  4. Inconsistent value keys: 0
  5. Inconsistent expire keys : 0
  6. Other check error keys: 0
  7. Checked OK keys: 1000
  8. All keys checked OK!
  9. Check job finished, used 1.041s

如果要检查更多的keys,可以使用如下命令:

  1. $src/redis-migrate-tool -c rmt.conf -o log -C "redis_check 200000"
  2. Check job is running...
  3. Checked keys: 200000
  4. Inconsistent value keys: 0
  5. Inconsistent expire keys : 0
  6. Other check error keys: 0
  7. Checked OK keys: 200000
  8. All keys checked OK!
  9. Check job finished, used 11.962s

九、状态检查

通过redis-cli连接redis-migrate-tool监控的端口,运行info命令。如下:

  1. $redis-cli -h 127.0.0.1 -p 8888
  2. 127.0.0.1:8888> info
  3. # Server
  4. version:0.1.0
  5. os:Linux 2.6.32-573.12.1.el6.x86_64 x86_64
  6. multiplexing_api:epoll
  7. gcc_version:4.4.7
  8. process_id:9199
  9. tcp_port:8888
  10. uptime_in_seconds:1662
  11. uptime_in_days:0
  12. config_file:/ect/rmt.conf
  13. # Clients
  14. connected_clients:1
  15. max_clients_limit:100
  16. total_connections_received:3
  17. # Memory
  18. mem_allocator:jemalloc-4.0.4
  19. # Group
  20. source_nodes_count:32
  21. target_nodes_count:48
  22. # Stats
  23. all_rdb_received:1
  24. all_rdb_parsed:1
  25. all_aof_loaded:0
  26. rdb_received_count:32
  27. rdb_parsed_count:32
  28. aof_loaded_count:0
  29. total_msgs_recv:7753587
  30. total_msgs_sent:7753587
  31. total_net_input_bytes:234636318
  32. total_net_output_bytes:255384129
  33. total_net_input_bytes_human:223.77M
  34. total_net_output_bytes_human:243.55M
  35. total_mbufs_inqueue:0
  36. total_msgs_outqueue:0
  37. 127.0.0.1:8888>