Zookeeper 集群中是怎样选举leader?
1 个回答
纵然前路迷茫,纵然天隔一方,纵然我手中的刀刃已然破碎,也无法阻挡我寻找你的道路。凤舞### Zookeeper 集群中的 Leader 选举 Zookeeper 集群在 Leader 崩溃或失去大多数 Follower 时,会进入恢复模式,需要重新选举出一个新的 Leader,所有 Server 都会进入 `LOOKING` 状态。Zookeeper 的 Leader 选举主要基于两种选举算法:基于 Basic Paxos 实现和基于 Fast Paxos 实现。Zookeeper 默认使用 Fast Paxos 选举算法。 #### 1. 服务器启动时期的 Leader 选举 当 Zookeeper 集群初始化时,服务器需要进行 Leader 选举。假设有三台机器组成的服务器集群,初始状态下,各服务器都会将自己作为 Leader 进行投票,选举过程如下: 1. **每个 Server 发出一个投票**: - 初始情况下,所有服务器都会将自己作为 Leader 进行投票。投票包含服务器的 myid 和 ZXID,用 (myid, ZXID) 表示。 - 例如:Server1 的投票为 (1, 0),Server2 的投票为 (2, 0),Server3 的投票为 (3, 0)。 2. **接受并处理投票**: - 每个服务器接收到其他服务器的投票后,会判断投票的有效性,并与自己的投票进行比较。 - 比较规则:优先比较 ZXID,ZXID 较大的服务器优先作为 Leader。如果 ZXID 相同,则比较 myid,myid 较大的服务器作为 Leader。 3. **更新投票**: - 如果接收到的投票优于自己的投票,则更新自己的投票。 - 例如:Server1 接收到 Server2 的投票 (2, 0),比较后发现 Server2 的 myid 较大,则更新自己的投票为 (2, 0)。 4. **统计投票**: - 统计投票信息,判断是否有过半机器接受了相同的投票信息。 - 如果超过半数的服务器接受了相同的投票,则认为选出了 Leader。 5. **改变服务器状态**: - 确定 Leader 后,所有服务器更新自己的状态。如果是 Follower,则变更为 FOLLOWING,如果是 Leader,则变更为 LEADING。 #### 2. 服务器运行时期的 Leader 选举 在 Zookeeper 运行期间,Leader 服务器挂掉时,需要进行 Leader 选举。假设当前集群中有 Server1、Server2、Server3 三台服务器,当前 Leader 是 Server2,当 Server2 挂掉时,选举过程如下: 1. **变更状态**: - Leader 挂掉后,所有非 Observer 服务器将自己的状态变更为 LOOKING,并进入 Leader 选举过程。 2. **每个 Server 发出一个投票**: - 服务器根据当前的 ZXID 进行投票。例如:Server1 的 ZXID 为 123,Server3 的 ZXID 为 122。投票情况分别为 (1, 123),(3, 122)。 3. **接受并处理投票**: - 处理方式与启动时期的 Leader 选举过程相同,优先比较 ZXID,如果 ZXID 相同,则比较 myid。 4. **统计投票**: - 与启动时期的 Leader 选举过程相同,统计投票信息,判断是否有过半机器接受了相同的投票信息。 5. **改变服务器状态**: - 确定 Leader 后,所有服务器更新自己的状态,Follower 变更为 FOLLOWING,Leader 变更为 LEADING。 #### 3. Leader 选举算法分析 Zookeeper 3.4.0 之后的版本只保留了 TCP 版本的 FastLeaderElection 选举算法。Leader 选举算法的步骤如下: 1. **第一次投票**: - 所有服务器处于 LOOKING 状态,发送第一次投票。投票中包含 SID(服务器的唯一标识)和 ZXID(事务 ID),形式为 (SID, ZXID)。 2. **变更投票**: - 接收并处理外部投票,根据以下规则进行比较: - 如果外部投票的 ZXID 大于内部投票的 ZXID,认可外部投票并发送。 - 如果外部投票的 ZXID 小于内部投票的 ZXID,保持内部投票不变。 - 如果 ZXID 相同,则比较 SID,SID 大的投票优先。 3. **确定 Leader**: - 统计投票信息,如果有过半数服务器接受了相同的投票,则确定该投票对应的服务器为 Leader。 4. **更新服务器状态**: - 确定 Leader 后,更新服务器状态,Follower 更新为 FOLLOWING,Leader 更新为 LEADING。 #### 4. Leader 选举实现细节 1. **服务器状态**: - LOOKING:寻找 Leader 状态。 - FOLLOWING:跟随者状态。 - LEADING:领导者状态。 - OBSERVING:观察者状态。 2. **投票数据结构**: - id:被推举的 Leader 的 SID。 - zxid:被推举的 Leader 事务 ID。 - electionEpoch:逻辑时钟,用来判断多个投票是否在同一轮选举周期中。 - peerEpoch:被推举的 Leader 的 epoch。 - state:当前服务器的状态。 3. **QuorumCnxManager:网络 I/O**: - 负责各台服务器之间的网络通信,管理消息接收和发送队列。 4. **FastLeaderElection:选举算法核心**: - 选票管理:管理发送和接收队列,处理外部和内部投票。 - 算法核心:自增选举轮次、初始化选票、发送选票、接收外部投票、判断选举轮次、选票 PK、变更投票、选票归档、统计投票、更新服务器状态。 通过上述步骤,Zookeeper 集群能够选举出新的 Leader,保证集群的正常运行。 参考[Zookeeper的Leader选举](https://www.cnblogs.com/leesf456/p/6107600.html)发布于 2024-08-05 16:15 •IP属地 贵州举报评论收藏
公众号进入网站体验更佳

