2

问题是关于 Redis 服务器和哨兵配置的。

有两个子网,我想总共有 4 个 redis 服务器,每个子网中有 2 个。由于可能存在连接问题,我想配置哨兵以允许大脑分裂以实现高可用性。

因此,当发生连接问题时,会出现两个独立工作一段时间的 Redis 设置。

现在的问题是子网连接恢复后会发生什么。哨兵会检测到脑裂和两个主人?接下来他们将只选择master,而第二个将被降级为slave?来自幸存主机的数据将被推送到降级的主机,他需要删除在连接问题期间获得的所有数据差异?

我可以配置一些东西以合并数据吗?

4

1 回答 1

4

在redis - sentinelredis 集群中有两种处理 HA 的方法。

哨兵

如果一个 master 没有按预期工作,Sentinel 可以启动一个故障转移过程,其中一个 slave 被提升为 master,其他额外的 slave 被重新配置以使用新的 master,并且使用 Redis 服务器的应用程序通知新地址以在何时使用连接

问:由于可能存在连接问题,我想配置哨兵以允许大脑分裂以实现高可用性

这是使用sentinel的反模式。这是一个类似的示例,文档中解释了偶数个节点

示例 1:只有两个哨兵,不要这样做

在上述配置中,我们以完全对称的方式创建了两个主节点(假设 S2 可以在未经授权的情况下进行故障转移)。客户端可能会无限期地向双方写入,并且无法了解分区何时修复正确的配置,以防止永久的脑裂情况。所以请始终在三个不同的盒子中部署至少三个哨兵。

问:现在的问题是子网连接恢复后会发生什么。哨兵会检测到脑裂和两个主人?

这些数据将永远丢失,因为当分区恢复时,主节点将重新配置为新主节点的从节点,丢弃其数据集。

问:幸存的 master 的数据会被推送到降级的 master,他需要删除在连接问题期间获得的所有数据差异吗?

是的

问:我可以配置一些东西来合并数据吗? 你不能,redis永远不会合并任何东西

Redis 集群

这个野兽是干什么用的?

在多个节点之间自动拆分数据集的能力。当节点的子集遇到故障或无法与集群的其余部分通信时继续操作的能力。

所以它基本上是一个多作家解决方案。但它也不支持合并操作

Redis 集群设计避免了多个节点中相同键值对的版本冲突,因为在 Redis 数据模型的情况下,这并不总是可取的。Redis 中的值通常非常大;通常会看到包含数百万个元素的列表或排序集。数据类型在语义上也很复杂。传输和合并这些类型的值可能是主要瓶颈和/或可能需要应用程序端逻辑的重要参与、额外的内存来存储元数据等等。

回到你的场景

从这里引用

部署前需要了解的有关 Sentinel 的基本知识

您需要至少三个 Sentinel 实例才能进行稳健的部署。三个 Sentinel 实例应放置在被认为以独立方式发生故障的计算机或虚拟机中。例如,不同的物理服务器或虚拟机在不同的可用区域上执行。

请注意,您也可以在客户端机器上放置哨兵 - 这种方法在redis演示中大量使用https://redis.io/topics/sentinel

您也可以使用集群解决方案,但配置起来比较困难 + 它对多键操作有一些限制,并且您仍然需要提供大多数节点,以防其中一个子网出现某种 HA 故障

于 2018-02-09T20:13:23.670 回答