假设OceanBase集群由三台服务器组成(合肥、北京、上海三个Zone)。由于运营商网络故障,导致合肥与北京之间的专线完全中断,但合肥与上海、北京与上海之间的网络正常。
问题:
1、业务主副本Leader位于合肥节点,此时集群会发生什么?
2、当网络恢复后,如何确保数据零丢失且不会出现“脑裂”?
3、如果在此期间合肥节点有部分日志未同步到其他节点,这些数据最终会怎样?
好人在哪里
1、3副本中,Leader(合肥)与其中一个Follower(北京)网络中断,意味着Leader只能收到上海一个副本的Ack,无法形成多数派(需要2个Ack)。因此,Leader会自动Step Down,集群进入选主状态。
2、北京和上海之间网络正常,它们之间可以通过Paxos选举出新的Leader(假设是上海)。由于合肥无法与多数派通信,它即使还认为自己是Leader,也无法对外提供服务,自动降级为Follower,从而避免了脑裂 。
3、当合肥节点恢复网络加入集群后,它会作为一个Follower,发现新Leader(上海)的日志比自己多(或者有冲突)。它会根据Paxos协议,Rollback那些未被多数派持久化的、仅在合肥本地的事务,并从新Leader处同步缺失的数据,最终实现状态机的一致性。这确保了数据最终一致且不丢失 。
-
当合肥与北京之间的网络中断时,如果业务主副本Leader位于合肥节点,且合肥与上海之间的网络仍然正常,则Leader副本仍然可以与上海的Follower副本保持同步。此时,北京的Follower副本将与Leader副本失去联系,无法获取最新的Redo Log。如果北京的Follower副本尝试选举自己为新的Leader,但由于不能获得多数派的投票(即无法同时与合肥和上海的节点建立联系),因此它不会成为新的Leader。合肥节点将继续作为Leader,但其Follower副本数量减少,这可能会影响数据的可靠性。
-
当网络恢复后,为了确保数据零丢失且不会出现“脑裂”,OceanBase的Paxos协议将发挥作用。Leader节点(合肥)会与北京的Follower副本重新建立联系,并将未同步的日志发送给北京的节点。如果北京节点在这段时间内尝试过选举新的Leader但未能成功,则它将接受来自原Leader(合肥)的命令并继续作为Follower运行。
-
如果在这段时间内合肥节点有部分日志未同步到其他节点,当网络恢复后,这些日志会被发送给北京和上海的Follower副本。OceanBase的数据同步机制会确保所有副本之间的数据一致性,因此这些数据最终会被同步到其他节点。
更多信息请查看:
都是实战经验,学习一下
学习
回答好专业