美文网首页
Zookeeper-follower 初始化

Zookeeper-follower 初始化

作者: maxam0128 | 来源:发表于2019-12-13 00:36 被阅读0次

Follower 初始化

选举完成后,节点状态被初始化为FOLLOWING,之后创建follower节点,跟随leader并从leader同步数据。

1、Follower 相关类

  • Follower:follower的控制逻辑
  • FollowerZookeeperServer:客户端请求处理、同步leader数据

2、follower控制逻辑

在follower 初始化完成后,通过 follower#followLeader 来跟随leader。

1、寻找leader节点

寻找leader节点通过Learner#findLeader实现。遍历所有节点,通过投票信息找出leaderId。

2、连接leader

通过Learner#connectToLeader 和上一步找到的leader建立连接,如果失败默认会重试不辞

3、同步新的选举周期

这一步和leader的数据交互都是同步的,有以下几个步骤:

  • 1、发送FOLLOWERINFO(serverId,zxid,协议版本等)给leader
  • 2、收到 LEADERINFO 数据后,解析出leader的 newEpoch;回复 ACKEPOCH 数据包(包括follower 的lastLoggedZxid)给leader。
  • 3、将 leader# newEpoch 封装成zxid 返回。

4、向Leader同步数据

通过Learner#syncWithLeader 实现数据同步。这一步leader 会根据 follower 之前回复的ack数据包中lastLoggedZxid 来确定同步策略(参考leader初始化篇)。

1、数据同步前处理

在数据开始同步前,follower会根据leader 发送的数据同步策略预先做一些处理

  • DIFF:等待差异化同步
  • SNAP:清除follower db,使用来自leader的数据覆盖本地数据
  • TRUNC:将数据回滚到leader#zxid

2、同步数据

  • 1、将收到PROPOSAL 数据包放到packetsNotCommitted 队列中
  • 2、收到COMMIT时,取出packetsNotCommitted 首节点将其提交,之后移除首节点,将其加入到packetsCommitted 中
  • 3、处理NEWLEADER;leader将需要同步的数据都发给follower之后,会紧接着发送一个NEWLEADER 数据包给follower,意味着follower收到这个类型的数据包之后表示数据已同步完成,然后会回复ACK给leader。
  • 4、处理UPTODATE;在leader收到大多数follower发送的ACK消息之后,会启动自身服务,,启动完成之后会发送UPTODATE数据包给follower。follower收到这个数据包时,表示数据已经同步完,并且leader 服务已经开始对外服务。此时follower退出同步数据任务,开始启动自身服务。

3、启动 FollowerZookeeperServer

  • 1、创建并启动SessionTracker(LearnerSessionTracker)
  • 2、设置请求处理器;
  • 3、注册JMX,修改当前节点状态为RUNNING

4、处理snapshot 到 uptodate 之间的数据

再以snapshot的方式同步数据时,开始同步数据到follower 收到uptodate数据包之间有可能leader也有数据变更,这时需要将这部分数据提交。

经过以上的步骤之后,follower 服务启动完成。作为follower 它一方面需要处理来自客户端的请求,一方面也需要处理来自leader 的心跳数据和proposal和commit数据。

相关文章

  • Zookeeper-follower 初始化

    Follower 初始化 选举完成后,节点状态被初始化为FOLLOWING,之后创建follower节点,跟随le...

  • Swift 5.1 (14) - 初始化和反初始化

    Swift 5.1 (14) - 初始化和反初始化Swift 5.1 (14) - 初始化和反初始化

  • 字符串初始化方式比较

    初始化方法一: 用new String初始化的存储方式: 初始化方法2: 用"="初始化的存储方式: 此方法初始化...

  • 2020-07-21 类属性和对象属性 初始化

    对象属性初始化有3种方式: 声明对象属性时初始化 在构造方法中初始化 在初始化块中初始化 类属性初始化有2种方式:...

  • Swift5.1学习随笔之初始化器

    初始化器 类、结构体、枚举都可以定义初始化器(init) 类有2种初始化器:指定初始化器、便捷初始化器 指定初始化...

  • javaSE回顾_05

    数组: 静态初始化: //静态初始化 int[] a = {1,2,3}; 动态初始化: //动态初始化 int[...

  • 第3章 标准库类型string、vector、数组

    1.string的几种初始化方式 直接初始化与拷贝初始化拷贝初始化使用=,而直接初始化不使用 2. cbegin ...

  • 重捡Java(十二)类与对象 属性初始化

    对象属性初始化 对象属性初始化有3种1. 声明该属性的时候初始化2. 构造方法中初始化3. 初始化块 类属性初始化...

  • 十二、初始化

    初始化 类、结构体、枚举都可以定义初始化器 (本章主要讲类的初始化) 类有2种初始化器 指定初始化器 便捷初始化器...

  • [C++之旅] 11 初始化列表

    [C++之旅] 11 初始化列表 初始化列表的特性 初始化列表先于构造函数执行 初始化列表只能用于构造函数 初始化...

网友评论

      本文标题:Zookeeper-follower 初始化

      本文链接:https://www.haomeiwen.com/subject/jupqyctx.html