面试题答案
一键面试1. MongoDB 检测网络分区的方式
- 心跳机制:MongoDB 副本集中各个节点通过定期发送心跳(heartbeat)信息来检测彼此的连接状态。默认情况下,节点每 2 秒向其他节点发送一次心跳。如果在一定时间内(通常为 10 秒)没有收到某个节点的心跳响应,就会认为该节点可能出现故障或网络问题。
2. 处理网络分区以保证数据一致性的一般原则
- 选举机制:MongoDB 副本集采用基于多数投票的选举算法(如 Raft 变种算法)。在正常情况下,副本集有一个主节点(primary)负责处理写操作,从节点(secondary)复制主节点的数据。当网络分区发生时,副本集通过选举来确定新的主节点,以继续提供服务并保证数据一致性。
3. 不同场景下的处理方式
多数节点在一个分区
- 分区内形成新主节点:如果多数节点(超过一半的节点数量)在一个分区内,这个分区内的节点可以通过选举产生新的主节点。例如,一个 5 节点的副本集,若 3 个节点在一个分区,这 3 个节点可以重新选举出主节点。新的主节点可以继续处理写操作,保证数据的持续写入和一致性维护。
- 分区外节点状态:分区外的少数节点由于无法与多数节点通信,它们会进入
RECOVERING
状态,等待网络恢复后重新加入副本集并同步数据。
节点均匀分布在不同分区
- 无法形成多数:若节点均匀分布在不同分区,没有一个分区包含多数节点(如 4 节点副本集,两个分区各有 2 个节点),此时任何一个分区都无法通过选举产生新的主节点。所有节点都会进入
RECOVERING
状态,整个副本集处于不可写状态,但读操作可以在从节点上进行(如果有配置允许从节点读)。 - 等待网络恢复:各个分区的节点都会等待网络恢复,一旦网络恢复,节点之间可以重新通信,然后进行选举产生新的主节点,副本集恢复正常的读写操作,并通过数据同步来保证各个节点的数据一致性。