请简述Zookeeper的选主流程?

1 个回答

  • 小青牛
    想多了全是问题,想开了全是答案。
    Zookeeper 的核心是原子广播机制,这个机制保证了各个服务器之间的同步。实现这个机制的协议叫做 Zab 协议。Zab 协议有两种模式,分别是恢复模式(选主)和广播模式(同步)。当服务启动或者领导者崩溃后,Zab 就进入了恢复模式。当领导者被选举出来,且大多数服务器完成了和 Leader 的状态同步以后,恢复模式就结束了。状态同步保证了 Leader 和服务器具有相同的系统状态。Leader 选举是保证分布式数据一致性的关键。 ### 选举触发场景 出现选举主要有两种场景: 1. **初始化**:服务器初始化启动。 2. **Leader 不可用**:服务器运行期间无法和 Leader 保持连接。 当 Zookeeper 集群中的一台服务器出现以下两种情况之一时,就会开始 Leader 选举: - 服务器初始化启动。 - 服务器运行期间无法和 Leader 保持连接。 ### 选举流程 当一台机器进入 Leader 选举流程时,当前集群可能处于以下两种状态: 1. 集群中本来就已经存在一个 Leader。 2. 集群中确实不存在 Leader。 #### 1. 集群中已经存在 Leader 通常是集群中某一台机器启动比较晚,在它启动之前,集群已经正常工作,即已经存在一台 Leader 服务器。当该机器试图去选举 Leader 时,会被告知当前服务器的 Leader 信息,它仅仅需要和 Leader 机器建立连接,并进行状态同步即可。 #### 2. 集群中不存在 Leader 当集群中确实不存在 Leader 或 Leader 不可用时,会触发选举流程。选举流程如下: 1. **初始化投票**: - 每台服务器都会将自己作为 Leader 进行投票。 - 投票信息中包含两个最基本的信息:服务器 ID(sid)和事务 ID(zxid)。 - 例如,如果当前服务器要推举 sid 为 1,zxid 为 8 的服务器成为 Leader,那么投票信息可以表示为(1,8)。 2. **投票 PK 规则**: - 初始阶段,每个服务器都会给自己投票。 - 接收到来自其他服务器的投票后,将别人的投票和自己的投票进行 PK。 - 优先检查 zxid,zxid 较大的服务器优先作为 Leader。 - 如果 zxid 相同,则比较 sid,sid 较大的服务器作为 Leader。 3. **投票流程示例**: - 三台服务器 server1、server2、server3: - server1 启动,一台机器不会选举。 - server2 启动,server1 和 server2 的状态改为 LOOKING,开始广播投票。 - server3 启动,状态改为 LOOKING,加入广播投票。 - 初始状态,大家都认为自己是 Leader,投票也投自己为 Leader。 - 初始 zxid=0,sid 分别为 1、2、3。server1 投票(1,0),server2 投票(2,0),server3 投票(3,0)。 4. **投票处理和更新**: - server1 收到 server2 的投票时,会验证投票的合法性,然后进行 PK。由于 zxid 相同,比较 sid,server1 的 sid 小于 server2 的 sid,server2 的投票获胜。server1 更新自己的投票为(2,0),并重新投票。 - server2 收到 server1 的投票后,会验证投票的合法性,自己的票获胜,不更新自己的票,继续发送自己的投票。 - 统计投票,如果半数以上的节点投出相同的票,确定选出了 Leader。 5. **状态更新**: - 选举结束后,被选中的节点状态由 LOOKING 变为 LEADING,其他节点状态由 LOOKING 变为 FOLLOWING。Observer 节点不参与选举,其状态一直为 OBSERVING。 ### 简化流程 1. 开始投票 -> 节点状态变为 LOOKING -> 每个节点选自己 -> 收到票进行 PK -> sid 大的获胜 -> 更新选票 -> 再次投票 -> 统计选票,过半数则选举结果确定 -> 节点状态更新为自己的角色状态。 通过上述流程,Zookeeper 能够在集群中选举出一个 Leader,保证集群的正常运行和数据的一致性。
    发布于 2024-08-01 06:10 •IP属地 湖北
    举报
    评论
    收藏