面试题答案
一键面试选举触发条件
- 主节点故障:当副本集中的主节点(Primary)出现故障,无法响应心跳检测时,选举就会被触发。副本集成员会在一定时间内(通常是10秒左右)没有收到主节点的心跳,从而开始选举流程。
- 网络分区:如果网络发生分区,导致副本集成员之间无法正常通信,也可能触发选举。在这种情况下,不同分区内的成员可能会各自尝试选举出新的主节点。
选举过程中各个成员的角色变化
- 初始状态:副本集成员通常有三种角色,主节点(Primary)、从节点(Secondary)和仲裁节点(Arbiter)。主节点负责处理所有写操作,并将写操作的日志(oplog)同步给从节点。从节点复制主节点的oplog并应用,以保持数据同步。仲裁节点不存储数据,只参与选举投票。
- 选举开始:当选举触发后,从节点会尝试成为候选者(Candidate)。候选者会向其他成员发送选举请求(Vote Request)。
- 投票阶段:其他成员(包括仲裁节点)在收到选举请求后,会根据一定规则决定是否投票给该候选者。如果候选者获得大多数成员(超过一半)的投票,它就会成为新的主节点。
- 角色确定:选举成功后,新的主节点开始处理读写操作,其他成员成为从节点,继续从新主节点同步数据。
影响选举结果的因素
- 优先级(Priority):每个副本集成员都可以设置一个优先级(0 - 1000 之间,默认是1)。优先级高的成员在选举时更有优势,更容易被选为新的主节点。优先级为0的成员永远不会成为主节点,通常作为隐藏节点(Hidden Node)使用,用于一些特殊用途,如离线数据分析。
- 日志时间戳(Term):每个写操作都会有一个对应的时间戳(Term)。在选举时,拥有最新日志时间戳的成员更有可能被选为新的主节点。这确保了新的主节点拥有尽可能新的数据。
- 选举票数:要成为主节点,候选者必须获得大多数成员的投票。如果副本集有5个成员(包括仲裁节点),则需要至少3票才能当选。因此,成员数量和各成员的投票决策会影响选举结果。
- 心跳响应时间:成员之间通过心跳检测来保持联系。在选举过程中,能够快速响应心跳请求的成员更有可能获得其他成员的信任,从而增加当选主节点的机会。如果某个成员网络延迟高,可能会在选举中处于劣势。