最近在作Redis数据迁移,网上找了两款开源的Redis迁移工具。mysql
第一种:redis-portgit
Codis官方提供的一个工具,redis-port是一个Redis工具,经过解析rdb文件,实现Redis主节点和从节点的数据同步,我具体没有测试过。github
简单来讲,redis-port就是把自已假装成slave,欺骗master来达到数据流同步的目地。redis
发送sync命令->接收rdb->解析rdb->过滤->回放rdb->回放master推送的同步数据算法
上面是原理流程,很是容易理解,解析完rdb后的每一步均可以高度定制。DBA看着是否是很熟悉? 很是像淘宝的canal,基于binlog作数据的增量消费。相比mysql replication的原理redis简单太多,增量的数据就是普通的命令,须要解析的只有rdb文件。sql
Github地址:https://github.com/CodisLabs/redis-port后端
第二种:redis-migrate-tool安全
redis-migrate-tool(简称RMT)是惟品会开源的redis数据迁移工具,主要用于异构redis集群间的数据在线迁移,即数据迁移过程当中源集群仍能够正常接受业务读写请求,无业务中断服务时间。这篇blog主要内容包括工具特性简介、使用方法以及注意的要点。关于实现的原理,能够自行阅读源码理解。bash
Github地址:https://github.com/vipshop/redis-migrate-tool服务器
下面以rmt为例,进行数据迁移演示。
支持下面几种异构集群之间的数据迁移和同构集群扩容/缩容。
1)redis<–>twemproxy/redis cluster迁移;
2)twemproxy<–>twemproxy/redis cluster迁移;
3)redis cluster<–>twmeproxy/redis cluster迁移。
当目标集群是Twemproxy,数据会跳过Twemproxy直接导入到后端的redis。
RMT启动后模拟成redis slave,请求master的全量数据和增量数据。RMT收到数据以后解析成redis协议格式的oplog(写操做),而后发送给目标集群。有两种请求方式,source_safe: true,对于同一ip上的redis,逐个的请求全量数据(RDB);source_safe: false,并行请求同步全量数据。source_safe: false时,须要注意多个源redis所在的同一主机是否有足够的内存 和 RDB 并发落盘时的 IOPS 性能。
若是在线集群数据所有丢失,不要慌,RMT能够帮你从备份的AOF和RDB文件恢复到目标集群。
能够过滤算法上不属于源集群的脏数据,好比有人绕过twemproxy,非正常方式直接向后端redis写入数据。还能够在配置文件[common]中使用filter参数,过滤掉不须要的数据。
$ yum install automake libtool autoconf bzip2 -y $ git clone https://github.com/vipshop/redis-migrate-tool $ cd redis-migrate-tool $ autoreconf -fvi $ ./configure $ make
$ src/redis-migrate-tool -h 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: 1048576 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.
运行方式
$ src/redis-migrate-tool -c rmt.conf -o log -d
RMT工具可使用命令行运行,也能够支持配置文件。
RMT的配置主要由三部分组成,数据源[source],目标集群[target],通用配置部分[common]。
type
[source]支持五种数据类型,如:single、twemproxy、redis cluster、rdb file、aof file;[target]中的type支持:single、twemproxy、cluster、rdb fil四种类型。
RMT对源集群的类型并不敏感,对每一个redis节点假装成一个slave。于是twemproxy和cluster集群,可使用single和cluster类型。建议配置成对应的twemproxy或者cluster类型。有两方面做用:
1)RMT在数据迁移时,能够根据 twemproxy(hash)或者cluster(slots)数据分布规则,过滤掉本来不属于该节点的数据;
2)当源集群类型是cluster时,只用配置一个节点,简化配置。
目标集群,由于不一样数据分布规则须要执行不一样的写入逻辑,于是配置很是严谨。对于twemproxy集群,必须设置hash、distribution、servers等参数,而且迁移到目标集群的server配置须要和twemproxy中保持一致,包括hash算法、数据分布算法、节点的ip和port、权重、节点的名字。
servers
设置集群节点IP和端口。若是[source]或[target]是redis cluster,那么节点IP能够写一个或多个都行,若是[source]或[target]有一方是twemproxy,那么就须要填写全部节点IP;若是[source]或[target]双方都是twemproxy,那么双方的IP节点数必定是相同的,包括hash算法、数据分布算法、权重、节点的名字。
redis_auth
Redis server若是开启了认证,那么这里须要配置其密码。
timeout
Redis server的读写超时时间,单位毫秒,默认120秒。
hash
若是[source]或[target]有任意一方是twemproxy集群,那么就须要指定其hash算法,md五、fnv1_6四、fnv1a_6四、fnv1_3二、fnv1a_3二、hsieh、murmur、jenkins。
hash_tag
若是[source]或[target]有任意一方是twemproxy集群,那么能够为其key指定tag,也能够忽略。
distribution
若是[source]或[target]有任意一方是twemproxy集群,须要指定key的分布式模式,通常有三种:ketama、modula、random。
listen
RMT自己监听的地址和端口,默认127.0.0.1:8888。
max_clients
RMT最大的客户端链接数。
threads
设置RMT线程数。
step
用于解析请求步骤,数值越高,越快迁移,可是占用内存更大。默认为1。
mbuf_size
RMT buffer大小设置,默认512M。
noreply
一个布尔值,用来定义是否要检查目标主机组确认信息,默认为false。
source_safe
用于保护源主机组内存安全的,运行此工具以前,请确保您的源Redis的机器有足够的内存容许至少一个Redis生成rdb文件。若是您的源机器内存容许全部Redis一次生成rdb文件,您能够设置 ‘source_safe︰ false‘在rmt.conf配置文件中,默认这个值为true,将会使用较少的线程。
dir
设置工做目录,默认当前目录。
filter
过滤匹配这个模式的key,默认为NULL。
配置文件示例:
一、从redis cluster集群迁移数据到twemproxy集群
[source] type: redis cluster servers: - 127.0.0.1:6379 [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:34345 threads: 8 step: 1 mbuf_size: 512 source_safe: true
二、从redis cluster集群迁移数据到另一个redis cluster集群
[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
三、从rdb文件恢复数据到redis cluster集群
[source] type: rdb file servers: - /data/redis/dump1.rdb - /data/redis/dump2.rdb - /data/redis/dump3.rdb [target] type: redis cluster servers: - 127.0.0.1:7379 [common] listen: 0.0.0.0:8888
四、迁移状态查看
使用redis-cli能够链接 rmt.conf 中配置的端口,执行info命令,就能够观察迁移的状态。
total_msgs_outqueue能够判断是否有oplog在队列中等待处理,若是total_msgs_outqueue>0,请继续等待。
$ redis-cli -h 127.0.0.1 -p 8888 info
五、数据校验:当数据迁移完成后,就能够进行数据迁移后的检查操做
$ 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
在业务切换到目标服务器以前,可以使用RMT抽样检查数据的一致性,默认抽样1000个key。
也能够指定检查多少个key,以下:
$ src/redis-migrate-tool -c rmt.conf -o log -C "redis_check 2000"
六、如何完成业务切换?
若是是异构集群的迁移,更改redis驱动/客户端和修改代码,从新发布是必然的事情。若是是同构集群,作配置发布就能够。若是没有作重启发布,等待源集群没有链接以后,能够关闭RMT进程(kill)。或者重启应用,强制断开长链接。
一、重要的事说三遍,RMT迁移数据到twemproxy,须要保持rmt.conf 中 [target] hash、distribution、servers 三个参数和目标集群的twemproxy配置严格一致。
二、迁移中和业务切换以前,请反复观察“-o rmt.log”日志信息,确认是否有异常。
三、业务切换以前,请充分检查,特别是数据的一致性。
四、RMT 建议部署在单独空闲机器上,同目的集群在同一个网段(跨机房迁移数据,能够提升迁移速度)。千万不要部署在源集群所在的机器,防止资源不足,好比内存,带宽,IOPS。
五、注意RDB传输是否超时。
六、redis client buf中的slave项,设置足够大的buffer size和超时时间。
1)redis cluster <–> redis迁移
环境以下:
$ ll /data/redis/ # 单实例; drwxr-xr-x 6 root root 48 Dec 21 15:38 6379 # source集群; drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6551 drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6552 drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6553 drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6554 drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6555 drwxr-xr-x 6 root root 65 Mar 15 13:18 cluster-6556 # target集群; drwxr-xr-x 6 root root 101 Mar 15 15:57 cluster-7551 drwxr-xr-x 6 root root 101 Mar 15 15:57 cluster-7552 drwxr-xr-x 6 root root 101 Mar 15 15:57 cluster-7553 drwxr-xr-x 6 root root 101 Mar 15 13:59 cluster-7554 drwxr-xr-x 6 root root 101 Mar 15 13:59 cluster-7555 drwxr-xr-x 6 root root 101 Mar 15 13:59 cluster-7556 # rmt配置文件; -rw-r--r-- 1 root root 148 Mar 15 15:56 rmt.conf
具体集群配置启动本身搞定了。
rmt配置文件信息以下:
[source] type: redis cluster servers: - 10.99.73.11:6551 [target] type: redis cluster servers: - 10.99.73.11:7551 [common] listen: 0.0.0.0:8888 threads: 8 step: 1 mbuf_size: 512 source_safe: true
[source]集群创造数据
#!/bin/bash # for i in `seq 1 1000`;do redis-cli -c -p 6551 set pkey"$i" "$i" redis-cli -c -p 6551 hset hkey"$i" "$i" "$i" done
$ redis-cli -c -p 6551 127.0.0.1:6551> DBSIZE (integer) 671 $ redis-cli -c -p 6552 127.0.0.1:6552> DBSIZE (integer) 668 $ redis-cli -c -p 6553 127.0.0.1:6553> DBSIZE (integer) 661
开始迁移:
$ ./src/redis-migrate-tool -c /data/redis/rmt.conf -o log -d
查看迁移效果:
$ redis-cli -p 7551 127.0.0.1:7551> DBSIZE (integer) 671 $ redis-cli -p 7552 127.0.0.1:7552> DBSIZE (integer) 668 $ redis-cli -p 7553 127.0.0.1:7553> DBSIZE (integer) 661
2)redis cluster <–> redis迁移
配置文件信息以下:
[source] type: redis cluster servers: - 10.99.73.11:6551 [target] type: single servers: - 10.99.73.11:6379 [common] listen: 0.0.0.0:8888 threads: 8 step: 1 mbuf_size: 512 source_safe: true
开始迁移:
./src/redis-migrate-tool -c /data/redis/rmt.conf -o log -d
查看迁移效果:
$ redis-cli -p 6379 127.0.0.1:6379> DBSIZE (integer) 2000
到此MTR迁移工具测试基本完毕,下一步就是上生产了,更多功能本身尝试。