文档章节

Redis异构集群之间数据迁移方案

IT--小哥
 IT--小哥
发布于 10/23 20:20
字数 2981
阅读 89
收藏 9

一、Redis集群迁移工具

最近在做Redis数据迁移,网上找了两款开源的Redis迁移工具。

第一种:redis-port

Codis官方提供的一个工具,redis-port是一个Redis工具,通过解析rdb文件,实现Redis主节点和从节点的数据同步,我具体没有测试过。

简单来说,redis-port就是把自已伪装成slave,欺骗master来达到数据流同步的目地。

发送sync命令->接收rdb->解析rdb->过滤->回放rdb->回放master推送的同步数据

上面是原理流程,非常容易理解,解析完rdb后的每一步都可以高度定制。DBA看着是不是很熟悉? 非常像淘宝的canal,基于binlog做数据的增量消费。相比mysql replication的原理redis简单太多,增量的数据就是普通的命令,需要解析的只有rdb文件。

Github地址https://github.com/CodisLabs/redis-port

第二种:redis-migrate-tool

redis-migrate-tool(简称RMT)是唯品会开源的redis数据迁移工具,主要用于异构redis集群间的数据在线迁移,即数据迁移过程中源集群仍可以正常接受业务读写请求,无业务中断服务时间。这篇blog主要内容包括工具特性简介、使用方法以及注意的要点。关于实现的原理,可以自行阅读源码理解。

Github地址:https://github.com/vipshop/redis-migrate-tool

下面以rmt为例,进行数据迁移演示。

二、redis-migrate-tool特性

  • 快速,多线程
  • 支持异构迁移,如支持Twemproxy集群,redis cluster集群,rdb文件和aof文件相互迁移

支持下面几种异构集群之间的数据迁移和同构集群扩容/缩容。

1)redis<–>twemproxy/redis cluster迁移;

2)twemproxy<–>twemproxy/redis cluster迁移;

3)redis cluster<–>twmeproxy/redis cluster迁移。

当目标集群是Twemproxy,数据会跳过Twemproxy直接导入到后端的redis。

  • 在线迁移,基于redis复制做到实时迁移,并且迁移过程中,源集群不影响对外提供服务

RMT启动后模拟成redis slave,请求master的全量数据和增量数据。RMT收到数据之后解析成redis协议格式的oplog(写操作),然后发送给目标集群。有两种请求方式,source_safe: true,对于同一ip上的redis,逐个的请求全量数据(RDB);source_safe: false,并行请求同步全量数据。source_safe: false时,需要注意多个源redis所在的同一主机是否有足够的内存 和 RDB 并发落盘时的 IOPS 性能。

  • 从AOF或RDB恢复数据

如果在线集群数据全部丢失,不要慌,RMT可以帮你从备份的AOF和RDB文件恢复到目标集群。

  • 数据过滤

可以过滤算法上不属于源集群的脏数据,比如有人绕过twemproxy,非正常方式直接向后端redis写入数据。还可以在配置文件[common]中使用filter参数,过滤掉不需要的数据。

  • 迁移状态显示

三、redis-migrate-tool安装

$ 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

四、redis-migrate-tool配置

RMT工具可以使用命令行运行,也可以支持配置文件。

RMT的配置主要由三部分组成,数据源[source],目标集群[target],通用配置部分[common]。

  • source or target

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算法,md5、fnv1_64、fnv1a_64、fnv1_32、fnv1a_32、hsieh、murmur、jenkins。

hash_tag

如果[source]或[target]有任意一方是twemproxy集群,那么可以为其key指定tag,也可以忽略。

distribution

如果[source]或[target]有任意一方是twemproxy集群,需要指定key的分布式模式,一般有三种:ketama、modula、random。

  • common

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。

配置文件示例:

1、从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

2、从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

3、从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

4、迁移状态查看

使用redis-cli可以连接 rmt.conf 中配置的端口,执行info命令,就可以观察迁移的状态。

total_msgs_outqueue可以判断是否有oplog在队列中等待处理,如果total_msgs_outqueue>0,请继续等待。

$ redis-cli -h 127.0.0.1 -p 8888 info

5、数据校验:当数据迁移完成后,就可以进行数据迁移后的检查操作

$ 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"

6、如何完成业务切换?

如果是异构集群的迁移,更改redis驱动/客户端和修改代码,重新发布是必然的事情。如果是同构集群,做配置发布就可以。如果没有做重启发布,等待源集群没有连接之后,可以关闭RMT进程(kill)。或者重启应用,强制断开长连接。

五、注意事项

1、重要的事说三遍,RMT迁移数据到twemproxy,需要保持rmt.conf 中 [target]  hash、distribution、servers 三个参数和目标集群的twemproxy配置严格一致。

2、迁移中和业务切换之前,请反复观察“-o rmt.log”日志信息,确认是否有异常。

3、业务切换之前,请充分检查,特别是数据的一致性。

4、RMT 建议部署在单独空闲机器上,同目的集群在同一个网段(跨机房迁移数据,可以提高迁移速度)。千万不要部署在源集群所在的机器,防止资源不足,比如内存,带宽,IOPS。

5、注意RDB传输是否超时。

6、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迁移工具测试基本完毕,下一步就是上生产了,更多功能自己尝试。

本文转载自:http://www.ywnds.com/?p=8519

共有 人打赏支持
IT--小哥
粉丝 47
博文 118
码字总数 90243
作品 0
东城
数据库管理员
私信 提问
初学乍练redis:使用redis-migrate-tool做redis在线数据迁移

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/84138537 目录 一、问题提出 二、关于redis-migrate-tool 三、实验 1. 建议集群red...

wzy0623
11/16
0
0
Redis ​集群迁移工具--Redis-Migrate-Tool

Redis 集群迁移工具,基于redis复制,快速,稳定。 github链接:https://github.com/vipshop/redis-migrate-tool 特点: 快速。 多线程。 基于redis复制。 实时迁移。 迁移过程中,源集群不影...

d_e_e_p_
2016/04/06
8.4K
3
Redis复制与可扩展集群搭建

edis的复制功能是完全建立在之前我们讨论过的基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生,那么首先要...

袁跃平
2013/01/21
0
0
如何基于MySQL及Redis搭建统一的KV存储服务

本文介绍基于MySQL及Redis搭建统一的kv存储服务:常用部署方式及其特点,Cluster manager,MySQL和Redis集群方案,以及Sync数据同步服务。 一、MySQL+Redis 常用部署方式 1.1 拓扑 1.2 特点 ...

烂猪皮
04/22
0
0
Redis的复制功能以及Redis复制机制本身的优缺点以及集群搭建问题

Redis复制流程概述 Redis的复制功能是完全建立在之前我们讨论过的基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了 Redis的复制功能,就一定会有内存...

夕阳红树林
2012/06/18
0
1

没有更多内容

加载失败,请刷新页面

加载更多

添加并发

<!-- 认购线程池,支持最大并发送10 最大排队队列为一万--> <task:executor id="investBuyPool" pool-size="1-10" queue-capacity="10000"/> 方法添加注解@Async("investBuyPool")......

一夜
21分钟前
2
0
Gensim?

Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法,支持流式训...

火力全開
34分钟前
3
0
图片验证码

图片验证码,线上登录是最常见的场景,也有发送手机验证码之前进行图片验证码的验证。 图片验证码很大程度上防止机器人撞库登录或频繁发起短信验证码从而使系统暂时性"瘫痪"。 以下是项目中用...

貔貅叔
37分钟前
5
0
科班出身程序员和培训出来的程序员区别在哪?

科班出身只是代表你要从事的职业和你的专业是一致的,代表着你具备了得天独厚的优势,至于是不是优势看你上班好不好学,平时逃课没,上班是认真听还是玩手机。一般而言科班出来的理论性比较强...

java菜分享
38分钟前
5
0
java框架学习日志-8(AOP简介)

小王被委托开发一款游戏,程序分为启动页面,登陆页面,战斗页面等。小王就采用了面向对象编程思想(OOP),把整个程序分解成下图 这种就是传统的自上而下的编程,或者说纵向的编程,负责启动...

白话
38分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部