面试题答案
一键面试MongoDB副本集选举机制原理
- 心跳检测:副本集中每个成员通过心跳机制定期向其他成员发送ping消息,以检测彼此的状态。如果某个成员在一定时间(默认10秒)内没有收到其他成员的心跳响应,就会认为该成员不可用。
- 优先级设定:每个副本集成员都有一个优先级(priority),取值范围是0到100,优先级高的成员在选举中更有优势成为主节点(Primary)。优先级为0的成员不能成为主节点,只能作为从节点(Secondary)。
- 选举过程:当主节点不可用时,具有选举权(votes)的成员(优先级不为0且状态正常)开始发起选举。首先,符合条件的成员会给自己投一票。然后,成员会将票投给优先级最高且状态正常的成员。如果有多个成员优先级相同,则按照成员的选举时间戳(election timestamp)来决定,时间戳大的成员会获得更多票。当某个成员获得超过半数的选票时,就会被选举为新的主节点。
保障数据一致性的方式
- 数据同步:从节点会不断从主节点同步数据,主节点将操作日志(oplog)发送给从节点,从节点应用这些操作日志来保持与主节点数据的一致性。
- 多数写确认:默认情况下,MongoDB的写操作会等待多数成员(超过副本集成员数量一半)确认写入成功后才返回。这确保了即使主节点发生故障,新选举出的主节点也能拥有最新的数据,从而保障数据一致性。
关键步骤和条件
- 选举发起条件:主节点失联,副本集成员检测到主节点在一定时间内没有心跳响应。
- 参与选举成员条件:优先级不为0,且自身状态正常(能够与其他成员进行通信)。
- 选举关键步骤:
- 成员发起选举并给自己投票。
- 比较成员优先级,优先将票投给优先级高的成员。
- 若优先级相同,比较选举时间戳,时间戳大的成员获更多票。
- 获得超过半数选票的成员成为新主节点。
- 数据一致性保障关键步骤:
- 主节点记录操作日志并发送给从节点。
- 从节点应用操作日志同步数据。
- 写操作等待多数成员确认写入成功。