一、热备Redis集群搭建

1、升级备机房redis集群版本,清除数据
2、创建主->备复制(同步所有流量到备集群)
3、切换nginx,停止一半服务流量B,修改配置,B连接到备机房redis集群
4、切换nginx,将流量切换到备redis服务B
5、修改主机房redis版本并启动,并将备机房数据同步到主机房redis ;
6、切换nginx,将流量切回到主机房redis,
7、停止连接备机房redis服务,修改配置到主机房redis,启动服务;
8、切换nginx,连接到所有服务上。
9、清理备机房redis数据,创建主->备复制

二、redis数据同步

数据同步采用Redis-Shake进行同步。
Redis-shake是一个基于golang语言开发的,用于在两个redis之间同步数据的工具,满足用户非常灵活的同步、迁移需求。
支持redis standalone、cluster、sentinel、proxies之间的数据迁移,

1、功能

  • 恢复restore:将RDB文件恢复到目的redis数据库。
  • 备份dump:将源redis的全量数据通过RDB文件备份起来。
  • 解析decode:对RDB文件进行读取,并以json格式解析存储。
  • 同步sync:支持源redis和目的redis的数据同步,支持全量和增量数据的迁移,支持从云下到阿里云云上的同步,也支持云下到云下不同环境的同步,支持单节点、主从版、集群版之间的互相同步。需要注意的是,如果源端是集群版,可以启动一个RedisShake,从不同的db结点进行拉取,同时源端不能开启move slot功能;对于目的端,如果是集群版,写入可以是1个或者多个db结点。
  • 同步rump:支持源redis和目的redis的数据同步,仅支持全量的迁移。采用scan和restore命令进行迁移,支持不同云厂商不同redis版本的迁移。

2、原理

redis-shake的基本原理就是模拟一个从节点加入源redis集群,首先进行全量拉取并回放,然后进行增量的拉取(通过psync命令)。

redis集群容灾 redis容灾方案_数据同步


如果源端是集群模式,只需要启动一个redis-shake进行拉取,同时不能开启源端的move slot操作。如果目的端是集群模式,可以写入到一个结点,然后再进行slot的迁移,当然也可以多对多写入。

参考文档:

redis-shake数据同步&迁移工具

三、redis数据校验

数据同步后,通过redis-full-check校验工具。
支持:单节点、主从版、集群版、带proxy的云上集群版(阿里云)之间的同构或者异构对比,版本支持2.x-5.x。

1、原理

redis集群容灾 redis容灾方案_数据同步_02


 redis-full-check通过全量对比源端和目的端的redis中的数据的方式来进行数据校验,其比较方式通过多轮次比较:每次都会抓取源和目的端的数据进行差异化比较,记录不一致的数据进入下轮对比(记录在sqlite3 db中)。然后通过多伦比较不断收敛,减少因数据增量同步导致的源库和目的库的数据不一致。最后sqlite中存在的数据就是最终的差异结果。

  redis-full-check对比的方向是单向:抓取源库A的数据,然后检测是否位于B中,反向不会检测,也就是说,它检测的是源库是否是目的库的子集。如果希望对比双向,则需要对比2次,第一次以A为源库,B为目的库,第二次以B为源库,A为目的库。