所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话,脑裂会进一步导致数据丢失。
一、为什么会发生脑裂?
1、第一步:确认是不是数据同步出现了问题
- 在主从集群中发生数据丢失,最常见的原因就是主库的数据还没有同步到从库,结果主库发生了故障,等从库升级为主库后,未同步的数据就丢失了。我们使用 INFO replacition 命令查看在原主库上的 repl_backlog_buffer 上面的 master_repl_offset 和 slave_repl_offset 之间是否存在差值。
2、第二步:排查客户端的操作日志,发现脑裂现象
- 在排查客户端的操作日志时,我们发现,在主从切换后的一段时间内,有一个客户端仍然在和原主库通信,并没有和升级的新主库进行交互。这就相当于主从集群中同时有了两个主库。根据这个迹象,我们就想到了在分布式主从集群发生故障时会出现的一个问题:脑裂。
- 但是,不同客户端给两个主库发送数据写操作,按道理来说,只会导致新数据会分布在不同的主库上,并不会造成数据丢失。那脑裂是如何丢失数据的?
3、第三步:发现是原主库假故障导致的脑裂
- 我们是采用哨兵机制进行主从切换的,当主从切换发生时,一定是有超过预设数量(quorum (法定人数)配置项)