这篇博客主要是解析了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. 轻量级CI/CD发布部署环境搭建及使用_03_docker安装harbor

    轻量级CI/CD发布部署环境搭建及使用_03_docker安装harbor 授人以鱼不如授人以渔,如果说的别人都没明白,说明自己实际也不是太明白   1,下载docker-compose sudo c ...

  2. asp汉字转拼音小写

    <%'//获取汉字的首字母 ,ANSII编码function getpychar(char) dim tmpp:tmpp=65536+asc(char) if(tmpp>=45217 an ...

  3. 第七周作业-N67044-张铭扬

    1. 说明自动化运维的路径,原理,实践方法. 所谓自动化运维是指通过将日常IT运维中大量的重复性工作(小到简单的日常检查.配置变更和软件安装,大到整个变更流程的组织调度)由过去的手工执行转为标准化.流 ...

  4. vscode 开发c++

    makefile.mk #makefile.mk 公共头文件 ifndef TARGET # /root/make/src/test_include # notdir TARGET:=$(notdir ...

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

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

  6. 2.3 在DispatcherServlet的构造方法中解析applicationContext.xml配置文件

    package com.hy.servlet; import java.io.IOException; import java.io.InputStream; import java.util.Map ...

  7. 时间序列分析2.X AR与MA

    ARMA与ARIMA模型 对平稳时间序列和非平稳时间序列,分别假定适当的 ARMA 模型和 ARIMA 模型 对非平稳时间序列建立 ARIMA 模型,实际上是通过先用适当的变换将非平稳序列转化为平稳序 ...

  8. TensorFlow的基础结构

    Tensorflow 是非常重视结构的, 我们得建立好了神经网络的结构, 才能将数字放进去, 运行这个结构. 这个例子简单的阐述了 tensorflow 当中如何用代码来运行我们搭建的结构. 创建数据 ...

  9. Codeforces 919E Congruence Equation(循环节+数论)

    Link 题意 给$n, m, p, x$,求有多少个$n(1\leq n \leq x)$使得$n·a^{n}=b(\textrm{mod}\;p)$成立 思路 考虑一下左边的循环节长度,由于$n% ...

  10. GBDT初识

    GBDT的决策树: ​ 无论是处理回归任务还是二分类以及多分类任务,GBDT使用的决策树是CART回归树.因为GBDT每次迭代要拟合的是梯度值,是连续值所以要用回归树. ​ 对于回归树算法来说最重要的 ...