33 | 脑裂:一次奇怪的数据丢失

175 阅读2分钟

基本概念

  • 什么是脑裂:在集群中有两个主节点,同时都能接收写请求,导致不知道往那个节点写入数据
  • 脑裂可能导致数据丢失

为什么会发生脑裂?

  • 数据丢失排查

    • 确认数据同步出现问题,

      • 主库数据还没有同步到从库,主库发生故障,导致最终数据丢失
      • 通过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,来预防脑裂的发生\

\