面试题答案
一键面试1. 故障检测
- 心跳机制:MongoDB副本集中成员通过心跳机制互相监控状态。主节点定期向从节点发送心跳消息,从节点也会向主节点和其他从节点发送心跳。如果在一定时间内(默认10秒)未收到某个节点的心跳,就认为该节点可能发生故障。
2. 选举新主节点
- 选举算法:MongoDB使用Raft算法的变种来进行选举。只有具备选举资格的节点(如优先级较高、数据较新的节点)才能参与选举。节点发起选举时,会向其他节点发送投票请求。如果一个节点获得大多数节点(超过副本集成员一半数量)的投票,它就会成为新的主节点。
3. 同步机制在故障转移前
- 主从同步:在正常运行时,主节点处理所有写操作。主节点将写操作记录到oplog(操作日志)中,从节点通过复制oplog来保持与主节点的数据同步。从节点定期轮询主节点的oplog,获取新的操作记录并应用到自己的数据集合上。这种同步方式是异步的,主节点不会等待从节点同步完成才确认写操作成功,所以存在一定的数据延迟。
4. 同步机制在故障转移后
- 数据回滚(如果需要):在选举出新主节点后,新主节点会检查自己和其他从节点的oplog。如果某些从节点拥有比新主节点更新的数据(因为之前主节点故障时部分写操作可能只在部分从节点上应用了),新主节点会要求这些从节点回滚到与自己一致的状态。回滚操作通过撤销oplog中多余的操作记录来实现。
- 追赶同步:一旦数据回滚完成(如果有必要),新主节点开始处理写操作并记录新的oplog。同时,从节点会尽快从新主节点复制oplog,以追赶新主节点的数据状态。从节点会从新主节点oplog的当前位置开始复制,并持续应用操作记录,直到追上新主节点的最新状态。
5. 一致性算法原理
- 多数派确认:MongoDB通过多数派确认机制来保证数据一致性。写操作只有在多数节点(超过副本集成员一半数量)上成功应用后,才会被认为是成功的。例如,在一个三节点的副本集中,写操作需要在主节点和至少一个从节点上成功应用,才能确认成功。这样即使主节点发生故障,新选举出的主节点也能保证拥有最新的数据。
- oplog的顺序应用:从节点严格按照oplog中记录的顺序应用操作,确保数据在所有节点上以相同的顺序更新,从而保证数据一致性。同时,oplog的记录带有时间戳和操作编号,用于识别操作的先后顺序和避免重复应用。