这篇博客主要是解析了Leader,Follower 对象的创建,相对来说比较简单,主要是了解一下在实例化的时候创建了哪些对象,这些对象会在数据传输的过程中发挥比较打的作用,如果有了解过的,可以直接跳过

因为Zookeeper 启动的一些加载在前一篇文章zookeeper选举流程源码解析 中已经进行解析过了,这里直接从QuorumPeer.run方法开始,在通过快速选举机制选出来Leader,Follower 后会进行相应的对象创建

我们从Leader 开始解析,客户端所有的写操作都是经过leader处理,然后将数据同步给Follower, Observer

QuorumPeer.run.Leading

在确认当前节点为leading节点的时候,会通过

makeLeader 创建leader 对象见QuorumPeer.makeLeader

leader.lead启动见Leader.lead

QuorumPeer.makeLeader

QuorumPeer.makeLeader



Leader.lead

Leader.lead

因为这里只跟主流程,省略了一些代码,防止代码太过繁琐杂乱

1: 会创建一个线程专门处理leader 节点和follower节点socket连接,见LearnerCnxAcceptor

2; 启动Leader Zookeeper, 见 startZkServer

LearnerCnxAcceptor

LearnerCnxAcceptor



LeaderHandler是每一个连接都有一个新建了一个线程处理,和选举的机制相似,在LeaderHandler的run 方法中执行具体的逻辑,见LeaderHandler.run

LeaderHandler#run

LeaderHandler.run

这里只截取了部分代码,可以看到会根据数据的不同类型走不同的逻辑,比如说ping, ack等,具体的代码后续再分析

Leader#startZkServer

startZkServer

zk.startup -> LeaderZooKeeperServer.startup -> ZooKeeperServer.startup , 这里最终会调用到 ZooKeeperServer.startup,见ZooKeeperServer.startup

ZooKeeperServer.startup

ZooKeeperServer.startup



为了让processor 有更直观的影响,这里先展示一下processor 的链式调用图如下

并且因为zk对象是LeaderZookeeperServer,所以setupReuqestProcessors方法会调用LeaderZookeeperServersetupReuqestProcessors方法,见LeaderZookeeperServer#setupReuqestProcessors

LeaderZookeeperServer#setupReuqestProcessors

LeaderZookeeperServer#setupReuqestProcessors

总结一下:

1: 在方法中主要是创建了一系列的Processor 对象

2:commitProcessor, SyncRequestProcessor, PreRequestProcessor这3个对象都是继承与Thread, 直接在这个位置启动了线程,这里稍微在解释一下,因为这3个线程的run 方法中都有从阻塞队列中获取数据,因为这时候还没有和客户端进行交互,这个时候都是处于阻塞的状态,这里的run 方法就不在这里解析了,在和zk 客户端交互的时候再进行解析

好了,LeaderZookeeperServer的启动流程就暂时先介绍到这里,下面说一下Follower 的启动流程

QuorumPeer.run.Following

执行FillowLeader方法见Follower#followLeader

Follower#followLeader

Follower#followLeader

稍微总结一下:

1: 首先是根据投票信息获取leader 节点的对象

2: 和leader 节点建立连接,如果阅读过Leader 节点的创建,应该了解到,在创建leaderServer对象的时候,会创建一个同步数据的socket ss, 然后阻塞在accept 方法上,这里follower 就是和这个socket 对象进行连接, 见 connectToLeader

3: 与leader 进行数据同步,比如说这个节点是新加入的,不存在任何数据,那么需要将之前的数据进行同步,或者某个节点网络分区了,后续重新加入进来,为了保持数据一致性,也需要数据同步,同时也是在这里调用startup 方法启动followerServer的, 见syncWithLeader

4: 死循环接收leader同步数据,就是真正实现处理ZAB 协议的代码

Learner#connectToLeader

connectToLeader

Learner#syncWithLeader

syncWithLeader

这个方法主要是实现了Follower 在启动的时候 和 Leader 数据同步,主要是同步Leader 主节点点中已经执行过,但是Follower 中还不存在的数据, ZK 提供了4种同步方式

  1. DIFF 差异化同步,一般都是Leader 节点事务 > Follower 节点
  2. TRUNC 回滚操作, Follower 节点日志回滚到和Leader 节点一直的情况
  3. TRUNC+DIFF 回滚+同步 一般是Follower 服务器上存在一条事务日志,但是在Leader 上不存在,这种情况出现较少,只有在前leader 节点出现宕机了,然后选举新节点的后才可能发生
  4. SNAP 全量更新,就是集群新加入一个节点,会优先全量同步数据

然后跟leader 节点一样,调用了startup 设置了一些processor,见,startup

ZooKeeperServer.startup

ZooKeeperServer.startup

这里的和Leader 不一样,这里的Server 是FollowerKeeperServer

FollowerKeeperServer#setupRequestProcessors

这里构建的方式也是一样,构建了Processor 链,如下图,同时CommitProcessor, SyncProcessor 都是线程子类,在启动的时候因为队列为空,被阻塞住,不过commitProcess 是调用了wait 方法, 而 SyncProcessor是因为阻塞队列的原因被阻塞住

好了,在这里Follower 启动分析基本完成,有了这些基本储备,我将在下一篇博客根据流程分析一下数据从客户端到服务端操作完成后返回数据的整个流程

Zookeeper ZAB协议-Leader&Followe 对象创建和启动源码解析的更多相关文章

  1. Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明

    Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明 作者: Grey 原文地址: 博客园:Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明 C ...

  2. Celery 源码解析三: Task 对象的实现

    Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...

  3. Zookeeper ZAB 协议分析[转]

    写在开始:这是我找到一篇比较好的博客,转载到这来进行备份原文参考: Zookeeper ZAB 协议分析 前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播 ...

  4. zookeeper集群搭建及Leader选举算法源码解析

    第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...

  5. dubbo源码解析-zookeeper创建节点

    前言 在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码 ...

  6. zookeeper使用详解(命令、客户端、源码)

    1. zookeeper使用详解(命令.客户端.源码) 1.1. 前言   zookeeper我们常用来做分布式协调中间件,很多时候我们都接触不到它的原理和用法,我对他的了解也仅限于知道它可以做分布式 ...

  7. 设置ZooKeeper服务器地址列表源码解析及扩展

    设置ZooKeeper服务器地址列表源码解析及扩展 ZooKeeper zooKeeper = new ZooKeeper("192.168.109.130:2181",SESSI ...

  8. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  9. Surface在C++层的创建源码解析

    Surface在C++层的创建源码解析 源码为:android4.4.4 1.创建SurfaceComposerClient绘图客户端 // create a client to surfacefli ...

  10. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

随机推荐

  1. springboot跳转页面404的问题

    今天测试的时候出现了这个问题: Cannot forward to error page for request [/] as the response has already been commit ...

  2. plesk 关闭维护模式

    最近遇到访问plesk时出现maintanase mode模式,于是网上搜了答案都是老外的,且没有明确怎么解决,但可能造成这一问题的原因也很多,我这个是这么解决的,和大家分享下,希望可以起到一个思路引 ...

  3. uniapp开发使用 web-view APP 与 H5 (vue)通信

    需求:这边是uniapp开发的APP  需要内嵌H5(vue),就得使用web-view跳转网页 H5端 在vue的index,html文件引入web-view的插件 <script type= ...

  4. DOM04~

    事件对象及属性 事件对象 事件流 事件委托 综合案例 事件对象 获取事件对象 事件对象常用属性 什么是事件对象? 1.1 也是个对象,这个对象里有事件触发时的相关信息 1.2 例如鼠标点击事件中,事件 ...

  5. C#获取enum描述信息

    public enum LogLevelEnum { [Description("未分配")] None = 0, [Description("非常重要")] ...

  6. 如何用HP 39GS计算器画出双曲线图像

    1.双曲线标准方程和参数方程 2.计算器上的操作 1.打开APLET->Parametric->START 2.设置X1(T)=3/COS(T),X2(T)=4*TAN(T) 3.SHIF ...

  7. 肖sir ___性能测试____多线程

    一.理论 (一) (1)多线程是Python程序中实现多任务的一种方式(2)线程是程序执行的最小单位. (3)同属一个进程的多个线程共享进程所拥有的全部资源. (二)进程和线程对比 (1)关系对比: ...

  8. (app笔记)Appium如何开启、配置、启用

    1.安装adb 2.打开手机调试 3.连接手机 4.appium运行前,手机需要io.appium.uiautomator2.server 和 Appium Settings. 5.appium操作: ...

  9. jQuery-强大的jQuery选择器 (详解)

    jq除常用的选择写法之外的更多方法记录. 原文:jQuery-强大的jQuery选择器 (详解)[转] 1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("di ...

  10. Springboot+Vue实现短信与邮箱验证码登录

    体验网址:http://mxyit.com 示例 1.新增依赖 <!-- 短信服务 --> <dependency> <groupId>com.aliyun< ...