9

我有两个节点,我想在主动-主动模式下作为服务器运行,并且还具有 HA 功能,即如果一个节点关闭,另一个节点应该开始接收所有请求,但是当两个节点都启动时,两个节点都应该接收所有请求。现在,由于 Redis 不允许相同哈希集的主动-主动模式,而且我没有运行 Sentinel 的选项,因为我不能有第三个节点,我的想法是在复制中运行这两个节点,我自己决定是否主节点已关闭并将从属节点提升为主节点。这有什么问题吗?当原来的master回来时,有没有办法将它配置为slave?

这听起来是个好主意吗?我对 Redis 以外的建议持开放态度。

4

4 回答 4

6

一般运行两个节点永远不是一个好主意,因为它必然会出现脑裂问题:当两个节点之间的网络宕机一两分钟时,两个节点不可避免地会认为对方离线并会自我提升/保持成为主人并开始接受来自其他服务的请求。然后发生裂脑。

如果您对这种可能的情况感到满意,那么您可以在脚本文件和 HA 服务(如起搏器或 keepalived)的帮助下研究设置主从。

通常,您必须通过预定义的规则告诉集群管理器,当两台机器在裂脑条件下重新加入时,哪一台是您的首选主机。

当一个主节点被选出时,执行脚本,基本上它slaveof no one在自己执行slaveof <new-master-ip> <port>并在另一个节点上执行。

您可以在脚本文件中更进一步并尝试将两个数据集合并在一起,但这是否可以实现完全取决于您在 Redis 中如何组织数据以及您准备等待多长时间数据同步。

我以前通过起搏器+ corosync自己做过这种方式。

于 2017-07-26T20:52:42.393 回答
4

好的,使用SLAVEOF的部分解决方案:

您可以通过运行手动将 slave 提升为 master:

SLAVEOF NO ONE

您可以通过运行手动将主设备转换为从设备:

SLAVEOF <HOST> <port>

应该禁用集群。

于 2017-07-20T20:55:35.997 回答
0

我建议至少有 3 个带有 Sentinel 设置的节点,以启用 gossip/quorum,以便在当前主节点出现故障时自动将从节点提升为主节点。

于 2017-07-27T14:15:12.843 回答
0

如果您通过将副本更改为 手动使副本联机,则replicaof no one需要小心地将失败的主节点作为新节点的副本重新联机,以免覆盖更新的数据。我不建议手动执行此操作。您希望最大限度地减少停机时间,因此自动故障转移是理想的选择

您提到对其他产品持开放态度。查看具有您正在寻找的确切配置的KeyDB 。它是一个维护的多线程 redis 分支,提供您正在寻找的活动副本方案。在这里查看一个例子

将两个节点作为彼此的副本运行,同时接受读取和写入(取决于前期代理配置)。如果一个失败,另一个继续承担全部负载并且已经同步。

关于脑裂问题,KeyDB 可以处理主节点之间的连接被切断但继续写入的脑裂场景。每次写入都带有时间戳,当连接恢复时,每个 master 将共享他们的新数据。最新的写入将获胜。这可以防止陈旧的数据覆盖连接断开后写入的新数据。

于 2019-05-29T02:15:14.717 回答