Redis集群的脑裂问题
脑裂是指在分布式系统中,由于网络分区或者其他问题导致系统中的多个节点(特别是主节点)会误以为自己是唯一的主节点。从而导致多个主节点同时提供写入服务,造成数据不一致。
分布式系统就像一个团队在干活,如果发生了脑裂,就好比这个团队突然因为某些原因,比如通信出了问题,分成了几个小团体,每个小团体都以为自己是整个团队,都在按自己的方式工作,各自为政,对同一件事有不同的决策和做法, 就像有的说要这么干,有的说要那么干。 这样一来,整个系统就乱套了,数据也可能变得不一致,服务也变得不正常了,这就是分布式系统中的脑 裂。 导致脑裂出现原因主要是网络分区。
例如:发生了网络分区,主节点与哨兵、从节点分区了
此时哨兵发现联系不上主节点,于是发起选举,选了新的主节点,此时 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 秒的情况下才会接受写操作。
这两个参数就使得发生脑裂的时候,如果某个主节点跟随的从节点数量不够或延迟较大,就无法被写入, 这样就能避免脑裂导致的数据不一致。