场景:我们有两个同时运行的数据中心(都为流量提供服务)。
每个都有自己的整个基础架构堆栈,因此它可以在没有另一个启动的情况下运行。
也就是说,当网络条件允许时,我们希望我们的 Redis 数据库在两者之间同步。在网络分区期间丢失密钥是可以接受的,因为有重复的密钥 - 它只是缓存数据。但是,当两个数据中心都启动时(从 15-20% 的缓存命中率到 30-40% 的缓存命中率),我们从缓存中获得了最大的好处。
经过一番搜索,我找不到任何可以有效地为我们提供多主的东西。(主要是说“不要那样做”或“不支持”)。
最后,我编写了一个客户端,连接到两个主服务器,订阅数据库的键空间事件,然后在 DB 之间推送所有 SET 命令(我们所有的键都设置为过期)-带有一些内部“最近看到”的缓存以防止重播循环。
目前,这很好用 - 唯一真正的缺点是,在我们获得一个新的关键事件之后,我们必须发出一个 GETEX 来获取该密钥并且它已经过期 - 所以你最终会进行第二次读取(因此大约是 2 倍)远程 DC 的 RTT 延迟)。它也仅限于真正支持 SET。
我的问题是:有没有更好的方法来获得这种多主复制?
我开始研究 SYNC/PSYNC,但是关于这些协议的文档并不多,并且不确定客户端可能必须承担哪些义务才能不破坏服务器。
小智 4
我也在寻找应对这一挑战的解决方案,到目前为止,我发现:https: //github.com/Netflix/dynomite/wiki/Architecture 也许... https://github.com/CodisLabs/codis或https ://github.com/twitter/twemproxy