闲谈Redis脑裂

什么是脑裂

脑裂是在分布式系统中经常出现的问题之一,它指的是由于网络或节点故障等原因,导致一个分布式系统被分为多个独立的子系统,每个子系统独立运行,无法相互通信,同时认为自己是整个系统的主节点,这就会导致整个系统失去一致性和可用性。

Redis脑裂原因、危害、解决

Redis的脑裂问题可能发生在网络分区或者主节点出现问题的时候:

  • 网络分区:网络故障或分区导致了不同子集之间的通信中断。
    • Master节点,哨兵和Slave节点被分割为了两个网络,Master处在一个网络中,Slave库和哨兵在另外一个网络中,此时哨兵发现和Master连不上了,就会发起主从切换,选一个新的Master,这时候就会出现两个主节点的情况
  • 主节点问题:集群中的主节点之间出现问题,导致不同的子集认为它们是正常的主节点。
    • Master节点有问题,哨兵就会开始选举新的主节点,但是在这个过程中,原来的那个Master节点又恢复了,这时候就可能会导致一部分Slave节点认为他是Master节点,而另一部分Slave新选出了一个Master

脑裂问题可能导致以下问题:

  • 数据不一致:不同子集之间可能对同一数据进行不同的写入,导致数据不一致。
  • 重复写入:在脑裂解决后,不同子集可能尝试将相同的写入操作应用到主节点上,导致数据重复。
  • 数据丢失:新选出来的Master会向所有的实例发送slave of命令,让所有实例重新进行全量同步,而全量同步首先就会将实例上的数据先清空,所以在主从同步期间在原来那个Master上执行的命令将会被清空。

那么如何防止脑裂的发生呢?

  • ​ min-slaves-to-write:主库能进行数据同步的最少从库数量;
  • min-slaves-max-lag:主从库间进行数据复制时,从库给主库发送 ACK 消息的最大延迟秒数。
  • 假设我们将 min-slaves-to-write 设置为 1,把 min-slaves-max-lag 设置为 10s。如果Master节点因为某些原因挂了 12s,导致哨兵判断主库客观下线,开始进行主从切换。同时,因为原Master宕机了 12s,没有一个(min-slaves-to-write)从库能和原主库在 10s( min-slaves-max-lag) 内进行数据复制,这样一来,就因为不满足配置要求,原Master也就再也无法接收客户端请求了。这样一来,主从切换完成后,也只有新主库能接收请求,这样就没有脑裂的发生了。
  • 但是:
    • 假设我们将 min-slaves-to-write 设置为 1,把 min-slaves-max-lag 设置为 10s,并且down-after-milliseconds时间为8s,也就是说,如果8秒连不上主节点,哨兵就会进行主从切换。
    • 但是,如果主从切换的过程需要5s时间的话,就会有问题。
    • Master节点宕机8s时,哨兵判断主节点客观下线,开始进行主从切换,但是这个过程一共需要5s。那如果主从切换过程中,主节点有恢复运行,即第9秒Master恢复了,而min-slaves-max-lag设置为10s那么主节点还是可写的。
    • 那么就会导致9s~12s这期间如果有客户端写入原Master节点,那么这段时间的数据会等新的Master选出来之后,执行了slaveof之后导致丢失。
    • Redis脑裂可以采用min-slaves-to-write和min-slaves-max-lag合理配置尽量规避,但无法彻底解决

扩展

Zookeeper集群中的脑裂出现的原因通常有以下2种情况:

  1. 网络分区
  2. 主节点宕机
  3. 解决:本质就是通过原子广播的方式,只有得到大多数节点的支持才能成为master,而如果旧master恢复后由于没有大多数节点的支持依旧无法完成写操作

闲谈Redis脑裂
http://lzhnet.top/2023/10/03/闲谈Redis脑裂/
Author
kuaile000
Posted on
October 3, 2023
Licensed under