在本文中,我们将研究以下主题:
- Redis集群的高可用性。
- Redis集群的自动故障转移。
- Redis集群中的脑裂问题及其解决方案。
问题: Redis-Cluster如何提供高可用性?
答案: 高可用性是指集群在面临某些故障时仍能保持操作能力。例如,集群可以检测到主分片失败并在无需外部手动干预的情况下将副本提升为主分片。
问题: Redis-Cluster如何提供自动故障转移?
答案: Redis-Cluster可以迅速了解主分片何时失败,并且可以将其副本晋升为新主分片。
- 假设我们为每个主分片都有一个副本。如果我们的数据分布在三个Redis服务器之间,我们将需要一个六成员的集群,其中三个主分片和三个副本。
- 所有六个分片通过TCP相互连接,并不断地相互ping并交换消息。这些消息允许集群确定哪些分片是活动的。
- 当足够多的分片报告给定主分片未响应它们时,它们可以同意触发故障转移,并将分片的副本提升为新的主分片。在触发故障转移之前需要同意离线同行的分片数量在集群创建时是可配置的。
问题: 用Redis-Cluster演示脑裂的情况?
答案: 以下是脑裂情况的演示方式:
步骤#1: 想象一下,我们有一个具有三个主分片和每个主分片一个副本的Redis-Cluster。总体而言,我们的Redis集群是一个六成员的集群,其中有三个主分片和三个副本。进一步想象,网络分区已经发生,即左侧的组将无法与右侧的组中的分片通信。
现在,两个集群组都认为它们处于脱机状态,两者都将触发任何主分片的故障转移,导致左侧具有所有主分片,右侧也将具有所有主分片。
步骤#2: 两侧认为它们具有所有主分片,将继续接收修改数据的客户端请求。这是一个问题,因为也许客户端A在左侧将键foo的值设置为bar,但客户端B在右侧将相同键的值设置为baz。
步骤#3: 当网络分区被删除并且分片尝试重新连接时,我们将会有冲突,因为我们有两个保存不同数据的分片,声称是主分片,我们不会知道哪些数据是有效的。这称为脑裂情况,在分布式系统的世界中是一个非常常见的问题。
问题: 如何解决脑裂的问题?
答案: 在集群中保持奇数个主分片和每个主分片两个副本。以下是解决此问题的详细解决方案:
- 为防止在Redis集群中发生一种称为脑裂情况的情况,始终保持奇数个分片。
- 现在,当我们得到网络分割时,左侧和右侧的组将进行计数,并查看它们是在更大的(多数)还是更小的组(少数)?
- 如果特定组处于少数,它将不尝试触发故障转移,并且将不接
受任何客户端写入请求。
让我们来看看下面的集群:
现在,假设发生网络分割,如下所示:
在这里,左侧组(节点集合)处于少数,因此它不会尝试触发故障转移,并将停止接受任何客户端写入请求。
右侧组(节点集合)处于多数,因此它具有触发任何主分片故障转移的权限和能力。