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.cfg
为 zoo.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 服务启动
- 在我们执行启动命令
./zkServer.sh start
时,会启动 Java 类org.apache.zookeeper.server.quorum.QuorumPeerMain
,并执行该类里面的方法main.initializeAndRun(args)
,这个方法就是 Zookeeper 服务的启动入口; - 在 Zookeeper 服务启动的过程中,会去解析
zoo.cfg
配置文件,包括数据文件目录,端口号等信息; - 读取完配置文件,Zookeeper 服务会创建
DatadirCleanupManager
类作为数据清除管理器,用于清理历史数据,保证 Zookeeper 服务不会因为存储空间影响其正常运行。
4.2 Zookeeper 服务初始化
Zookeeper 服务初始化的过程主要是实例化服务对象,下面我们来介绍会实例化哪些对象
- ServerStats: ServerStats 类用于统计 ZooKeeper 服务运行过程中的状态信息,包括接受到客户端的请求次数,处理客户端请求的次数,向客户端发送请求的次数以及出现请求延迟情况的次数。也就是说这个类会对 Zookeeper 服务的运行状态和性能进行监控;
- FileTxnSnapLog: 我们用 FileTxnSnapLog 类来实现 Zookeeper 服务的数据存储,对数据进行持久化操作。数据存储的路径会读取
zoo.cfg
配置文件的dataDir
; - ServerCnxnFactory: 我们可以通过 ServerCnxnFactory 类来指定 Zookeeper 的通信框架。在 Zookeeper 3.4.0 版本后,引入了第三方 Netty 等框架供我们选择使用。
经过一系列的对象实例化,Zookeeper 还需要从快照数据和事务日志中恢复数据,才真正的完成启动,这时就可以使用 Zookeeper 客户端来进行连接发送请求了。
4.3 Zookeeper 服务请求处理器
不同的客户端发送的请求, ZooKeeper 服务会使用不同的请求处理器来处理不同的逻辑。在单机模式下的 Zookeeper 服务,使用了 3 种请求处理器:
- PrepRequestProcessor
- SyncRequestProcessor
- FinalRequestProcessor
这三个处理器都实现了接口 RequestProcessor 。当客户端请求到达 ZooKeeper 服务进行处理的时候,严格按照上面的顺序分别调用这 3 个处理器来处理请求中的对应逻辑。
5. 总结
本小节我们学习了在 Linux 环境下部署单机模式的 Zookeeper 服务,使用 Zookeeper 客户端连接 Zookeeper 服务,然后使用命令来操作 Znode 节点,以及单机模式的 Zookeeper 服务的工作流程。接下来我们对本节内容进行总结:
- 单机模式下的 Zookeeper 的安装。
- Zookeeper 服务端命令
./zkServer.sh
。 - Zookeeper 客户端连接 Zookeeper 服务端命令
./zkCli.sh
。 - Zookeeper 客户端操作 Znode 节点的命令。
- 单机模式的 Zookeeper 工作流程。