Redis

redis-migrate-tool使用详解

2019-08-02  本文已影响0人  所謂向日葵族

前言

redis-migrate-tool 是维品会开源的一款redis数据迁移工具,基于redis复制,快速,稳定,github地址为:https://github.com/vipshop/redis-migrate-tool

划重点 实时迁移 迁移过程中,源集群不影响对外提供服务

安装redis-migrate-tool

依赖

$ yum -y install automake libtool autoconf bzip2 git

构建

$ cd redis-migrate-tool
$ autoreconf -fvi
$ ./configure
$ make
$ src/redis-migrate-tool -h

警告

在运行工具之前,确保源redis所在的机器有足够的内存可以允许至少一个redis生成.rdb文件,如果源机器有大量足够的内存允许所有的redis生成.rdb,可以在配置文件rmt.conf设置source_safe: false

下列命令不支持传播给target redis组,因为这些命令下的keys可能交叉了不同的目标redis节点。

RENAME,RENAMENX,RPOPLPUSH,BRPOPLPUSH,FLUSHALL,FLUSHDB,BITOP,MOVE,GEORADIUS,GEORADIUSBYMEMBER,EVAL,EVALSHA,SCRIPT,PFMERGE

redis-migrate-tool 命令详解

出现下列帮助说明表示安装成功

This is redis-migrate-tool-0.1.0

Usage: redis-migrate-tool [-?hVdIn] [-v verbosity level] [-o output file]
                  [-c conf file] [-C command]
                  [-f source address] [-t target address]
                  [-p pid file] [-m mbuf size] [-r target role]
                  [-T thread number] [-b buffer size]

Options:
  -h, --help             : this help
  -V, --version          : show version and exit
  -d, --daemonize        : run as a daemon
  -I, --information      : print some useful information
  -n, --noreply          : don't receive the target redis reply
  -v, --verbosity=N      : set logging level (default: 5, min: 0, max: 11)
  -o, --output=S         : set logging file (default: stderr)
  -c, --conf-file=S      : set configuration file (default: rmt.conf)
  -p, --pid-file=S       : set pid file (default: off)
  -m, --mbuf-size=N      : set mbuf size (default: 512)
  -C, --command=S        : set command to execute (default: redis_migrate)
  -r, --source-role=S    : set the source role (default: single, you can input: single, twemproxy or redis_cluster)
  -R, --target-role=S    : set the target role (default: single, you can input: single, twemproxy or redis_cluster)
  -T, --thread=N         : set how many threads to run the job(default: 4)
  -b, --buffer=S         : set buffer size to run the job (default: 140720309534720 byte, unit:G/M/K)
  -f, --from=S           : set source redis address (default: 127.0.0.1:6379)
  -t, --to=S             : set target redis group address (default: 127.0.0.1:6380)
  -s, --step=N           : set step (default: 1)

Commands:
    redis_migrate        : Migrate data from source group to target group.
    redis_check          : Compare data between source group and target group. Default compare 1000 keys. You can set a key count behind.
    redis_testinsert     : Just for test! Insert some string, list, set, zset and hash keys into the source redis group. Default 1000 keys. You can set key type and key count behind.

部分指令解析:

1. 运行迁移

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

注意:-d指定为后台运行,如果再次运行可能需要杀死占用当前端口的进程。netstat -tnulp查看找到redis-migrate-tool的端口号,kill -9 [端口号]杀死再运行。

指定输出日志文件为log,可通过tail -200 log等查看日志。

2. 抽样检查

$ src/redis-migrate-tool -c rmt.conf -o log -C redis_check
Check job is running...

Checked keys: 1000
Inconsistent value keys: 0
Inconsistent expire keys : 0
Other check error keys: 0
Checked OK keys: 1000

All keys checked OK!
Check job finished, used 1.041s

抽样检查源组和目标组的数据,默认为1000个。如果需要检查更多的数据,

$ src/redis-migrate-tool -c rmt.conf -o log -C "redis_check 200000"
Check job is running...

Checked keys: 200000
Inconsistent value keys: 0
Inconsistent expire keys : 0
Other check error keys: 0
Checked OK keys: 200000

All keys checked OK!
Check job finished, used 11.962s

3. 测试插入一些数据

$ src/redis-migrate-tool -c rmt.conf -o log -C "redis_testinsert"
Test insert job is running...

Insert string keys: 200
Insert list keys  : 200
Insert set keys   : 200
Insert zset keys  : 200
Insert hash keys  : 200
Insert total keys : 1000

Correct inserted keys: 1000
Test insert job finished, used 0.525s

默认插入的数据为string、list、set、zset、hash各200个(均分),总共1000个。如果需要插入更多的键,

$ src/redis-migrate-tool -c rmt.conf -o log -C "redis_testinsert 30000"
Test insert job is running...

Insert string keys: 6000
Insert list keys  : 6000
Insert set keys   : 6000
Insert zset keys  : 6000
Insert hash keys  : 6000
Insert total keys : 30000

Correct inserted keys: 30000
Test insert job finished, used 15.486s

如果只想插入string类型的键(1000个),

$ src/redis-migrate-tool -c rmt.conf -o log -C "redis_testinsert string"

如果想指定插入的几种类型,并且指定总数,

$src/redis-migrate-tool -c rmt.conf -o log -C "redis_testinsert string|set|list 10000"
Test insert job is running...

Insert string keys: 3336
Insert list keys  : 3336
Insert set keys   : 3328
Insert zset keys  : 0
Insert hash keys  : 0
Insert total keys : 10000

Correct inserted keys: 10000
Test insert job finished, used 5.539s

插入校验生成的数据并不会清除,测试时可以尽量减少插入的key。

rmt.conf配置文件

配置文件包含三部分:[source], [target] 和 [common]

迁移工具的来源(source)可以是:单独的redis实例,twemproxy集群,redis cluster,rdb文件,aof文件。
迁移工具的目标(target)可以是:单独的redis实例,twemproxy集群,redis cluster,rdb文件。

[source]/[target]

[common]

配置文件示例
(1)从单一实例迁移数据到twemproxy集群(single to twemproxy):

[source]
type: single
servers:
 - 127.0.0.1:6379
 - 127.0.0.1:6380
 - 127.0.0.1:6381
 - 127.0.0.1:6382

[target]
type: twemproxy
hash: fnv1a_64
hash_tag: "{}"
distribution: ketama
servers:
 - 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:8888
threads: 2
step: 1
mbuf_size: 1024
source_safe: true

(2)从twemproxy集群迁移数据到redis集群(twemproxy to redis cluster)

[source]
type: twemproxy
hash: fnv1a_64
hash_tag: "{}"
distribution: ketama
servers:
 - 127.0.0.1:6379
 - 127.0.0.1:6380
 - 127.0.0.1:6381
 - 127.0.0.1:6382

[target]
type: redis cluster
servers:
 - 127.0.0.1:7379

[common]
listen: 0.0.0.0:8888
step: 1
mbuf_size: 512

(3)从一个redis集群迁移数据到另一个集群(redis cluster to another redis cluster),配置filter为以"abc"开始的键

[source]
type: redis cluster
servers:
 - 127.0.0.1:8379

[target]
type: redis cluster
servers:
 - 127.0.0.1:7379

[common]
listen: 0.0.0.0:8888
filter: abc*

(4)从.rdb文件导入数据到redis集群(rdb file to redis cluster)

[source]
type: rdb file
servers:
 - /data/redis/dump1.rdb
 - /data/redis/dump2.rdb

[target]
type: redis cluster
servers:
 - 127.0.0.1:7379

[common]
listen: 0.0.0.0:8888
step: 2
mbuf_size: 512
source_safe: false

(5)保存redis集群的数据到.rdb(redis cluster to rdb file)

[source]
type: redis cluster
servers:
 - 127.0.0.1:7379

[target]
type: rdb file

[common]
listen: 0.0.0.0:8888
source_safe: true

(6)从.aof文件导入数据到redis集群(aof file to redis cluster)

[source]
type: aof file
servers:
 - /data/redis/appendonly1.aof
 - /data/redis/appendonly2.aof

[target]
type: redis cluster
servers:
 - 127.0.0.1:7379

[common]
listen: 0.0.0.0:8888
step: 2

(7)从redis集群迁移数据到单一实例(redis cluster to single)

[source]
type: redis cluster
servers:
 - 127.0.0.1:8379

[target]
type: single
servers:
 - 127.0.0.1:6379

[common]
listen: 0.0.0.0:8888

(8)从单一实例迁移数据到redis集群(single to redis cluster)

[source]
type: single
servers:
 - 127.0.0.1:6379

[target]
type: redis cluster
servers:
 - 127.0.0.1:7379

[common]
listen: 0.0.0.0:8888

监听redis-migrate-tool

可以使用redis-cli连接工具,监听地址和端口设置在配置文件的[common]下的listen,默认为127.0.0.1:8888

1. info指令

$redis-cli -h 127.0.0.1 -p 8888
127.0.0.1:8888> info
# Server
version:0.1.0                                   # 工具的版本号
os:Linux 2.6.32-573.12.1.el6.x86_64 x86_64      # 操作系统信息
multiplexing_api:epoll                          # 多路复用接口
gcc_version:4.4.7                               # gcc版本
process_id:9199                                 # 工具的进程id
tcp_port:8888                                   # 工具监听的tcp端口号
uptime_in_seconds:1662                          # 工具运行的时间(秒)
uptime_in_days:0                                # 工具运行的时间(天)
config_file:/ect/rmt.conf                       # 工具运行的配置文件名称

# Clients
connected_clients:1                             # 当前连接的客户端数
max_clients_limit:100                           # 客户端同时连接最大限制
total_connections_received:3                    # 至今总共连接

# Memory
mem_allocator:jemalloc-4.0.4

# Group
source_nodes_count:32                          # 源redis组的节点数
target_nodes_count:48                          # 目的redis组的节点数

# Stats
all_rdb_received:1                             # 是否已接收源redis组节点的所有.rdb文件
all_rdb_parsed:1                               # 是否已解析源redis组节点的所有.rdb文件
all_aof_loaded:0                               # 是否已加载源redis组节点的所有.aof文件
rdb_received_count:32                          # 已接收的源redis组节点.rdb文件数
rdb_parsed_count:32                            # 已解析的源redis组节点.rdb文件数
aof_loaded_count:0                             # 已加载的源redis组节点.aof文件数
total_msgs_recv:7753587                        # 从源组节点接收的所有消息数
total_msgs_sent:7753587                        # 所有已发送目标节点并且收到的响应的消息数
total_net_input_bytes:234636318                # 从源组接收的输入字节的总数
total_net_output_bytes:255384129               # 已发送到目标组的输出字节的总数
total_net_input_bytes_human:223.77M            # 同total_net_input_bytes,而是转换成人类可读的。
total_net_output_bytes_human:243.55M           # 同total_net_output_bytes,而是转换成人类可读的。
total_mbufs_inqueue:0                          # 来自源组的mbufs输入缓存的命令数据(不包括rdb数据)
total_msgs_outqueue:0                          # 将被发送到目标组,和已被发送到目标,但正在等待响应的消息数
127.0.0.1:8888>

2. shutdown [seconds|asap]

执行指令后的行为:

参数:

例如,

$ redis-cli -h 127.0.0.1 -p 8888
127.0.0.1:8888> shutdown 5
OK
(5.00s)

总结

原文链接

上一篇下一篇

猜你喜欢

热点阅读