Redis脑裂问题

文章探讨了主从+哨兵模式中出现的脑裂问题,即主节点网络故障后继续服务导致数据不一致。解决方法包括设置min-slaves-to-write和min-slaves-max-lag来确保数据同步和防止数据丢失。当原主节点恢复网络,其数据将被清空以维护一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先说明

  • 脑裂的情况出现在主从+哨兵的模式下!

整体流程

  • 主节点因为网络原因和从节点断开了连接,但依旧堆外提供服务的能力。(即:还是可以写入数据) 一段时间后,哨兵发现主节点失联了,然后就会到从节点中选举一个作为主节点对外提供服务。(此时,就有两个主节点对外提供服务了) 一段时间后,原先的主节点网络恢复正常,因为已经重新选举了主节点了,因此它(原先的主节点)就会退回成从节点,并向新的主节点请求同步数据;执行的是完全同步,所以会清空掉自己的数据。

因此,最终就会导致:数据的不一致

导致数据不一致的原因

  • 主节点因为网络原因和从节点断连后,依旧可以对外提供服务。(主要原因)
  • 原先的主节点恢复网络后,会清空自身的数据。

减少脑裂的数据丢的方案

  • 主节点必须要有至少N个从节点连接,如果小于这个数,主节点会禁止写数据。。参数:min-slaves-to-write x,
  • 主从数据复制和同步的延迟不能超过 x 秒,如果主从同步的延迟超过 x 秒,主节点会禁止写数据。参数:min-slaves-max-lag x。(起到双重保证作用)

这两个配置项组合后的要求是,主节点连接的从节点中至少有 N 个从节点,「并且」主节点进行数据复制时的 ACK 消息延迟不能超过 T 秒,否则,主节点就不会再接收客户端的写请求了。

即使原主节点是假故障,它在假故障期间也无法响应哨兵心跳,也不能和从节点进行同步,自然也就无法和从节点进行 ACK 确认了。这样一来,min-slaves-to-write 和 min-slaves-max-lag 的组合要求就无法得到满足,原主节点就会被限制接收客户端写请求,客户端也就不能在原主节点中写入新数据了

等到新主节点上线时,就只有新主节点能接收和处理客户端请求,此时,新写的数据会被直接写到新主节点中。而原主节点会被哨兵降为从节点,即使它的数据被清空了,也不会有新数据丢失。

引用

  1. 小林coding
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值