章节索引 :

Zookeeper 单机模式

1. 前言

本小节我们来学习如何在 Linux 环境下部署 Zookeeper 的单机模式,以及 Zookeeper 的单机模式是如何运行的。在学习本小节之前,同学们需要准备好 Linux 环境,我们这里使用的是 Ubuntu-18.04.2 的镜像。

2. Zookeeper 的安装

2.1 安装 Zookeeper 前置条件

在安装 Zookeeper 之前,我们需要在 Linux 环境中安装 Java 环境,我们这里使用的是 JDK 1.8.0_261,JDK 安装本小节不做演示。我们执行 java -version 命令就可以看见我们的 JDK 版本信息:

java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)

有了 Java 环境,我们就可以进行 Zookeeper 的安装了。

2.2 安装 Zookeeper

先让我们进入到一段视频来感受一下安装的过程吧~

2.2.1 下载安装包

首先我们去 Zookeeper 官网下载 Zookeeper 的安装包,这里我们的版本为 Apache ZooKeeper 3.6.1
地址:https://zookeeper.apache.org/releases.html

Tips: Zookeeper 官方建议 Apache ZooKeeper 3.6.1 使用 JDK 1.8.0_211 及以上版本。

2.2.2 解压安装包

我们在 /usr/local 文件夹下新建 zookeeper文件夹,把下载好的 apache-zookeeper-3.6.1-bin.tar.gz 使用 ftp 工具放到 zookeeper 文件夹中进行解压,然后进入解压后的文件夹,查看 zookeeper 的文件列表,操作如下:

# 新建 zookeeper 文件夹
mkdir /usr/local/zookeeper
# 进入 zookeeper 文件夹
cd /usr/local/zookeeper/
# 解压 
tar -zxvf apache-zookeeper-3.6.1-bin.tar.gz 
# 进入解压完成后的文件夹
cd apache-zookeeper-3.6.1-bin/
# 使用 ll 命令查看文件列表
ll

2.2.3 Zookeeper 文件目录

我们来介绍一下文件列表的信息:

## 存放 zookeeper 命令的文件夹
drwxr-xr-x 2 cdd  cdd   4096 4月  21 14:59 bin/
## 存放 zookeeper 的配置文件
drwxr-xr-x 2 cdd  cdd   4096 4月  21 14:59 conf/
## 存放 zookeeper 的说明文档
drwxr-xr-x 5 cdd  cdd   4096 4月  21 15:00 docs/
## 存放 zookeeper 相关 jar 包的文件夹
drwxr-xr-x 2 root root  4096 8月   1 10:01 lib/
## 开源声明
-rw-r--r-- 1 cdd  cdd  11358 4月  21 14:59 LICENSE.txt
## 公告文件
-rw-r--r-- 1 cdd  cdd    432 4月  21 14:59 NOTICE.txt
-rw-r--r-- 1 cdd  cdd   1963 4月  21 14:59 README.md
-rw-r--r-- 1 cdd  cdd   3166 4月  21 14:59 README_packaging.md

Zookeeper 的安装包是解压版的,开箱即用,不需要进行编译工作。接下来我们就可以启动 Zookeeper 服务了。

2.3 启动 Zookeeper 服务

我们在 Zookeeper 的根目录新建一个 data 文件夹来存放 Zookeeper 服务的数据信息。

mkdir data

接下来我们进入 conf 文件夹来配置 Zookeeper 服务的启动信息:

# 进入配置文件夹
cd conf/
# 查看文件列表
ll
-rw-r--r-- 1 cdd  cdd   535 4月  21 14:59 configuration.xsl
# 日志配置文件
-rw-r--r-- 1 cdd  cdd  3435 4月  21 14:59 log4j.properties
# zookeeper 核心配置文件样本
-rw-r--r-- 1 cdd  cdd  1148 4月  21 14:59 zoo_sample.cfg

我们复制一份 zoo_sample.cfgzoo.cfg ,然后进行编辑:

cp zoo_sample.cfg zoo.cfg
vi zoo.cfg

我们配置 dataDir 数据文件夹为我们刚才新建的 data 目录:

# 心跳检查间隔时间:毫秒
tickTime=2000
# 初始连接时心跳检查的最大数量
initLimit=10
# 请求和应答时心跳检查的最大数量
syncLimit=5
# 数据文件夹的路径
dataDir=/usr/local/zookeeper/apache-zookeeper-3.6.1-bin/data
# 通信端口,默认2181
clientPort=2181

配置好 zoo.cfg ,接下来我们进入命令文件夹 bin,使用启动命令就可以启动 zookeeper 服务了

cd /usr/local/zookeeper/apache-zookeeper-3.6.1-bin/bin/
# zookeeper 服务 启动
./zkServer.sh start

控制台输出以下信息,就说明我们已经启动成功了:

ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/apache-zookeeper-3.6.1-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

2.4 Zookeeper 服务端命令

这里我们来介绍一下可以控制 Zookeeper 服务的命令:

# 启动
./zkServer.sh start
# 停止
./zkServer.sh stop
# 重启
./zkServer.sh restart
# 当前状态
./zkServer.sh status

我们来看一下 Zookeeper 服务启动之后的状态是什么样的:

./zkServer.sh status
#我们可以通过客户端连接 Zookeeper 服务,地址为本机ip地址,端口号为 2181
Client port found: 2181. Client address: localhost.
# standalone 表示单机模式
Mode: standalone

接下来我们就可以使用 Zookeeper 的客户端来连接 Zookeeper 服务了。

3. Zookeeper 客户端

使用 Zookeeper 客户端连接 Zookeeper 服务,我们需要使用 ./zkCli.sh 命令:

# 进入 bin 文件夹
cd /usr/local/zookeeper/apache-zookeeper-3.6.1-bin/bin/
# 连接命令
./zkCli.sh 
# 连接时输出信息
Connecting to localhost:2181
...
# 出现下面这一行时,表示我们连接成功
[zk: localhost:2181(CONNECTED) 0] 

这里我们就可以使用上一节学习过的命令来操作节点了,我们来测试一下:

# 获取根节点的子节点
ls /
# 输出默认的子节点 zookeeper
[zookeeper]
# 创建根节点的子节点 imooc
create /imooc
# 输出创建成功信息
Created /imooc
# 创建后再次获取根节点的子节点
ls /
# 输出两个子节点
[imooc, zookeeper]
# 我们可以给节点设置数据
set /imooc wiki
# 然后我们再获取 imooc 节点的数据
get /imooc
# 输出我们设置的信息
wiki
# 最后我们测试一下删除命令
delete /imooc
# 删除后再次获取根节点的子节点
ls /
# 输出子节点 zookeeper,imooc 节点被删除
[zookeeper]
# 退出 Zookeeper 客户端命令
quit

通过上面的学习,我们知道了如何部署单机模式的 Zookeeper 服务,以及如何通过 Zookeeper 客户端连接 Zookeeper 服务端,来对 Znode 节点进行操作。那么 Zookeeper 是如何为我们提供服务的呢,接下来我们就来了解单机模式下的 Zookeeper 的工作流程。

4. 单机模式下 Zookeeper 服务的工作流程

本小节我们来了解单机模式下 Zookeeper 服务的工作流程。

4.1 Zookeeper 服务启动

  1. 在我们执行启动命令 ./zkServer.sh start 时,会启动 Java 类 org.apache.zookeeper.server.quorum.QuorumPeerMain ,并执行该类里面的方法 main.initializeAndRun(args),这个方法就是 Zookeeper 服务的启动入口;
  2. 在 Zookeeper 服务启动的过程中,会去解析 zoo.cfg 配置文件,包括数据文件目录,端口号等信息;
  3. 读取完配置文件,Zookeeper 服务会创建 DatadirCleanupManager 类作为数据清除管理器,用于清理历史数据,保证 Zookeeper 服务不会因为存储空间影响其正常运行。

4.2 Zookeeper 服务初始化

Zookeeper 服务初始化的过程主要是实例化服务对象,下面我们来介绍会实例化哪些对象

  1. ServerStats: ServerStats 类用于统计 ZooKeeper 服务运行过程中的状态信息,包括接受到客户端的请求次数,处理客户端请求的次数,向客户端发送请求的次数以及出现请求延迟情况的次数。也就是说这个类会对 Zookeeper 服务的运行状态和性能进行监控;
  2. FileTxnSnapLog: 我们用 FileTxnSnapLog 类来实现 Zookeeper 服务的数据存储,对数据进行持久化操作。数据存储的路径会读取 zoo.cfg 配置文件的 dataDir
  3. ServerCnxnFactory: 我们可以通过 ServerCnxnFactory 类来指定 Zookeeper 的通信框架。在 Zookeeper 3.4.0 版本后,引入了第三方 Netty 等框架供我们选择使用。

经过一系列的对象实例化,Zookeeper 还需要从快照数据和事务日志中恢复数据,才真正的完成启动,这时就可以使用 Zookeeper 客户端来进行连接发送请求了。

4.3 Zookeeper 服务请求处理器

不同的客户端发送的请求, ZooKeeper 服务会使用不同的请求处理器来处理不同的逻辑。在单机模式下的 Zookeeper 服务,使用了 3 种请求处理器:
请求处理器

  1. PrepRequestProcessor
  2. SyncRequestProcessor
  3. FinalRequestProcessor

这三个处理器都实现了接口 RequestProcessor 。当客户端请求到达 ZooKeeper 服务进行处理的时候,严格按照上面的顺序分别调用这 3 个处理器来处理请求中的对应逻辑。

5. 总结

本小节我们学习了在 Linux 环境下部署单机模式的 Zookeeper 服务,使用 Zookeeper 客户端连接 Zookeeper 服务,然后使用命令来操作 Znode 节点,以及单机模式的 Zookeeper 服务的工作流程。接下来我们对本节内容进行总结:

  1. 单机模式下的 Zookeeper 的安装。
  2. Zookeeper 服务端命令 ./zkServer.sh
  3. Zookeeper 客户端连接 Zookeeper 服务端命令 ./zkCli.sh
  4. Zookeeper 客户端操作 Znode 节点的命令。
  5. 单机模式的 Zookeeper 工作流程。