zookeeper源码 — 三、集群启动—leader、follower同步

本文详细介绍了Zookeeper集群启动时的Leader和Follower同步过程,包括设置服务器状态、同步准备和同步策略。同步过程中,Leader等待Follower连接并验证信息,根据Follower的ZXID确定同步策略,确保数据一致。同步完成后,集群即可处理客户端请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

zookeeper集群启动的时候,首先读取配置,接着开始选举,选举完成以后,每个server根据选举的结果设置自己的角色,角色设置完成后leader需要和所有的follower同步。上面一篇介绍了leader选举过程,这篇接着介绍启动过程中的leader和follower同步过程。

本文结构如下:

  • 同步过程
  • 总结

同步过程

设置server当前状态

在这里插入图片描述

server刚启动的时候都处于LOOKING状态,选举完成后根据选举结果和对应配置进入对应的状态,设置状态的方法是:

private void setPeerState(long proposedLeader, SyncedLearnerTracker voteSet) {
    ServerState ss = (proposedLeader == self.getId()) ?
            ServerState.LEADING: learningState();
    self.setPeerState(ss);
    if (ss == ServerState.LEADING) {
        leadingVoteSet = voteSet;
    }
}
  1. 如果当前server.myId等于选举出的leader的myId——也就是proposedLeader,则当前server就是leader,设置peerState为ServerState.LEADING
  2. 否则判断当前server的具体角色,因为follower和observer都是learner,需要根据各自的配置来决定该server的状态(配置文件里面的key是peerType,可选的值是participant、observer,如果不配置learnerType默认是LearnerType.PARTICIPANT)
    1. 如果配置的learnerType是LearnerType.PARTICIPANT,则状态为ServerState.FOLLOWING
    2. 否则,状态为ServerState.OBSERVING

准备同步

leader开始工作的入口就是leader.lead方法,这里的leader是Leader的实例,如下图所示

在这里插入图片描述

准备的过程是:

  • 创建leader的实例,Leader,构造方法中传入LeaderZooKeeperServer的实例
  • 调用leader.lead
    • 加载ZKDatabase
    • 监听指定的端口(配置的用来监听learner连接请求的端口,配置的第一个冒号后的端口),接收来自follower的请求
    • while循环,检查当前选举的状态是否发生变化需要重新进行选举

同时,follower设置完自己的状态后,也开始进行类似leader的工作

在这里插入图片描述

  • 创建follower,也就是Follower的实例,同时创建FollowerZooKeeperServer
  • 建立和leader的连接

进行同步

同步的总体过程如下:

在这里插入图片描述

在准备阶段完成follower连接到leader,具备通信状态

  1. leader阻塞等待follower发来的第一个packet
    1. 校验packet类型是否是Leader.FOLLOWERINFO或者Leader.OBSERVERINFO
    2. 读取learner信息
      1. sid
      2. protocolVersion
      3. 校验follower的version不能比leader的version还要新
  2. leader发送packet(Leader.LEADERINFO)给follower
  3. follower收到Leader.LEADERINFO后给leader回复Leader.ACKEPOCH
  4. leader根据follower ack的packet内容来决定同步的策略
    1. lastProcessedZxid == peerLastZxid,leader的zxid和follower的相同
    2. peerLastZxid > maxCommittedLog && !isPeerNewEpochZxid follower超前,删除follower多出的txlog部分
    3. (maxCommittedLog >= peerLastZxid) && (minCommittedLog <= peerLastZxid) follower落后于leader,处于leader的中间 同步(peerLaxtZxid, maxZxid]之间的commitlog给follower
    4. peerLastZxid < minCommittedLog && txnLogSyncEnabled follower落后于leader,使用txlog和commitlog同步给follower
    5. 接下来leader会不断的发送packet给follower,follower处理leader发来的每个packet
  5. 同步完成后follower回复ack给leader
  6. leader、follower进入正式处理客户端请求的while循环

总结

zookeeper为了保证启动后leader和follower的数据一致,在启动的时候就进行数据同步,leader与follower数据传输的端口和leader选举的端口不一样。数据同步完成后就可以接受client的请求进行处理了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值