文章目录

  • 流程图
  • Pre
  • 什么是集群模式?
  • ZooKeeper 集群模式的特点
  • 底层实现原理
    • 程序启动
    • QuorumPeer 类
  • Leader 服务器启动过程
  • Follow 服务器启动过程
  • 小结

流程图


Pre

Apache ZooKeeper -从初始化到对外提供服务的过程解析( 单机模式 )

我们知道了 ZooKeeper 在单机模式下从启动运行到对外提供服务的整个过程。在日常工作中,无论是出于性能上的优势还是可靠性的考虑,单机模式都无法满足要求。因此,ZooKeeper 也采用集群的方式运行。我们就来学习一下 ZooKeeper 集群模式下,启动过程的底层实现。


什么是集群模式?

为了解决单机模式下性能的瓶颈问题,以及出于对系统可靠性的高要求,集群模式的系统架构方式被业界普遍采用。

集群模式可以简单理解为将单机系统复制成几份,部署在不同主机或网络节点上,最终构成了一个由多台计算机组成的系统“集群”。而组成集群中的每个服务器叫作集群中的网络节点。

那问题来了 我们应该如何使用集群?当客户端发送一个请求到集群服务器的时候,究竟是哪个机器为我们提供服务呢?

为了解决这个问题,先介绍一个概念名词“调度者”。调度者的工作职责就是在集群收到客户端请求后,根据当前集群中机器的使用情况,决定将此次客户端请求交给哪一台服务器或网络节点进行处理,例如我们都很熟悉的负载均衡服务器就是一种调度者的实现方式。


ZooKeeper 集群模式的特点

通过上面的介绍,我们知道了集群是由网络中不同机器组成的一个系统,集群工作是通过集群中调度者服务器来协同工作的。

那么现在我们来看一下 ZooKeeper 中的集群模式,在 ZooKeeper 集群模式中,相比上面说到的集群架构方式,在 ZooKeeper 集群中将服务器分成 Leader 、Follow 、Observer 三种角色服务器,在集群运行期间这三种服务器所负责的工作各不相同:

  • Leader 角色服务器负责管理集群中其他的服务器,是集群中工作的分配和调度者。
  • Follow 服务器的主要工作是选举出 Leader 服务器,在发生 Leader 服务器选举的时候,系统会从 Follow 服务器之间根据多数投票原则,选举出一个 Follow 服务器作为新的 Leader 服务器。
  • Observer 服务器则主要负责处理来自客户端的获取数据等请求,并不参与 Leader 服务器的选举操作,也不会作为候选者被选举为 Leader 服务器。

接下来我们看看在 ZooKeeper 中集群是如何架构和实现的。

底层实现原理

到目前为止我们对 ZooKeeper 中集群相关的知识有了大体的了解,接下来我们就深入到 ZooKeeper 的底层,看看在服务端,集群模式是如何启动到对外提供服务的。

在上一篇博文中已经对 ZooKeeper 单机版服务的启动过程做了详细的介绍。而集群中的启动过程和单机版的启动过程有很多地方是一样的。所以本次我们只对 ZooKeeper 集群中的特有实现方式做重点介绍。


程序启动

首先,在 ZooKeeper 服务启动后,系统会调用入口 QuorumPeerMain 类中的 main 函数。在 main 函数中的 initializeAndRun 方法中根据 zoo.cfg 配置文件,判断服务启动方式是集群模式还是单机模式。

在函数中首先根据 arg 参数和 config.isDistributed() 来判断,如果配置参数中配置了相关的配置项,并且已经指定了集群模式运行,那么在服务启动的时候就会跳转到 runFromConfig 函数完成之后的集群模式的初始化工作。

protected void initializeAndRun(String[] args){...if (args.length == 1 && config.isDistributed()) {runFromConfig(config);} else {ZooKeeperServerMain.main(args);}
}

QuorumPeer 类

在 ZooKeeper 服务的集群模式启动过程中,一个最主要的核心类是 QuorumPeer 类。我们可以将每个 QuorumPeer 类的实例看作集群中的一台服务器。在 ZooKeeper 集群模式的运行中,一个 QuorumPeer 类的实例通常具有 3 种状态,分别是参与 Leader 节点的选举、作为 Follow 节点同步 Leader 节点的数据,以及作为 Leader 节点管理集群中的 Follow 节点。

介绍完 QuorumPeer 类后,下面我们看一下在 ZooKeeper 服务的启动过程中,针对 QuorumPeer 类都做了哪些工作。如下面的代码所示,在一个 ZooKeeper 服务的启动过程中,首先调用 runFromConfig 函数将服务运行过程中需要的核心工具类注册到 QuorumPeer 实例中去。

这些核心工具就是我们在单机版服务的启动中介绍的诸如 FileTxnSnapLog 数据持久化类、ServerCnxnFactory 类 NIO 工厂方法等。这之后还需要配置服务器地址列表、Leader 选举算法、会话超时时间等参数到 QuorumPeer 实例中。

public void runFromConfig(QuorumPeerConfig config){ServerCnxnFactory cnxnFactory = null;ServerCnxnFactory secureCnxnFactory = null;...quorumPeer = getQuorumPeer()quorumPeer.setElectionType(config.getElectionAlg());quorumPeer.setCnxnFactory(cnxnFactory);...
}

与开篇中提到的一般构建集群的方式不同,ZooKeeper 将集群中的机器分为 Leader 、 Follow 、Obervser 三种角色,每种角色服务器在集群中起到的作用都各不相同。

比如 Leader 角色服务器主要负责处理客户端发送的数据变更等事务性请求操作,并管理协调集群中的 Follow 角色服务器。

而 Follow 服务器则主要处理客户端的获取数据等非事务性请求操作。

Observer 角色服务器的功能和 Follow 服务器相似,唯一的不同就是不参与 Leader 头节点服务器的选举工作。

在 ZooKeeper 中的这三种角色服务器,在服务启动过程中也有各自的不同,下面我们就以 Leader 角色服务器的启动和 Follow 服务器服务的启动过程来看一下各自的底层实现原理。


Leader 服务器启动过程

在 ZooKeeper 集群中,Leader 服务器负责管理集群中其他角色服务器,以及处理客户端的数据变更请求。因此,在整个 ZooKeeper 服务器中,Leader 服务器非常重要。所以在整个 ZooKeeper 集群启动过程中,首先要先选举出集群中的 Leader 服务器。

在 ZooKeeper 集群选举 Leader 节点的过程中,首先会根据服务器自身的服务器 ID(SID)、最新的 ZXID、和当前的服务器 epoch (currentEpoch)这三个参数来生成一个选举标准。之后,ZooKeeper 服务会根据 zoo.cfg 配置文件中的参数,选择参数文件中规定的 Leader 选举算法,进行 Leader 头节点的选举操作。

而在 ZooKeeper 中提供了三种 Leader 选举算法,分别是

  • LeaderElection
  • AuthFastLeaderElection
  • FastLeaderElection

在我们日常开发过程中,可以通过在 zoo.cfg 配置文件中使用 electionAlg 参数属性来制定具体要使用的算法类型。

在 ZooKeeper 集群模式下服务启动后。首先会创建用来选举 Leader 节点的工具类 QuorumCnxManager 。

下面这段代码给出了 QuorumCnxManager 在创建实例的时候首先要实例化 Listener 对象用于监听 Leader 选举端口。

package org.apache.zookeeper.server.quorum;
public class QuorumCnxManager {...public QuorumCnxManager(QuorumPeer self) {String cnxToValue = System.getProperty("zookeeper.cnxTimeout")listener = new Listener();listener.setName("QuorumPeerListener");}...
}

而在 ZooKeeper 中,Leader 选举的大概过程,总体说来就是在集群中的所有机器中直接进行一次选举投票,选举出一个最适合的机器作为 Leader 节点。

而具体的评价标准就是我们上面提到的三种选举算法。而从 3.4.0 版本开始,ZooKeeper 只支持 FastLeaderElection 这一种选举算法。同时没有被选举为 Leader 节点的机器则作为 Follow 或 Observer 节点机器存在。


Follow 服务器启动过程

现在,我们已经选举出 ZooKeeper 集群模式下的 Leader 节点机器了。我们再看一下 Follow 节点机器在 ZooKeeper 集群模式下服务器的启动过程。

在服务器的启动过程中,Follow 机器的主要工作就是和 Leader 节点进行数据同步和交互。当 Leader 机器启动成功后,Follow 节点的机器会收到来自 Leader 节点的启动通知。而该通知则是通过 LearnerCnxAcceptor 类来实现的。该类就相当于一个接收器。专门用来接收来自集群中 Leader 节点的通知信息。

下面这段代码中 LearnerCnxAcceptor 类首先初始化要监听的 Leader 服务器地址和设置收到监听的处理执行方法等操作 。

class LearnerCnxAcceptor extends ZooKeeperCriticalThread {private volatile boolean stop = false;public LearnerCnxAcceptor() {super("LearnerCnxAcceptor-" + ss.getLocalSocketAddress(), zk.getZooKeeperServerListener());}}

在接收到来自 Leader 服务器的通知后,Follow 服务器会创建一个 LearnerHandler 类的实例,用来处理与 Leader 服务器的数据同步等操作。

package org.apache.zookeeper.server.quorum;
public class LearnerHandler extends ZooKeeperThread {protected final Socket sock;final Leader leader;...
}

在完成数据同步后,一个 ZooKeeper 服务的集群模式下启动的关键步骤就完成了,整个服务就处于运行状态,可以对外提供服务了。


小结

主要学习了 ZooKeeper 集群模式的启动过程和底层实现。与一般的集群架构不同,ZooKeeper 集群模式把其中的机器分成 Leader 、Follow 、Obsever 三种角色。

当作为 Leader 节点的机器失效时,系统会根据配置文件中的选举算法产生新的节点。这种方式避免了一般集群模式中产生的单点失效等问题。

那在我们日常使用 ZooKeeper 集群服务器的时候,集群中的机器个数应该如何选择?

答案是最好使用奇数原则,最小的集群配置应该是三个服务器或者节点。而如果采用偶数,在 Leader 节点选举投票的过程中就不满足大多数原则,这时就产生“脑裂”这个问题。

Apache ZooKeeper -从初始化到对外提供服务的过程解析( 集群模式 )相关推荐

  1. ZooKeeper【搭建 03】apache-zookeeper-3.6.0 伪集群版(一台服务器实现三个节点的ZooKeeper集群)

    为保证集群高可用,Zookeeper 集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群,可是我只有两天服务器怎么办呢?我试过两台服务器组件集群,但是无法启动,所以这里部署一个[一 ...

  2. Apache ZooKeeper - 使用源码启动ZK集群模式

    文章目录 Pre 配置总览 端口说明 Node 1 [zoo1.cfg ] [myid] Node 2 [zoo2.cfg ] [myid] Node 3 [zoo3.cfg ] [myid] 启动集 ...

  3. zookeeper专题:zookeeper集群模式下,leader选举流程分析

    文章目录 Zookeeper 集群模式一共有三种类型的角色 1. zookeeper启动时leader选举流程 1.1 加载配置文件,设置基本信息 1.2 指定快速选举算法,启动多级队列.线程 1.3 ...

  4. Zookeeper源码分析:集群模式启动概述

    参考资料 <<从PAXOS到ZOOKEEPER分布式一致性原理与实践>> zookeeper-3.0.0 Zookeeper概述 Zookeeper是一个分布式的,开放源码的分 ...

  5. Apache Dolphinscheduler —— CDH6.3.2集群模式部署(Cluster)

    Apache Dolphinscheduler 一.前期准备 1.基础环境配置 2.下载二进制tar.gz包 3.创建用户 4.配置hosts和ssh 5.数据库初始化 二.Apache Dolphi ...

  6. CentOS下ZooKeeper单机模式、集群模式安装

    本文环境如下: 操作系统:CentOS 6 32位 ZooKeeper版本:3.4.8 0. 环境需求 Zookeeper需要JDK1.6以上版本的Java环境 可以参考: CentOS 6使用rpm ...

  7. zookeeper学习笔记(一)--快速入门与集群部署

    分布式文件存储FASTDFS 目录 概 述 小结 参考资料和推荐阅读 LD is tigger forever,CG are not brothers forever, throw the pot a ...

  8. Zookeeper 集群模式搭建

    Zookeeper 集群模式搭建 前言 文件下载 Zookeeper集群角色 安装配置Zookeeper集群 前言 前面有单机模式zookeeper的搭建 .这里记录下自己搭建简单集群的步骤. 因为是 ...

  9. Apache ZooKeeper - 高可用ZK集群模式搭建与运维

    文章目录 环境信息 JDK 总览 集群架构及角色解读 安装目录 部署十步曲 配置文件 node1 node2 node3 node4(Observer节点) 配置参数解读 myid 节点唯一标示 启动 ...

最新文章

  1. kubenerte启动_Kubenertes资源分配之Request和Limit解析
  2. C/S模型UDP实现
  3. python基金会主席入门教程_Python基金会-文件IO操作,python,基础
  4. 牛客网dp专题 数位dp
  5. 永磁同步电机矢量控制中的双闭环是什么意思_三菱伺服控制器与变频器区别,三菱伺服控制器优势在哪?...
  6. java招生系统项目_基于jsp的招生管理-JavaEE实现招生管理 - java项目源码
  7. python视频免费百度云-Python开发视频百度云分享
  8. Php 中如何将内容写入log日志中
  9. 《how to write and publis a scientific paper》 Chapter 3
  10. ConcurrentHashMap底层结构分析
  11. 兰光bl2000_蓝光bl2000电梯主板.pdf
  12. java基础之线程参考尚硅谷视频
  13. MATLAB画柱状图(包括普通柱状图,多组柱状图,三维柱状图)
  14. 校园联通网使用沃派开wifi完美破解
  15. 程序员在国外:在加拿大IT公司工作三年的一些感受
  16. 用C语言打印菱形图案
  17. linux下使用libxml2库,解析xml文件
  18. java实现三方登陆:微信登陆功能的实现
  19. 让运行ubuntu20.04的笔记本电脑实现关闭盖子自动休眠
  20. JPG和TIFF图像转换

热门文章

  1. MVC模型构建管理系统
  2. 计算机动画制作 实验要求,有关计算机动画设计课程教学的对比试验
  3. Python 画樱花(动态画+飘落效果+暗色效)
  4. git-commit编辑器nano改vim
  5. a标签居中 img vue_Vue中img的src属性绑定与static文件夹实例
  6. mysql第五章项目二_Todo List:Node+Express 搭建服务端毗邻Mysql – 第五章(第1节)
  7. 图论算法-图论的表示、分类及基本概念(系列1)
  8. 65. Leetcode 153. 寻找旋转排序数组中的最小值 (二分查找-局部有序)
  9. R语言实战应用精讲50篇(十九)-R语言gganimate函数应用案例:静态图变成动态,让你的图表更酷炫
  10. 听说你想去大厂看妹子,带你看看字节跳动数据挖掘面试是啥样?