禧云Redis跨机房双向同步实践
编者荐语:
2019年4月16日跨机房Redis同步中间件(Rotter)上线,团餐率先商用:
以下文章来源于云纵达摩院 ,作者杨海波
禧云信息/研发中心/杨海波 20191115
关键词:Rotter,Redis,多活,跨机房,同步
一、项目介绍
1.1 系统架构
- 控制台Manager
- 节点发现和数据传输层(ZK+Redis)
- 数据同步层Rotter
- Manager负责任务配置、数据展示、监控报警等,各机房独立部署;
- ZK为跨机房集群,A机房为Leader节点,B机房为Follow节点。ZK在方案中负责Rotter节点的注册发现和任务调度。
- 多活Redis在方案中扮演数据队列的角色,降低了Manager和Rotter节点之间的耦合度。
- Rotter是Redis同步任务的执行者,包含replicator和sync两个角色。
- replicator是国人开源的基于java语言的redis主从协议实现者redis-replicator,负责解析redis节点指令。
- sync负责redis指令跨机房写入,处理同步回环,同步指令监控等。
1.2 同步流程
- ParseEventFilter:格式化同步指令;生成指令回环校验key;赋值指令所属DB;过滤Rotter自身产生的指令
- DBFilter:过滤掉不需要同步的DB
- KeyFilter:过滤掉不需要同步的KEY
- CircleSyncFilter:过滤掉回环指令和删除保护指令
- MultiThreadFilter:多线程分发,提高同步效率
- OvertimeFilter:经过队列积压,判断该指令是否已经过期
- DeleteKeyFilter:生成删除保护KEY
- RateLimitFilter:限流,包括带宽和指令数
- SendTargetFilter:执行目标redis写入
- MonitorFilter:监控和上报正在同步的指令
- ComputeRateFilter:计算同步速率、带宽、队列积压长度等
二、背景&目标
2.1 背景
2.2 目标
- 零侵入:业务系统不需要做任何改造就能接入
- 高吞吐量:基于现有业务峰值TPS乘以10,得出TPS要达到1万
- 低延时:我司的多活业务不会出现跨机房读取数据的情况,所以定的目标延时低于1s。实际情况延时在50ms左右
- 高堆积能力:基于跨机房网络的不确定性,当网络闪断时能够保证指令不丢失
- 高可用性:当网络故障或者Redis宕机恢复时,同步任务能自动恢复
- 可配置性:业务系统可以自由定制需要同步哪些Key
三、技术选型
- 我们需要提供一套统一的工具包,为每个指令提供一个是否需要同步到另一机房的参数;
- 我们可能还需要为工具包提供同步写另一机房还是异步写另一机房的参数;
- 写另一机房失败本机房数据是否需要回滚?
- 现在java业务系统使用jedis和redisson都有,适配难度大,且不利于客户端版本升级
- 代理的性能怎么样,代理本身的延时高不高?
- 我司现有Redis架构基本都是Sentinel模式的,代理层解决方案每接入一个同步任务就需要重新调整Redis架构和网络,对运维同学不太友好
- 代理层解决方案同样面临同步写其他机房还是异步写其他机房,写其他机房失败怎么处理的问题。
- 开源界的Redis代理项目基本都不是基于java语言的,对于我们团队来说二次开发的难度较大。
- 我们需要解析到客户端的指令
- 需要解决同步回环问题:A -> B -> A
四、实现细节
4.1 网络架构
4.2 同步回环
- 业务系统在A机房redis-A写入指令 set a 1
- A机房replicator-A作为redis-A的从节点接收到指令set a 1
- rotter-A将指令set a 1写入B机房redis-B
- B机房replicator-B作为redis-B的从节点接收到指令set a 1
- rotter-B将指令set a 1写入A机房redis-A …
- 业务系统在A机房redis-A写入指令 set a 1
- A机房replicator-A作为redis-A的从节点接收到指令set a 1
- rotter-A MD5(set a 1) 得到circle-key-md5,拼装成指令setex circle-key-md5 120 1
- rotter-A将指令setex circle-key-md5 120 1和指令set a 1一起写入B机房redis-B
- B机房replicator-B作为redis-B的从节点接收到指令setex circle-key-md5 120 1 和set a 1
- rotter-B直接忽略circle-key指令
- rotter-B在本机房执行del circle-key-md5,如果成功说明是回环KEY,不需要同步至A机房
4.3 高吞吐量
- Rotter收到同步指令之后需要在本机房执行del circle-key-md5来判断当前指令是否为循环指令
- Rotter将同步指令和circle-key-md5写入另一机房Redis
4.4 高堆积能力
- redisOffset(8字节):存储每条同步指令在复制积压缓冲区的offset,每次重新启动同步任务时可以通过二分查找确定是否需要从磁盘中继续读取指令。
- dataOffset(8字节):存储指定在磁盘文件中的位置
- dataLength(2字节):存储当前指令的长度
五、其他问题
5.1 Rotter连接业务Redis时造成Redis全量dump而影响业务系统
协议名
|
Redis版本
|
原理
|
问题
|
SYNC
|
2.8以下
|
每次都生成RDB文件,复制到slave节点
|
网络秒级抖动都会造成master bgsave,影响服务可用性
|
PSYNC
|
2.8及以上
|
引入复制积压缓冲区,当redis复制中断后,slave上报原master runid + 当前已同步master的offset会尝试批量同步
|
redis slave重启或者 redis master发生故障切换,slave需进行全量重同步。
|
PSYNC2
|
4.0及以上
|
用master_replid1(当前主从复制ID)和master_replid2(上一次主从复制ID)取代了runid,故障切换后master_replid2替换为master_replid1。
|
- slave发送Replication ID, offset到master
- master开启一个进程执行bgsave,生成RDB文件。在此期间所有新的指令都会缓存到当前slave的输出缓冲区中
- master把RDB文件发送到slave
- slave把RDB文件加载到内存
- master把输出缓冲区中的指令增量同步到slave
- 优先连接Redis从节点,减少bgsave对业务的影响
- 配置同步任务时可以选择是否忽略全量dump,当忽略全量dump时,Rotter会通过redis info命令拿到复制积压缓冲区的offset,从最新的位置开始增量同步。
5.2 如何防止Rotter同步反向污染源Redis数据
- 图5-2中第3步Rottor-A将del a指令同步到B机房之前,生成删除保护指令setex rotter:delete:a 120 1,将这两条指令都写入redis-B
- 图5-2中第6步Rotter-B同步指令set a oldValue先执行 exists rotter:delete:a,返回成功判定key a是刚被删除的,不会同步A机房
六、参考资料
禧云Redis跨机房双向同步实践的更多相关文章
- 原生Redis跨数据中心双向同步优化实践
一.背景 公司基于业务发展以及战略部署,需要实现在多个数据中心单元化部署,一方面可以实现多数据中心容灾,另外可以提升用户请求访问速度.需要保证多数据中心容灾或者实现用户就近访问的话,需要各个数据中心拥 ...
- 传统业务上云:跨AZ容灾架构解析
本文由 网易云发布. 数字化转型浪潮之下,采用云计算服务提升业务敏捷性.降低运维成本,成为了传统企业的优选方案.网易云资深解决方案架构师张亮通过某物流企业客户的实际案例,分享了传统业务系统在云上的架 ...
- redis跨实例迁移 & redis上云
1)redis跨实例迁移--源实例db11迁移至目标实例db30 root@fe2e836e4470:/data# redis-cli -a pwd1 -n 11 keys \* |while rea ...
- Redis 数据恢复方法,redis-port 工具将自建 redis 的 rdb文件同步到云数据库
1. Redis 恢复的机制 如果只配置 AOF ,重启时加载 AOF 文件恢复数据: 如果同时配置了 RDB 和 AOF ,启动是只加载 AOF 文件恢复数据: 如果只配置 RDB,启动是将加载 d ...
- 转: 微博的多机房部署的实践(from infoq)
转: http://www.infoq.com/cn/articles/weibo-multi-idc-architecture 在国内网络环境下,单机房的可靠性无法满足大型互联网服务的要求,如机房 ...
- 深度解析双十一背后的阿里云 Redis 服务
摘要: Redis是一个使用范围很广的NOSQL数据库,阿里云Redis同时在公有云和阿里集团内部进行服务,本文介绍了阿里云Redis双11的一些业务场景:微淘社区之亿级关系链存储.天猫直播之评论商品 ...
- Redis哨兵模式主从同步不可以绑定127.0.0.1或者0.0.0.0,不然无法进行主从同步
Redis哨兵模式主从同步不可以绑定127.0.0.1或者0.0.0.0,不然无法进行主从同步,一定要绑定内网IP,而对于跨机房的问题,可以使用iptables进行nat转发来解决.
- Linux实战教学笔记48:openvpn架构实施方案(一)跨机房异地灾备
第一章VPN介绍 1.1 VPN概述 VPN(全称Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信网络的技术,可以为企业之间或者 ...
- 线上SpringCloud网关调用微服务跨机房了,咋整?
1.前言 公司内考虑到服务器资源成本的问题,目前业务上还在进行服务的容器化改造和迁移,计划将容器化后的服务,以及一些中间件(MQ.DB.ES.Redis等)尽量都迁移到其他机房. 那你们为什么不用阿里 ...
随机推荐
- ORA-19625: error identifying file
问题描述:rman进行备份的时候,出现报错ORA-19625,无效的文件 1.进行数据库备份,然后就出现了报错,没有这个24号的归档日志 RMAN> run{ 2> allocate ch ...
- jq触发oninput事件
之前一直在用jq的change()方法来处理输入框的值变化事件,以及触发输入框的变化事件. 后来发现change()方法有个弊端,change事件的发生条件是:输入框的值value发生变化,并且输入框 ...
- 聊聊 Python 的内置电池
本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/XzCqoCvcpFJt4A-E4WMqaA (一) 最近,我突然想到一 ...
- Internet History,Technology,and Security - History: Commercialization and Growth(Week4)
Explosive Growth of the Internet and Web The Year of the Web 正如你所知道的,1994年是网络之年.1994年,NCSA的一位员工离职并建立 ...
- Java分布式ID生成解决方案
分布式ID生成器 我们采用的是开源的twitter( 非官方中文惯称:推特.是国外的一个网站,是一个社交网络及微博客服务) 的snowflake算法(推特雪花算法). 封装为工具类,源码如下: p ...
- openldap数据双向同步
配置双主复制功能,在主1和主2上执行均下面的步骤 vim syncprov_mod.ldif dn: cn=module,cn=configobjectClass: olcModuleListcn: ...
- python--推倒式(列表、字典、集合)
python的各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体 ...
- 使用ReentrantLock
/** * java.util.concurrent.locks包提供的ReentrantLock用于替代synchronized加锁* 因为synchronized是Java语言层面提供的语法,所以 ...
- Linux下使用docker 拉取 vsftpd 镜像搭建 Ftp 服务器,连接 Ftp 时遇到的错误(425 Failed to establish connection)
Ftp踩坑系列: Linux上的ftp服务器 vsftpd 之配置满天飞--设置匿名用户访问(不弹出用户名密码框)以及其他用户可正常上传 ftp服务器Serv-U 设置允许自动创建不存在的目录 FTP ...
- 使用 getUserMedia API获取麦克风和相机等流媒体
概览 mediaDevices 是 Navigator 对象的只读属性,一个单列对象,可以连接访问相机和麦克风,屏幕共享等媒体输入设备 方法 enumerateDevices 请求一个可用的媒体输入和 ...