Redis:只读从属与故障转移从属?

Redis:只读从属与故障转移从属?

我阅读了大量有关 Redis 网络配置的文档,但我感到困惑的是,我所拥有的架构思维模型中的要求似乎与当前选项不符。

首先:我不需要分片,因为可扩展性目前不是问题。所以现在只有一个主节点(节点 M)。

第二:我想要冗余,也就是说,如果主节点发生故障,我希望第二个节点接管并执行客户端发送的请求。我们将其称为第一个从节点:故障转移从节点(节点 FS)。

第三:我还想要另一个副本节点,它是一个从节点,但只提供只读查询服务。如果客户端连接到它,并且客户端尝试修改数据,则该节点应该给出错误。我们将其称为第二个从节点:只读从节点 (RS)。

最后:我希望只读从属服务器具有故障转移功能。也就是说,如果 RS 出现故障,我希望另一个只读从属服务器接管其任务。我们将其称为第四个从属服务器:故障转移只读从属服务器 (FRS)。

有没有办法像这样配置 Redis?似乎所有部署模式(正在阅读这篇文章:https://blog.octo.com/en/what-redis-deployment-do-you-need/) 除了 Cluster 之外还有一个主节点。现在,我的“FS”节点似乎将成为第二个主节点,因为它接受写入查询,但是 Cluster 配置默认启用了分片,似乎没有正常方法可以禁用它,除非我遗漏了什么。

答案1

据我了解,redis sentinel 可以满足您的需求。

您将拥有 1 个主站 (M) 和 3 个从站 (FS、RS 和 FRS)。每个从站都连接到同一个主站。

然后部署奇数个哨兵进程来监视主服务器。如果主服务器发生故障,哨兵进程会将三个从服务器中的一个提升为新主服务器。

现在,根据您的说明,您希望将“FS”从属节点设为新的主节点。Sentinel 不知道“FS”是特殊的,它可以选择 3 个从属节点中的任何一个作为新主节点的候选节点。要使“FS”变得特殊,您需要为每个从属节点设置“replica-priority”。您不希望“RS”和“FRS”成为主节点 - 因此请为这两个节点设置 replica-priority = 0。然后,Sentinel 只会在需要进行故障转移时考虑“FS”。

问题的另一部分是“RS”死机时会发生什么?从属服务器没有故障转移机制 - 根本就不需要。“RS”和“FRS”只是两个只读副本,都指向同一个主服务器。客户端应配置为随机尝试两个副本之一 - 这样您就可以分配负载。如果“RS”死机,客户端只需尝试“FRS”。由于它是只读的 - 数据一致性并不重要。


对于 RS 和 FRS - 设置附加属性replica-read-only yes。这将确保写入失败。

如果需要,您可以使用非哨兵设置。如果这样做,从 M 到 FS 的故障转移将不会自动发生。如果/当主 M 发生故障时,您必须 a) 检测到它,b) 将 FS 标记为无从属,c) 确保所有 redis 客户端开始写入新主服务器,以及 d) 重新配置 RS 和 FRS 以开始跟随新主服务器。哨兵会自动执行此操作,但会增加复杂性。您也可以轻松地手动完成此操作。

相关内容