基本概念
- 什么是脑裂:在集群中有两个主节点,同时都能接收写请求,导致不知道往那个节点写入数据
- 脑裂可能导致数据丢失
为什么会发生脑裂?
-
数据丢失排查
-
确认数据同步出现问题,
- 主库数据还没有同步到从库,主库发生故障,导致最终数据丢失
- 通过master_repl_offset和slave_repl_offset差值判断是否是为主从同步问题
-
排查客户端操作日志,发现脑裂现象
-
在主从切换后的一段时间内,有一个客户端仍然在和原主库通信,并没有和升级的新主库进行交互(脑裂)\
-
脑裂不会丢失数据
-
-
脑裂
- 是原主库由于其他原因导致导致服务中断,假故障
-
\
-
-
1
\
为什么脑裂会导致数据丢失?
-
主从切换后,从库一旦升级为新主库,哨兵就会让原主库执行 slave of 命令,和新主库重新进行全量同步\
-
全量同步阶段,原主库需要清空本地的数据,加载新主库发送的 RDB 文件
\
如何应对脑裂
-
导致脑裂的最终原因:原主库发生假故障后仍然能接收请求
-
解决办法
-
min-slaves-to-write 主库能进行数据同步的最少从库数量\
-
min-slaves-max-lag 主从库间进行数据复制时,从库给主库发送 ACK 消息的最大延迟(以秒为单位)\
-
主库连接的从库中至少有 N 个从库,和主库进行数据复制时的 ACK 消息延迟不能超过 T 秒,否则,主库就不会再接收客户端的请求了\
-
-
通过限制主库假故障请求,防止数据丢失(数据写入失败比丢失强)
总结
-
脑裂是指在主从集群中,同时有两个主库都能接收写请求\
-
在 Redis 的主从切换过程中,如果发生了脑裂,客户端数据就会写入到原主库,如果原主库被降为从库,这些新写入的数据就丢失了\
-
通过合理地配置参数 min-slaves-to-write 和 min-slaves-max-lag,来预防脑裂的发生\
\