开源啦,Redis 跨集群实时数据同步工具
高可用之殇
正开心地刷着手机,突然 APP 无法使用,正焦急地不知所措时,收到公告:“因施工意外挖断光缆,某某云数据中心故障,导致 APP 服务不可用”。
你是否经历过这种遭遇,或听说别人吐槽过?
在今天的全球化和分布式计算的大环境中,无论是企业级应用、云计算服务还是大规模网络平台,跨数据中心部署变得越来越重要。
那仅仅是将服务部署到多个数据中心就解决问题了吗?服务可以是无状态部署,那么数据呢?跨数据中心访问数据带来的延迟显然会影响用户体验。当今越来越多的服务都用 redis 来存储数据或缓存数据,那么如何将 redis 部署到不同的数据中心,不同数据中心的 redis 又如何进行数据同步,是很多企业必然要面临的问题。
数据是有状态的
我们的服务都进行跨数据中心的部署,避免由于数据中心故障而影响用户的事情发生。我们同样面临跨数据中心数据同步的难题,在经过我们基础架构团队的努力后,自研了一个高可用的跨数据中心实时同步 redis 数据的工具。让有状态的 redis 数据可以在不同的数据中心之间进行同步,服务可以访问最近节点的数据,极大提高了用户体验。
我们的愿景是将工具建设成一个 redis 数据治理的分布式系统,以解决 redis 数据的“水患”问题,所以我们将其取名为“鲧禹”,为了简单起见,我们一般称为“大禹”。
大禹有哪些功能
从产品需求上,对 redis-GunYu 和几个主流工具进行比较
大禹还有哪些优势呢?
对稳定性影响更小
复制优先级:可指定优先从从库进行复制或主库复制
本地缓存 + 断点续传:最大程度减少对源端 redis 的影响
可以对 RDB 中的大 key 进行拆分同步
更低的复制延迟:在保证一致性的前提下,并发地进行数据回放
数据安全性与高可用
本地缓存支持数据校验
工具高可用:支持主从模式,以最新记录进行自主选举,自动和手动 failover;工具本身 P2P 架构,将宕机影响降低到最小
对 redis 限制更少
支持源和目标端不同的 redis 部署方式,如 cluster 或单实例
兼容源和目的 redis 不同版本,支持从 redis4.0 到 redis7.2
数据一致性策略更加灵活,自动切换
当源端和目标端分片信息一致时,采用伪事务方式批量写入,实时更新快照信息,最大可能地保证一致性
当源端和目标端分片不一致时,采用定期更新快照信息
运维更加友好
API:可以通过 http API 进行运维操作,如强制全量复制、同步状态、暂停同步等
监控:监控指标更丰富,如时间与空间维度的复制延迟指标
数据过滤:可以对 key、db、命令等进行过滤
拓扑变化监控:实时监听源和目标端 redis 拓扑变更(如加减节点,主从切换等等),以更改一致性策略和调整其他功能策略
大禹是怎么做数据同步的呢
内部实现可以简单的看成是上图的三个模块。针对每一个源端 redis 的节点,大禹都会有一条对应的 pipeline,每条 pipeline 结构如下:
输入端:伪装成 redis slave,从源端 redis 实例同步数据
通道端:本地缓存
输出端:将数据写入到目标端
大禹也支持高可用部署
大禹节点之间是 P2P 架构,互为主备,每个 pipeline 都会独立地选举缓存数据最新的节点为领导者,由领导者伪装成 redis 从库,从源端 redis 节点同步数据再写到目标端,同时将数据发送到此 pipeline 的跟随者。这种 P2P 结构,可以将工具本身故障的影响降到最低。
行动起来吧
欢迎大家使用大禹,完善大禹,一起将大禹建设成一个完善的数据治理解决方案吧。
源代码地址 : https://github.com/mgtv-tech/redis-GunYu
版权声明: 本文为 InfoQ 作者【楚】的原创文章。
原文链接:【http://xie.infoq.cn/article/071df3028758c291389fd3eff】。文章转载请联系作者。
评论