面试题答案
一键面试MongoDB副本集故障转移与数据一致性
- 自动故障转移:当主节点所在区域不可用时,MongoDB副本集内的成员(从节点和仲裁节点)会通过心跳检测机制感知到主节点失联。副本集会触发选举流程,从符合条件的从节点中选出新的主节点,从而实现自动故障转移,维持服务可用性。
- 选举新主节点过程:
- 心跳检测:副本集中每个成员定期向其他成员发送心跳消息,以确认彼此状态。当主节点所在区域不可用,从节点和仲裁节点无法收到主节点心跳,在一定时间(通常10秒左右)后,认为主节点故障。
- 选举条件:新主节点选举优先选择优先级高的从节点(通过
priority
配置),优先级默认1,范围0 - 100。优先级为0的节点不能成为主节点。如果优先级相同,会根据节点的opTime
(操作时间戳),opTime
最新的节点优先。 - 选举流程:当检测到主节点故障,从节点会发起选举请求。仲裁节点(不存储数据,仅参与选举)收到请求后进行投票。从节点需获得多数成员(包括仲裁节点)投票才能当选主节点。例如,一个3节点副本集(2个数据节点和1个仲裁节点),需要2票才能当选。
- 恢复过程中数据同步问题及解决方案:
- 数据同步问题:选举出新主节点后,新主节点和其他从节点间可能存在数据不一致。原因是故障发生时,部分写操作可能在主节点已完成但还未同步到从节点,或者从节点可能有旧数据。
- 解决方案:
- 回滚:如果新主节点的数据落后于某些从节点,MongoDB会执行回滚操作。即撤销在旧主节点上已提交但未同步到多数节点的写操作,以保证数据一致性。
- 同步:新主节点当选后,会向其他从节点发送同步请求。从节点将自身数据与新主节点数据对比,按新主节点的
opTime
进行数据同步,补全缺失数据,最终达到数据一致状态。