Zookeeper ZAB协议-Leader&Followe 对象创建和启动源码解析
这篇博客主要是解析了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
Leader.lead
因为这里只跟主流程,省略了一些代码,防止代码太过繁琐杂乱

1: 会创建一个线程专门处理leader 节点和follower节点socket连接,见LearnerCnxAcceptor
2; 启动Leader Zookeeper, 见 startZkServer
LearnerCnxAcceptor
LeaderHandler是每一个连接都有一个新建了一个线程处理,和选举的机制相似,在LeaderHandler的run 方法中执行具体的逻辑,见LeaderHandler.run
LeaderHandler#run
这里只截取了部分代码,可以看到会根据数据的不同类型走不同的逻辑,比如说ping, ack等,具体的代码后续再分析

Leader#startZkServer

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

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

并且因为zk对象是LeaderZookeeperServer,所以setupReuqestProcessors方法会调用LeaderZookeeperServer的setupReuqestProcessors方法,见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
稍微总结一下:
1: 首先是根据投票信息获取leader 节点的对象
2: 和leader 节点建立连接,如果阅读过Leader 节点的创建,应该了解到,在创建leaderServer对象的时候,会创建一个同步数据的socket ss, 然后阻塞在accept 方法上,这里follower 就是和这个socket 对象进行连接, 见 connectToLeader
3: 与leader 进行数据同步,比如说这个节点是新加入的,不存在任何数据,那么需要将之前的数据进行同步,或者某个节点网络分区了,后续重新加入进来,为了保持数据一致性,也需要数据同步,同时也是在这里调用startup 方法启动followerServer的, 见syncWithLeader
4: 死循环接收leader同步数据,就是真正实现处理ZAB 协议的代码
Learner#connectToLeader
Learner#syncWithLeader
这个方法主要是实现了Follower 在启动的时候 和 Leader 数据同步,主要是同步Leader 主节点点中已经执行过,但是Follower 中还不存在的数据, ZK 提供了4种同步方式
DIFF差异化同步,一般都是Leader 节点事务 > Follower 节点TRUNC回滚操作, Follower 节点日志回滚到和Leader 节点一直的情况TRUNC+DIFF回滚+同步 一般是Follower 服务器上存在一条事务日志,但是在Leader 上不存在,这种情况出现较少,只有在前leader 节点出现宕机了,然后选举新节点的后才可能发生SNAP全量更新,就是集群新加入一个节点,会优先全量同步数据
然后跟leader 节点一样,调用了startup 设置了一些processor,见,startup
ZooKeeperServer.startup
这里的和Leader 不一样,这里的Server 是FollowerKeeperServer
FollowerKeeperServer#setupRequestProcessors

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

好了,在这里Follower 启动分析基本完成,有了这些基本储备,我将在下一篇博客根据流程分析一下数据从客户端到服务端操作完成后返回数据的整个流程
Zookeeper ZAB协议-Leader&Followe 对象创建和启动源码解析的更多相关文章
- Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明
Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明 作者: Grey 原文地址: 博客园:Netty 学习(七):NioEventLoop 对应线程的创建和启动源码说明 C ...
- Celery 源码解析三: Task 对象的实现
Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...
- Zookeeper ZAB 协议分析[转]
写在开始:这是我找到一篇比较好的博客,转载到这来进行备份原文参考: Zookeeper ZAB 协议分析 前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播 ...
- zookeeper集群搭建及Leader选举算法源码解析
第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...
- dubbo源码解析-zookeeper创建节点
前言 在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码 ...
- zookeeper使用详解(命令、客户端、源码)
1. zookeeper使用详解(命令.客户端.源码) 1.1. 前言 zookeeper我们常用来做分布式协调中间件,很多时候我们都接触不到它的原理和用法,我对他的了解也仅限于知道它可以做分布式 ...
- 设置ZooKeeper服务器地址列表源码解析及扩展
设置ZooKeeper服务器地址列表源码解析及扩展 ZooKeeper zooKeeper = new ZooKeeper("192.168.109.130:2181",SESSI ...
- Spring IoC源码解析——Bean的创建和初始化
Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...
- Surface在C++层的创建源码解析
Surface在C++层的创建源码解析 源码为:android4.4.4 1.创建SurfaceComposerClient绘图客户端 // create a client to surfacefli ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
随机推荐
- LeetCode-2038 如果相邻两个颜色均相同则删除当前颜色
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-colored-pieces-if-both-neighbors-are-the-s ...
- Git多分支 远程仓库 协同开发以及解决冲突
目录 一.Git多分支及远程仓库 1.Git多分支 2.正常密码链接远程仓库 3.ssh公钥私钥方式链接远程仓库 三.协同开发及解决冲突 1.协同开发 2.解决冲突 四.线上分支合并及远程仓库回滚 1 ...
- linus->查看文件及文件夹大小相关命令
背景: 经常会遇到服务器服务突然停了,去服务器一看服务正常运行. 然后在排查服务器容量,发现100%使用. 那么记下来一些常用命令是有必要的. 相关命令: df -hl 查看占用情况. du -s ...
- mybatis动态标签——foreach批量添加和删除
<!-- [foreach标签] collection:设置要循环的数组或集合 item:用一个字符串表示数组或集合中的每一个数据 separator:设置每次循环的数据之间的分隔符 open: ...
- Codeforces Round #748 (Div. 3) - D2. Half of Same
数论 + 随机化 [Problem - D2 - Codeforces](https://codeforces.com/contest/1749/problem/D) 题意 给定一个长度为 \(n\; ...
- N63050 第十四周运维作业
就业和全程班小伙伴本周学习内容: 第二十七天: http协议和web服务器 1http的cookie和session详解 2LAMP架构和CGI与FASTCGI区别 3常见PHP的配置和php程序 4 ...
- C++基础复习题(笔试题)
C++基础~for循环:选择,判断 HELLO,亲爱的小朋友! 我们准备 35个选择题,对for循环及之前的内容进行一个简单的复习,快来看一下吧! 顺序&选择结构 1.对于C++中变量的命名规 ...
- go on
人生当中总是有你能力不及的范围,但是如果在你能力所及的范畴内你尽到了自己全部的努力,那你还有什么可以遗憾的呢?
- SpringBoot运行就停止
检查下是不是没有引入springboot-starter-web依赖 <dependency> <groupId>org.springframework.boot</gr ...
- unity 实现Game窗口的Stats 【转自蛮牛】
using UnityEngine;using System.Text;using UnityEditor; public class ShowFps : MonoBehaviour{ public ...







