面试题答案
一键面试选举过程
- 心跳检测:在MongoDB副本集中,成员之间通过心跳机制保持联系。正常情况下,副本集成员每隔2秒互相发送心跳信息。当网络分区发生时,心跳中断,成员开始感知到网络异常。
- 选举触发:在每个分区内,副本集成员会根据自身状态和配置,在一定时间(通常10秒左右,可配置)没有收到主节点心跳后,开始进行选举。只有符合条件的节点(如具有最新oplog且优先级足够高等)才会参与竞选。
- 选举算法:MongoDB使用Raft选举算法变种。竞选节点会向其他节点发送投票请求,收到大多数节点(超过一半副本集成员数量)投票的节点将成为新的主节点。在网络分区场景下,不同分区可能各自选举出主节点,但只有一个能最终保持主节点身份。
数据同步
- 新主节点确认:网络恢复后,副本集成员重新建立联系,发现存在多个主节点。此时,具有更高选举优先级或最新数据的主节点会成为唯一主节点,其他主节点会转变为从节点。
- oplog同步:从节点(包括之前错误选举出的主节点转变的从节点)会从当前主节点获取操作日志(oplog)。oplog记录了主节点上所有数据变更操作。从节点根据自己已有的oplog情况,请求主节点发送缺失部分的oplog。
- 应用oplog:从节点接收到oplog后,按照oplog中的操作顺序,依次在本地数据上进行重放,从而使从节点的数据与主节点达到一致。
- 回滚操作:如果在网络分区期间,不同分区都有数据写入,可能会出现数据冲突。当网络恢复,非主节点发现自己的数据与主节点不一致且操作顺序存在差异时,会进行回滚操作,撤销在分区期间错误写入的操作,然后再从主节点同步最新数据,以保证最终数据一致性。