Redis 集群会出现脑裂问题吗?

Sherwin.Wei Lv7

Redis 集群会出现脑裂问题吗?

回答重点

Redis 集群存在脑裂问题的风险,特别是在网络分区的情况下,可能会导致同一集群内出现多个主节点,导致数据不一致。

扩展知识

什么是脑裂

脑裂是指在分布式系统中,由于网络分区或其他问题导致系统中的多个节点(特别是主节点)误以为自己是唯一的主节点。这种情况会导致多个主节点同时提供写入服务,从而引起数据不一致。

分布式系统就像一个团队在干活,如果发生了脑裂,就好比这个团队突然因为某些原因,比如通信出了问题,分成了几个小团体。

每个小团体都以为自己是整个团队,都在按自己的方式工作,各自为政,对同一件事有不同的决策和做法,就像有的说要这么干,有的说要那么干。

这样一来,整个系统就乱套了,数据也可能变得不一致,服务也变得不正常了,这就是分布式系统中的脑裂。

导致脑裂出现原因主要是网络分区

Redis 中的脑裂

例如发生了网络分区,主节点与哨兵、从节点分区了。

image.png

此时哨兵发现联系不上主节点,于是发起选举,选了新的主节点,此时 Redis 就出现了两个主节点:

image.png

这就发生了脑裂,此时客户端写数据应该写到哪台上呢?写哪都会导致数据不一致

Redis 中如何避免脑裂问题的发生呢?

这里需要了解两个参数:

  • min-slaves-to-write:设置主节点在至少有指定数量的从节点确认写操作的情况下才执行写操作
  • min-salves-max-lag:设置从节点的最大延迟(以秒为单位),如果从节点的延迟超过这个值,则该从节点不会被计入 min-slaves-to-write 的计数中

举个例子:当 min-slaves-to-write 设置为 2,min-slaves-max-lag 设置为 10 秒时,主节点只有在至少有 2 个从节点延迟不超过 10 秒的情况下才会接受写操作

这两个参数就使得发生脑裂的时候,如果某个主节点跟随的从节点数量不够或延迟较大,就无法被写入,这样就能避免脑裂导致的数据不一致。

建议集群部署奇数个节点,例如集群数为 5,那么可以设置 min-slaves-to-write 为 3,min-slaves-max-lag 为 5-10 秒。

脑裂问题能完全避免吗?

并不能。即使配置了以上两个参数也可能会因为脑裂导致数据不一致。

举个例子,假设某个主节点临时出了问题,哨兵判断它主观下线,然后开始发起选举。

在选举进行的时候,主节点恢复了,此时它还是跟着很多从节点,假设 min-slaves-max-lag 配置了 10s,可能此时从节点和主节点延迟的时间才 6s,因此此时主节点还是可以被写入。

而等选举完毕了,选出新的主节点,旧的主节点被哨兵操作需要 salveof 新主,此时选举时间内写入的数据会被覆盖,因此就导致了数据不一致的问题。

Comments