我们的设置
此设置在两个群集中复制,用于我们称之为元数据和缓存的内容。我们希望部署更多集群。
主持人
是我们构建的python守护程序,它订阅了sentinels pub / sub并侦听 + switch-master 消息。以下是协调人采取的行动:
SENTINEL get-master-addr-by-name mymaster
问题
因为奴隶每天可以来回走动多次,取决于交通,我们最终会遇到属于同一个奴隶争夺同一奴隶的哨兵的一些奴隶。发生这种情况是因为IP池在集群之间共享,并且据我们所知,从属ID是它们的IP。
以下是如何复制:
哨兵陷入无休止的循环中,永远为这种资源而战。即使我们只有一个哨兵小组管理具有不同主名称的两个redis群集,这种情况也会发生。这使我们相信哨兵不了解不同集群之间的资源,而是分别为每个集群做了合乎逻辑的事情。
我们尝试的解决方案
SENTINEL reset mymaster
,尝试让哨兵忘记该节点。问题是,如果该集群正在执行主故障转移,它可能会生成竞争条件。我们成功地复制了这个假设,并且让哨兵不同步,其中一个指向一个主人,另外两个指向另一个主人。理想解决方案
Redis哨兵提供SENTINEL removeslave 172.24.246.142 mymaster
我们可以在每次有奴隶的+ sdown事件时运行。这将使该群集忘记该奴隶曾经存在而不会产生SENTINEL reset mymaster
所具有的副作用。
仅通过IP停止识别奴隶的唯一性。也许添加一个redis服务器启动时间戳或任何其他令牌,以防止关闭的从站和使用相同IP备份的新站点被视为同一节点。
问题
你能想到任何其他解决方案并不涉及改变redis哨兵代码而且不需要在集群之间隔离IP池吗?