Redis集群跨机房数据实时同步

一、问题出现

Redis集群本身已经具备高可用特性了,即使其中一个或多个节点挂掉,Redis Cluster会实时故障自动转移。但是如果发生了机房故障(断电、断网等极端情况),如果应用方降级或者容错机制做的不好甚至业务本身不能降级,或者会丢失重要数据,或者可能瞬间会跑满应用的线程池造成服务不可用,对于一些重要的服务来说是非常致命的。


为了应对像机房故障这类情况,保证应用方在这种极端情况下,仍然可以正常服务(系统正常运行、数据正常),所以需要给出一个Redis跨机房的方案。

二、实现思路和方案

1、你可能会想,把节点分散到不同的机房不就可以了吗?这种方案理论上是可以,但是延时会很大,此方案不可行。

2、我试图用主从的方式,A机房的节点去拉取B机房的节点,但是Redis集群模式已经不再支持主从的,单实例确实可以通过主从去同步数据,此方案也不可行。

3、网上搜了一些解决方案,Codis方案虽然在负载和横向动态扩容方面做了优化,但是并没有提供底层数据同步问题,而且也有缺陷(负载不会取最近,延迟最低的实例),我们后续再对codis细说。此方案不可行。

4、如果要自动研发一款底层数据同步,确实比较费劲,需要花费大量的时间成本。

5、很多大型公司有现成的开源工具。比如唯品会的一款开源工具redis-migrate-tool还不错。


redis-migrate-tool 具有以下特点:

快速。

多线程。

基于redis复制。

实时迁移。

迁移过程中,源集群不影响对外提供服务。

异构迁移。

支持Twemproxy集群,redis cluster集群,rdb文件 和 aof文件。

过滤功能。

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

迁移状态显示。

完善的数据抽样校验(-C redis_check)。

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

原理是将源redis的数据复制到目标Redis,且支持多种策略:

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

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

从一个redis集群迁移数据到另一个集群(redis cluster to another redis cluster)

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

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

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

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

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


三、安装

1、先安装依赖

#yum -y install automake libtool autoconf bzip2


2、下载并安装redis-migrate-tool

#mkdir /usr/local/software

#cd /usr/local/software

#git clone https://github.com/tanruixing88/redis-migrate-tool.git

(如果提示git未安装,请先安装git:yum -y install git)

#cd redis-migrate-tool

#autoreconf -fvi

#./configure

#make

#cp src/redis-migrate-tool /usr/local/bin/redis-migrate-tool

Ok,到此安装就算成功了

接下来就算配置文件了(/usr/local/software/ redis-migrate-tool/rmt.conf)

#vim /usr/local/software/ redis-migrate-tool/rmt.conf

修改为以下内容:

[source]

type: redis cluster

servers:

 - 172.16.40.210:7000

 - 172.16.40.210:7001

 - 172.16.40.210:7002

 - 172.16.40.210:7003

 - 172.16.40.210:7004

 - 172.16.40.210:7005


[target]

type: redis cluster

servers:

 - 172.16.54.6:7000

 - 172.16.54.6:7001

 - 172.16.54.6:7002

 - 172.16.54.6:7003

 - 172.16.54.6:7004

 - 172.16.54.6:7005


[common]

listen: 0.0.0.0:8888


3、运行

#/usr/local/bin/redis-migrate-tool -c /usr/local/bin/redis-migrate-tool/rmt.conf -o /usr/local/bin/redis-migrate-tool/log -d

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


4、查看日志,并验证是否启动成功

查看运行日志:

#tail -f /usr/local/bin/redis-migrate-tool/log

输出如下表示启动没问题:


log运行日志

5、数据校验:

#/usr/local/bin/redis-migrate-tool -c /usr/local/software/redis-migrate-tool/rmt.conf -o /usr/local/software/redis-migrate-tool/log -C redis_check


数据校验

5、校验数据同步问题


验证Redis跨机房数据同步

如图可以看出40段机房的Redis集群的数据已经同步到54段机房的Redis集群


6、如果要做跨机房双向同步,则必须在A机房和B机房都安装redis-migrate-tool,修改对应配置文件的源和目标。


四、扩展

1、配置文件(rmt.conf)说明:

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

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

[source]/[target]

type:single:单独的redis实例;twemproxy:twemproxy集群;redis cluster:redis集群;rdb file:.rdb文件;aof file:.aof文件


servers:redis地址组,如果type:twemproxy,则为twemproxy配置文件,如果type:rdb file,则为rdb文件名。


redis_auth:连接redis服务的认证auth。


timeout:读写redis服务的超时时间(ms),默认为120000ms


hash:哈希方法名。仅当type:twemproxy有效。可以为one_at_a_time、md5、crc16、crc32、crc32a、fnv1_64、fnv1a_64、fnv1_32、fnv1a_32、hsieh、murmur、jenkins。


hash_tag:用来哈希的关键key的两个字符,例如"{}" 或 "$$"。仅当type:twemproxy有效。只要标签内的关键key是相同的,能够将不同的键映射到同一服务器。


distribution:键的分布模式。仅当type:twemproxy有效。可以为 ketama、modula、random。

[common]

listen:监听的地址和端口。默认为127.0.0.1:8888


max_clients:可监听端口的最大连接数。默认为100


threads:工具可用的最多线程数。默认为cpu内核数。


step:解析请求的步数。默认为1,数字越大,迁移越快,需要越多的内存。


mbuf_size:请求的缓存大小(M),默认为512M


noreply:是否检查目标组的回复,默认为false


source_safe:是否保护源组机器的内存安全。默认为true,工具将允许在源组的同一台机器同时只有一个redis生成.rdb。


dir:工作目录。用来存储文件,例如rdb文件,默认为当前目录。


filter:过滤不符合表达式的Key,默认为NULL,支持通配符为glob-style风格

         ? :1个任意字符。例如 h?llo 匹配 hello, hallo , hxllo

         * :0个或多个任意字符。例如 h*llo 匹配 hllo , heeeello

         [characters]:匹配任意一个方括号内的字符,比如[abc],要么匹配a,要么匹配b,要么匹配c。例如 h[ae]llo 匹配 hello , hallo, 但不匹配 hillo。

         [^character]:排除方括号内的字符。例如h[^e]llo 匹配 hallo, hbllo, ... 但不匹配 hello。

         [character-character]:表示2个字符范围内的都可以匹配,如[a-z],[0-9]。例如h[a-b]llo 匹配 hallo 和 hbllo。

         \用来转移特殊字符。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,312评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,578评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,337评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,134评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,161评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,303评论 1 280
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,761评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,421评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,609评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,450评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,504评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,194评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,760评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,836评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,066评论 1 257
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,612评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,178评论 2 341

推荐阅读更多精彩内容