文章目录

  • Pre
  • 非事务性请求处理过程
  • 源码分析
  • 选举过程
    • 在这里插入图片描述
    • Leader 失效发现
    • Leader 重新选举
    • Follow 角色变更
    • 集群同步数据
  • 源码解析
  • 小结

Pre

在 ZooKeeper 集群中,Leader 服务器主要负责处理来自客户端的事务性会话请求,并在处理完事务性会话请求后,管理和协调 ZooKeeper 集群中 Follow 和 Observer 等角色服务器的数据同步。

因此,在 ZooKeeper 集群中,Leader 服务器是最为核心的服务器,一个 ZooKeeper 服务在集群模式下运行,必须存在一个 Leader 服务器。

而在 ZooKeeper 集群中,是通过崩溃选举的方式来保证 ZooKeeper 集群能够一直存在一个 Leader 服务器对外提供服务的。

那么在 ZooKeeper 集群选举出 Leader 的过程中,Follow 服务器又做了哪些工作?

清楚不同状态下服务器的处理逻辑和相关操作 ,有助于我们掌握整个 ZooKeeper 集群服务的运行过程, 使我们在日常工作中,更好地开发 ZooKeeper 相关服务,并在运维过程中快速定位问题,搭建更加高效稳定的 ZooKeeper 服务器。


非事务性请求处理过程

在 ZooKeeper 集群接收到来自客户端的请求后,会首先判断该会话请求的类型,如是否是事务性请求。

所谓事务性请求,是指 ZooKeeper 服务器执行完该条会话请求后,是否会导致执行该条会话请求的服务器的数据或状态发生改变,进而导致与其他集群中的服务器出现数据不一致的情况。

这里我们以客户端发起的数据节点查询请求为例,分析一下 ZooKeeper 在处理非事务性请求时的实现过程。

当 ZooKeeper 集群接收到来自客户端发送的查询会话请求后,会将该客户端请求分配给 Follow 服务器进行处理。

而在 Follow 服务器的内部,也采用了责任链的处理模式来处理来自客户端的每一个会话请求。

Leader 服务器的处理链过程,分别包含预处理器阶段、Proposal 提交处理器阶段以及 final 处理器阶段。

与 Leader 处理流程不同的是,在 Follow 角色服务器的处理链执行过程中,FollowerRequestProcessor 作为第一个处理器,主要负责筛选该条会话请求是否是事务性的会话请求。如果是事务性的会话请求,则转发给 Leader 服务器进行操作。如果不是事务性的会话请求,则交由 Follow 服务器处理链上的下一个处理器进行处理。

而下一个处理器是 CommitProcessor ,该处理器的作用是对来自集群中其他服务器的事务性请求和本地服务器的提交请求操作进行匹配。匹配的方式是,将本地执行的 sumbit 提交请求,与集群中其他服务器接收到的 Commit 会话请求进行匹配,匹配完成后再交由 Follow 处理链上的下一个处理器进行处理。

最终,当一个客户端会话经过 Final 处理器操作后,就完成了整个 Follow 服务器的会话处理过程,并将结果响应给客户端。


源码分析

ZooKeeper 集群在接收到来自客户端的请求后,会将请求交给 Follow 服务器进行处理。而 Follow 服务器内部首先调用的是 FollowerZooKeeperServer 类,该类的作用是封装 Follow 服务器的属性和行为,你可以把该类当作一台 Follow 服务器的代码抽象。

FollowerZooKeeperServer 类继承了 LearnerZooKeeperServer 。在一个 FollowerZooKeeperServer 类内部,定义了一个核心的 ConcurrentLinkedQueue 类型的队列字段,用于存放接收到的会话请求。


在定义了 FollowerZooKeeperServer 类之后,在该类的 setupRequestProcessors 函数中,定义了处理责任链,指定了该处理链上的各个处理器。如下面的代码所示,分别按顺序定义了起始处理器 FollowerRequestProcessor 、提交处理器 CommitProcessor、同步处理器 SendAckRequestProcessor 以及最终处理器 FinalProcessor。

protected void setupRequestProcessors() {RequestProcessor finalProcessor = new FinalRequestProcessor(this);commitProcessor = new CommitProcessor(finalProcessor,Long.toString(getServerId()), true, getZooKeeperServerListener());commitProcessor.start();firstProcessor = new FollowerRequestProcessor(this, commitProcessor);((FollowerRequestProcessor) firstProcessor).start();syncProcessor = new SyncRequestProcessor(this,new SendAckRequestProcessor((Learner)getFollower()));syncProcessor.start();

选举过程

介绍完 Follow 服务器处理非事务性请求的过程后,接下来我们再学习一下 Follow 服务器的另一个主要的功能:在 Leader 服务器崩溃的时候,重新选举出 Leader 服务器。

ZooKeeper 集群重新选举 Leader 的过程本质上只有 Follow 服务器参与工作。

而在 ZooKeeper 集群重新选举 Leader 节点的过程中主要可以分为 Leader 失效发现、重新选举 Leader 、Follow 服务器角色变更、集群同步这几个步骤。

Leader 失效发现

在 ZooKeeper 集群中,当 Leader 服务器失效时,ZooKeeper 集群会重新选举出新的 Leader 服务器。也就是说,Leader 服务器的失效会触发 ZooKeeper 开始新 Leader 服务器的选举,那么在 ZooKeeper 集群中,又是如何发现 Leader 服务器失效的呢?

这里就要介绍到 Leader 失效发现。和之前介绍的保持客户端活跃性的方法,它是通过客户端定期向服务器发送 Ping 请求来实现的。

在 ZooKeeper 集群中,探测 Leader 服务器是否存活的方式与保持客户端活跃性的方法非常相似。首先,Follow 服务器会定期向 Leader 服务器发送 网络请求,在接收到请求后,Leader 服务器会返回响应数据包给 Follow 服务器,而在 Follow 服务器接收到 Leader 服务器的响应后,如果判断 Leader 服务器运行正常,则继续进行数据同步和服务转发等工作,反之,则进行 Leader 服务器的重新选举操作。


Leader 重新选举

当 Follow 服务器向 Leader 服务器发送状态请求包后,如果没有得到 Leader 服务器的返回信息,这时,如果是集群中个别的 Follow 服务器发现返回错误,并不会导致 ZooKeeper 集群立刻重新选举 Leader 服务器,而是将该 Follow 服务器的状态变更为 LOOKING 状态,并向网络中发起投票,当 ZooKeeper 集群中有更多的机器发起投票,最后当投票结果满足多数原则的情况下。ZooKeeper 会重新选举出 Leader 服务器。


Follow 角色变更

在 ZooKeeper 集群中,Follow 服务器作为 Leader 服务器的候选者,当被选举为 Leader 服务器之后,其在 ZooKeeper 集群中的 Follow 角色,也随之发生改变。也就是要转变为 Leader 服务器,并作为 ZooKeeper 集群中的 Leader 角色服务器对外提供服务。


集群同步数据

在 ZooKeeper 集群成功选举 Leader 服务器,并且候选 Follow 服务器的角色变更后。为避免在这期间导致的数据不一致问题,ZooKeeper 集群在对外提供服务之前,会通过 Leader 角色服务器管理同步其他角色服务器.


源码解析

首先,ZooKeeper 集群会先判断 Leader 服务器是否失效,而判断的方式就是 Follow 服务器向 Leader 服务器发送请求包,之后 Follow 服务器接收到响应数据后,进行解析,如下面的代码所示,Follow 服务器会根据返回的数据,判断 Leader 服务器的运行状态,如果返回的是 LOOKING 关键字,表明与集群中 Leader 服务器无法正常通信。

switch (rstate) {case 0:ackstate = QuorumPeer.ServerState.LOOKING;break;case 1:ackstate = QuorumPeer.ServerState.FOLLOWING;break;case 2:ackstate = QuorumPeer.ServerState.LEADING;break;case 3:ackstate = QuorumPeer.ServerState.OBSERVING;break;default:continue;

之后,在 ZooKeeper 集群选举 Leader 服务器时,是通过 FastLeaderElection 类实现的。该类实现了 TCP 方式的通信连接,用于在 ZooKeeper 集群中与其他 Follow 服务器进行协调沟通。

FastLeaderElection 类继承了 Election 接口,定义其是用来进行选举的实现类。而在其内部,又定义了选举通信相关的一些配置参数,比如 finalizeWait 最终等待时间、最大通知间隔时间 maxNotificationInterval 等。

在选举的过程中,首先调用 ToSend 函数向 ZooKeeper 集群中的其他角色服务器发送本机的投票信息,其他服务器在接收投票信息后,会对投票信息进行有效性验证等操作,之后 ZooKeeper 集群统计投票信息,如果过半数的机器投票信息一致,则集群就重新选出新的 Leader 服务器。

static public class ToSend {static enum mType {crequest, challenge, notification, ack}ToSend(mType type,long leader,long zxid,long electionEpoch,ServerState state,long sid,long peerEpoch,byte[] configData) {this.leader = leader;this.zxid = zxid;this.electionEpoch = electionEpoch;this.state = state;this.sid = sid;this.peerEpoch = peerEpoch;this.configData = configData;}

小结

我们知道在 ZooKeeper 集群中 Follow 服务器的功能和作用。Follow 服务器在 ZooKeeper 集群服务运行的过程中,负责处理来自客户端的查询等非事务性的请求操作。当 ZooKeeper 集群中旧的 Leader 服务器失效时,作为投票者重新选举出新的 Leader 服务器。

这里我们要注意一个问题,那就是在重新选举 Leader 服务器的过程中,ZooKeeper 集群理论上是无法进行事务性的请求处理的。因此,发送到 ZooKeeper 集群中的事务性会话会被挂起,暂时不执行,等到选举出新的 Leader 服务器后再进行操作。

Apache ZooKeeper - 集群中 Follow 的作用_非事务请求的处理与 Leader 的选举分析相关推荐

  1. Apache ZooKeeper - 集群中 Observer 的作用以及 与 Follow 的区别

    文章目录 Pre Observer 介绍 源码解析 INFORM 消息 Observer 处理链 小结 Pre 在 ZooKeeper 集群服务运行的过程中,Follow 服务器主要负责处理来自客户端 ...

  2. Apache ZooKeeper - 集群中 Leader 的作用_事务的请求处理与调度分析

    文章目录 事务性请求处理 Leader 事务处理分析 预处理阶段 事务处理阶段 事务执行阶段 响应阶段 源码分析 小结 Leader 服务器在 ZooKeeper 中的作主要是处理事务性的会话请求以及 ...

  3. Apache ZooKeeper - ZooKeeper 集群中 Leader 与 Follower 的数据同步策略

    文章目录 流程图 why ? How ? 何时触发数据同步的机制? 同步哪些数据 同步方式 DIFF 同步 TRUNC+DIFF 同步 TRUNC 同步 SNAP 同步 同步后的处理 源码分析 流程图 ...

  4. Apache Zookeeper 集群环境搭建

    Zookeeper 是 一个分布式.开放源码的分布式应用程序协调服务,是Google Chubby的一个开源实现,大多数的分布式应用都需要Zookeeper的支持,这篇文章先简单的和大家分享如何搭建一 ...

  5. 为什么zookeeper集群中节点配置个数是奇数个?

    Zookeeper的大部分操作都是通过选举产生的.比如,标记一个写是否成功是要在超过一半节点发送写请求成功时才认为有效.同样,Zookeeper选择领导者节点也是在超过一半节点同意时才有效.最后,Zo ...

  6. Zookeeper集群一致性原理(强一致性)

    @T- CZookeeper集群一致性原理(强一致性) 强一致性,弱一致性,最终一致性概念 强一致性概念 步骤1修改了userName为beid- uxing,步骤2读到的结果也一定是为beid- u ...

  7. 终于知道了Zookeeper在hbase集群中的作用

    1.Hbase集群组件架构 Hbase集群主要的服务组件是Zookeeper,Hmaster和RegionServer.其中Hbase集群强依赖与Zookeeper提供的服务.为什么Hbase离不开Z ...

  8. zeekooper集群搭建_How to do - ZooKeeper集群搭建(我见过最详细的完整教学)

    ZooKeeper集群介绍 最典型集群模式: Master/Slave 模式(主备模式).在这种模式中,通常 Master服务器作为主服务器提供写服务,其他的 Slave 服务器从服务器通过异步复制的 ...

  9. Linux 环境 zookeeper集群安装、配置、测试

    架构说明: Dubbo 建议使用 Zookeeper 作为服务的注册中心.Zookeeper 集群中只要有过半的节点是正常的情况下,那么整个集群对外就是可用的.正是基于这个特性, 要将 ZK 集群的节 ...

最新文章

  1. python3.x安装cv2失败
  2. iOS逆向(8)-Monkey、Logos
  3. LeetCode OJ -Happy Number
  4. 他山之石:五个互联网英雄的创业启示!
  5. 普通用户Mysql 5.6.13 主从,主主及nagios的mysql slave监控
  6. HTTP消息中Header头部信息整理
  7. 一、 zedboardubuntu 14.04 的前期准备(定期更新)
  8. 【译】Silverlight for Windows Phone Toolkit In Depth(五)
  9. 遗传算法求解装箱问题c语言,装箱或背包问题? (或者遗传算法解决)
  10. 踏踏实实学javascript--javascript中的变量
  11. 身高回归现象是否真的存在?
  12. java 多个引用指向同一个对象(含案例图解)
  13. 全球最牛逼的并发架构,抖音排第二,它排第一!
  14. 新拉下来的vue项目怎么跑起来?
  15. 程序员情人节脱单指南
  16. linux下安装python3报错_Linux中安装python3
  17. 百川云旺客服申请测试流程
  18. php根据城市获取天气预报,中国天气网 天气预报API 国家气象局 根据城市名称抓取城市(示例代码)...
  19. 扫描器可发现远程服务器,服务器扫描发现漏洞-可通过HTTP获取远端WWW服务信息...
  20. 《文明之光 第二册》一一 10.4 罗卡尔角的夕阳—— 葡、西的殖民时代(4)

热门文章

  1. es6数组初始化_ES6 迭代器(Iterator)和 for...of循环使用方法
  2. pytorch的多分类问题
  3. 【毕业求职季】-听说你想去大厂看学妹,教你京东软件产品经理面试如何一把过
  4. Tableau系列之使用日期
  5. 偏见方差的权衡(Bias Variance Tradeoff)
  6. DELL服务器安装过程中的三种模式AHCI, ATA, RAID
  7. LeetCode-剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
  8. QTexe软件设置系统默认的图标
  9. 35+ Top Apache Tomcat Interview Questions And Answers【转】
  10. elasticsearch版本不同,批量查询也不相同