再来看代理层解决方案会面临哪些问题:
- 代理的性能怎么样,代理本身的延时高不高?
- 我司现有Redis架构基本都是Sentinel模式的,代理层解决方案每接入一个同步任务就需要重新调整Redis架构和网络,对运维同学不太友好
- 代理层解决方案同样面临同步写其他机房还是异步写其他机房,写其他机房失败怎么处理的问题 。
- 开源界的Redis代理项目基本都不是基于java语言的,对于我们团队来说二次开发的难度较大 。
接下来看看如果我们从服务端侧解决,会面临哪些问题:
- 我们需要解析到客户端的指令
- 需要解决同步回环问题:A -> B -> A
四、实现细节
本节会详细介绍一些具体问题的解决方案 。
4.1 网络架构
我司在网络层用双机房双向VPN隧道打通局域网,北京到上海的网络延时稳定在30ms左右 。这样我们的Redis节点就不需要暴露在公网,数据安全这块就不需要考虑了 。
4.2 同步回环
同步回环是指同一条指令在两个Redis节点重复执行,看系统架构图的下面一截:图4-2
![禧云Redis跨机房双向同步实践](http://img.jiangsulong.com/220409/00193T611-2.jpg)
文章插图
图4-2
如果不对同步指令加任何干预,业务写的一条指令会在A、B两个机房的Redis节点上无限循环执行:
- 业务系统在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机房
要提高吞吐量我们首先需要知道性能瓶颈在哪 。从上面处理回环同步的问题我们可以看到,同步流程中存在两处需要业务Redis交互:
- Rotter收到同步指令之后需要在本机房执行del circle-key-md5来判断当前指令是否为循环指令
- Rotter将同步指令和circle-key-md5写入另一机房Redis
多线程:
引入多线程的同时会引入另外一个问题:如何保证指令的顺序性?
顺序性的保证在同步回环校验阶段和跨机房写入阶段略有不同 。
同步回环阶段我们只要得到指令是否为回环指令就行,和各指令之间校验的顺序没关系,但需要保证在往下一环节发送的时候是有序的 。所以我们是采用线程队列实现的 。关键代码如下 :
……
写目标机房阶段我们需要严格保证执行顺序,假如业务系统执行两条指令set a 1和del a,如果同步时执行顺序反了,会对业务系统产生不可预估的后果 。但如果是两个不同的key,大部分场景下是可以交换执行顺序的 。
所以我们自己实现了一个简单的有序线程池,对同步的key取hash后再取mod,mod值相同的指令放在同一线程执行,这样就保证了同一个key的执行顺序一定是有序的 。同时我们还支持将指定的key分配到同一个线程执行,满足业务系统存在key之间相互依赖的场景 。
Pipeline:
通过redis pipeline批量执行指令能够大量的减少Rotter和Redis的交互次数,但也会带来一个问题:不能将指令阻塞在pipeline中太久而增加同步延时,所以我们需要另外一个线程来触发提交pipeline数据,目前Rotter采取的策略是每100条或者10ms发送一次 。
推荐阅读
- 海门树勋镇,千亩金银花基地促推农业新跨越
- 茶产业大发展助推遵义实现经济大跨越
- 乐山,发展峨眉山茶 助推农业大跨越
- Windows下php安装redis扩展
- 2022五一能去跨省去三亚玩吗,五一去三亚是否合适
- 品牌兴茶 实现茶企跨越式发展
- Redis消息队列:RPOPLPUSH vs Pub/Sub
- 单向 mysql:Otter跨机房数据同步
- 保靖,中国黄金茶之乡的茶业跨越式发展
- 福建上杭蛟潭村,高山种茶推进跨越式发展