Zookeeper 單機模式
1. 前言
本小節(jié)我們來學習如何在 Linux 環(huán)境下部署 Zookeeper 的單機模式,以及 Zookeeper 的單機模式是如何運行的。在學習本小節(jié)之前,同學們需要準備好 Linux 環(huán)境,我們這里使用的是 Ubuntu-18.04.2 的鏡像。
2. Zookeeper 的安裝
2.1 安裝 Zookeeper 前置條件
在安裝 Zookeeper 之前,我們需要在 Linux 環(huán)境中安裝 Java 環(huán)境,我們這里使用的是 JDK 1.8.0_261,JDK 安裝本小節(jié)不做演示。我們執(zhí)行 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 環(huán)境,我們就可以進行 Zookeeper 的安裝了。
2.2 安裝 Zookeeper
先讓我們進入到一段視頻來感受一下安裝的過程吧~
2.2.1 下載安裝包
首先我們?nèi)?Zookeeper 官網(wǎng)下載 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 相關(guān) 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 服務的數(shù)據(jù)信息。
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 數(shù)據(jù)文件夾為我們剛才新建的 data 目錄:
# 心跳檢查間隔時間:毫秒
tickTime=2000
# 初始連接時心跳檢查的最大數(shù)量
initLimit=10
# 請求和應答時心跳檢查的最大數(shù)量
syncLimit=5
# 數(shù)據(jù)文件夾的路徑
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
控制臺輸出以下信息,就說明我們已經(jīng)啟動成功了:
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
# 當前狀態(tài)
./zkServer.sh status
我們來看一下 Zookeeper 服務啟動之后的狀態(tài)是什么樣的:
./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
...
# 出現(xiàn)下面這一行時,表示我們連接成功
[zk: localhost:2181(CONNECTED) 0]
這里我們就可以使用上一節(jié)學習過的命令來操作節(jié)點了,我們來測試一下:
# 獲取根節(jié)點的子節(jié)點
ls /
# 輸出默認的子節(jié)點 zookeeper
[zookeeper]
# 創(chuàng)建根節(jié)點的子節(jié)點 imooc
create /imooc
# 輸出創(chuàng)建成功信息
Created /imooc
# 創(chuàng)建后再次獲取根節(jié)點的子節(jié)點
ls /
# 輸出兩個子節(jié)點
[imooc, zookeeper]
# 我們可以給節(jié)點設置數(shù)據(jù)
set /imooc wiki
# 然后我們再獲取 imooc 節(jié)點的數(shù)據(jù)
get /imooc
# 輸出我們設置的信息
wiki
# 最后我們測試一下刪除命令
delete /imooc
# 刪除后再次獲取根節(jié)點的子節(jié)點
ls /
# 輸出子節(jié)點 zookeeper,imooc 節(jié)點被刪除
[zookeeper]
# 退出 Zookeeper 客戶端命令
quit
通過上面的學習,我們知道了如何部署單機模式的 Zookeeper 服務,以及如何通過 Zookeeper 客戶端連接 Zookeeper 服務端,來對 Znode 節(jié)點進行操作。那么 Zookeeper 是如何為我們提供服務的呢,接下來我們就來了解單機模式下的 Zookeeper 的工作流程。
4. 單機模式下 Zookeeper 服務的工作流程
本小節(jié)我們來了解單機模式下 Zookeeper 服務的工作流程。
4.1 Zookeeper 服務啟動
- 在我們執(zhí)行啟動命令
./zkServer.sh start
時,會啟動 Java 類org.apache.zookeeper.server.quorum.QuorumPeerMain
,并執(zhí)行該類里面的方法main.initializeAndRun(args)
,這個方法就是 Zookeeper 服務的啟動入口; - 在 Zookeeper 服務啟動的過程中,會去解析
zoo.cfg
配置文件,包括數(shù)據(jù)文件目錄,端口號等信息; - 讀取完配置文件,Zookeeper 服務會創(chuàng)建
DatadirCleanupManager
類作為數(shù)據(jù)清除管理器,用于清理歷史數(shù)據(jù),保證 Zookeeper 服務不會因為存儲空間影響其正常運行。
4.2 Zookeeper 服務初始化
Zookeeper 服務初始化的過程主要是實例化服務對象,下面我們來介紹會實例化哪些對象
- ServerStats: ServerStats 類用于統(tǒng)計 ZooKeeper 服務運行過程中的狀態(tài)信息,包括接受到客戶端的請求次數(shù),處理客戶端請求的次數(shù),向客戶端發(fā)送請求的次數(shù)以及出現(xiàn)請求延遲情況的次數(shù)。也就是說這個類會對 Zookeeper 服務的運行狀態(tài)和性能進行監(jiān)控;
- FileTxnSnapLog: 我們用 FileTxnSnapLog 類來實現(xiàn) Zookeeper 服務的數(shù)據(jù)存儲,對數(shù)據(jù)進行持久化操作。數(shù)據(jù)存儲的路徑會讀取
zoo.cfg
配置文件的dataDir
; - ServerCnxnFactory: 我們可以通過 ServerCnxnFactory 類來指定 Zookeeper 的通信框架。在 Zookeeper 3.4.0 版本后,引入了第三方 Netty 等框架供我們選擇使用。
經(jīng)過一系列的對象實例化,Zookeeper 還需要從快照數(shù)據(jù)和事務日志中恢復數(shù)據(jù),才真正的完成啟動,這時就可以使用 Zookeeper 客戶端來進行連接發(fā)送請求了。
4.3 Zookeeper 服務請求處理器
不同的客戶端發(fā)送的請求, ZooKeeper 服務會使用不同的請求處理器來處理不同的邏輯。在單機模式下的 Zookeeper 服務,使用了 3 種請求處理器:
- PrepRequestProcessor
- SyncRequestProcessor
- FinalRequestProcessor
這三個處理器都實現(xiàn)了接口 RequestProcessor 。當客戶端請求到達 ZooKeeper 服務進行處理的時候,嚴格按照上面的順序分別調(diào)用這 3 個處理器來處理請求中的對應邏輯。
5. 總結(jié)
本小節(jié)我們學習了在 Linux 環(huán)境下部署單機模式的 Zookeeper 服務,使用 Zookeeper 客戶端連接 Zookeeper 服務,然后使用命令來操作 Znode 節(jié)點,以及單機模式的 Zookeeper 服務的工作流程。接下來我們對本節(jié)內(nèi)容進行總結(jié):
- 單機模式下的 Zookeeper 的安裝。
- Zookeeper 服務端命令
./zkServer.sh
。 - Zookeeper 客戶端連接 Zookeeper 服務端命令
./zkCli.sh
。 - Zookeeper 客戶端操作 Znode 節(jié)點的命令。
- 單機模式的 Zookeeper 工作流程。