本文整理自 Redis 技术交流群的线上分享活动,有对 Redis 技术感兴趣的朋友可以加群主微信 gnuhpc 加入。
文章主要内容围绕 Redis-replicator 的设计与实现,提纲如下:
-
Redis-replicator 的设计动机
-
Redis-replicator 的设计与实现
-
Redis Replication 的协议简析
-
设计可插拔式 API 以及开发中的取舍
-
总结
首先,有两个材料可能需要大家提前预习一下,以便更轻松地了解此次分享的内容。
-
https://redis.io/topics/protocol
-
https://github.com/leonchen83/redis-replicator/wiki/RDB-dump-data-format
在之前的开发中,经常有如下需求:
-
Redis 数据的跨机房同步
-
异构数据的迁移,比如 Redis 到 MySQL、MQ
Redis 跨机房同步,传统的方式通常采取双写的方式,这样会生产一种非常难以维护的用户代码。稍微好一点的做法是提炼出一个中间层。但也难以保证同时双写成功,因此又需要做复杂的异常处理,这同时也增加了程序的响应时间。
除了双写的方式,还有一种方式是利用 Redis 自身的 Replication 协议,让一台机器成为另一台机器的 slave,用这种方式来同步数据。
这种方式的问题是,双机房中必须有一个是 master,一个是 slave。在切换的过程中,需要作 slave 提升等处理,变相增加了运维难度。而且一般在集群环境中,用户常常期望两个机房各一个独立集群,而不是两个机房组成一个混合集群(这样出问题切换方便些),并且保持两个独立集群之间数据是同步的。
如下图所示:
上面是属于同构数据迁移,再来说说异构数据迁移。现实需求中,有可能会有异构迁移的情况,比如 Redis 每日数据量很大,需要把一些数据以文件或者数据库存储的方式落盘(MySQL、MQ、SSDB 等),每日异地备份等等,如果还是采用双写等方式处理的话,又会有代码扩张、维护困难等上述提过的问题。
如下图所示:
在以上的需求中,催生了我开发 Redis-replicator 的动机。 这个工具完整实现了 Redis Replication 协议,并把 RDB 以及 AOF 解析成一个一个的事件供用户消费,并且支持 Redis4.0 的新特性以及新命令。
如果用 Redis-replicator 来实现上述需求的话,可以不干扰用户态的代码,单独用这个工具实现中间件来进行异构,同构数据同步备份等任务。
如下图所示: