![Redis 多主复制](https://linux22.com/image/665638/Redis%20%E5%A4%9A%E4%B8%BB%E5%A4%8D%E5%88%B6.png)
场景:我们有两个同时运行的数据中心(均提供流量)。
每个数据中心都有自己的整个基础设施堆栈,因此可以在另一个数据中心不运行的情况下运行。
话虽如此,当网络条件允许时,我们希望我们的 Redis 数据库在两者之间同步。在网络分区期间丢失密钥是可以接受的,拥有重复密钥也是可以接受的 - 这只是缓存数据。但是,当两个数据中心都正常运行时,我们从缓存中获得的收益最大(从 15-20% 的缓存命中率到 30-40% 的缓存命中率)。
经过一番搜索,我找不到任何可以有效提供多主机的东西。(大部分都是说“不要这样做”或“不支持”)。
最后,我编写了一个客户端,连接到两个主服务器,订阅数据库的键空间事件,然后在数据库之间推送所有 SET 命令(所有键都设置了过期时间) - 使用一些内部“最近看到”的缓存来防止重放循环。
目前,这种方法效果很好 - 唯一真正的缺点是,在我们收到新的密钥事件后,我们必须发出 GETEX 来获取密钥及其到期时间 - 因此您最终需要进行第二次读取(因此远程 DC 的 RTT 延迟约为 2 倍)。它也仅限于支持 SET。
我的问题是:有没有更好的方法来实现这种多主复制?
我开始研究 SYNC/PSYNC,但这些协议的文档并不多,而且不确定客户端需要承担哪些义务才能不破坏服务器。
答案1
我也在寻找解决这一挑战的方法,到目前为止,我发现: https://github.com/Netflix/dynomite/wiki/Architecture 有可能... https://github.com/CodisLabs/codis或者https://github.com/twitter/twemproxy