我有两个节点,我想在主动 - 主动模式下作为服务器运行,并且还具有HA功能,即如果一个发生故障,另一个节点应该开始接收所有请求但是两个节点都已启动,两者都应该全部请求。现在,由于Redis不允许主动 - 主动模式用于相同的哈希集,并且我没有选择运行Sentinel,因为我没有第三个节点,我的想法是运行两个节点在复制中,我自己决定主节点是否关闭并将主服务器提升为主节点。这有什么问题吗?当原始主机恢复时,有没有办法将其配置为从机?
这听起来像个好主意吗?我对Redis以外的建议持开放态度。
答案 0 :(得分:3)
一般运行两个节点永远不是一个好主意,因为它必然会出现裂脑问题:当两个节点之间的网络停顿一两时,这两个节点将不可避免地认为彼此处于离线状态并且会促进/保持自己为主人并开始接受来自其他服务的请求。然后裂脑发生了。
如果您对这种可能的情况感到满意,那么您可以借助脚本文件和像pacemaker或keepalived这样的HA服务来设置主从。
通常,您必须通过预定义规则告知集群管理器,当两台机器在裂脑条件下重新加入时,哪一台是您首选的主机。
当选择master时,执行脚本并基本上它自己执行slaveof no one
并在另一个节点上执行slaveof <new-master-ip> <port>
。
您可以在脚本文件中更进一步,并尝试将两个数据集合并在一起,但这是否可实现完全取决于您如何在Redis中组织数据以及您准备等待多长时间让所有数据同步。
我之前通过pacemaker + corosync做过这种方式。
答案 1 :(得分:2)
好的,使用SLAVEOF的部分解决方案:
您可以通过运行:
手动将奴隶提升为主人SLAVEOF NO ONE
您可以通过运行:
手动将主设备转换为从设备SLAVEOF <HOST> <port>
应禁用群集。
答案 2 :(得分:0)
我建议至少有3个节点使用Sentinel设置,以便在当前主节点关闭时启用八卦/仲裁以自动将从属设备升级为主设备。
答案 3 :(得分:0)
如果通过将副本副本更改为replicaof no one
手动使副本副本联机,则需要注意将发生故障的主副本作为新节点的副本副本重新联机,以免覆盖新的数据。我不建议手动执行此操作。您希望最大程度地减少停机时间,因此自动故障转移非常理想
您提到对其他产品开放。查看KeyDB,它具有您要查找的确切配置。它是Redis的维护多线程分支,可提供您正在寻找的主动副本方案。 Check out an example of it here。
将两个节点作为彼此的副本运行,同时接受读写(取决于前期代理配置)。如果一个失败,另一个继续承担全部负载,并且已经同步。
关于裂脑问题,KeyDB可以处理裂脑场景,其中主机之间的连接被切断,但写入仍在继续。每个写入都带有时间戳,当连接恢复时,每个主机将共享其新数据。最新的写作将获胜。这样可以防止过期数据覆盖断开连接后写入的新数据。