一文徹底搞懂Zookeeper

本文是基於CentOS 7.9系統環境,進行Zookeeper的學習和使用

1. Zookeeper簡介

1.1 什麼是Zookeeper

Zookeeper是一個開源的分佈式的,爲分佈式應用提供協調服務的Apache項目。本質上,就是文件系統+通知機制

1.2 Zookeeper工作機制

Zookeeper從設計模式角度來理解:是一個基於觀察者模式設計的分佈式服務管理框架,它負責存儲和管理大家都關心的數據,然後接受觀察者的註冊,一旦這些數據的狀態發生變化,Zookeeper就負責通知已經在Zookeeper上註冊的那些觀察者做出相應的反應

在這裏插入圖片描述

1.3 Zookeeper特點

在這裏插入圖片描述

  1. Zookeeper:一各領導者(Leader),多個跟隨者(Follower)組成的集羣
  2. 集羣中只要有半數以上節點存活,Zookeeper集羣就能正常服務,所以zookeeper適合安裝奇數臺服務器
  3. 全局數據一致:每個server保存一份相同的數據副本,client無論連接到哪個server,數據都是一致的
  4. 更新請求順序進行,來自同一個client的更新請求按其發送順序依次執行
  5. 數據更新原子性,一次數據更新要麼成功,要麼失敗
  6. 實時性,在一定時間範圍內,client能讀到最新數據

1.4 Zookeeper數據結構

與Unix文件系統類似,整體上是一棵樹,每一個節點稱爲znode,每一個znode默認存儲1MB數據,每個znode都可以通過其路徑唯一標識

1.5 Zookeeper應用場景

提供的服務包括:統一命名服務、統一配置管理、統一集羣管理、服務器節點動態上下線、軟負載均衡等

1.5.1 統一命名服務

在分佈式環境下,經常需要對應用/服務進行統一命令,便於識別

1.5.2 統一配置管理

  • 分佈式環境下,配置文件同步非常常見

(1)一般要求一個集羣中,所有節點的配置信息是一致的,比如kafka集羣;
(2)對配置文件修改後,希望能夠快速同步到各個節點上。

  • 配置管理可交由zookeeper實現

(1)可將配置信息寫入Zookeeper上的一個Znode;
(2)各個客戶端服務器監聽這個Znode;
(3)一旦Znode中的數據被修改,Zookeeper將通知各個客戶端服務器。

1.5.3 統一集羣管理

分佈式環境下,實時掌握每個節點的狀態是必要的
(1)可根據節點實時狀態做出一些調整。
Zookeeper可以實現實時監控節點狀態變化
(1)可將節點信息寫入Zookeeper上的一個Znode;
(2)監聽這個Znode可獲取它的實時狀態變化。

1.5.4 服務器節點動態上下線

客戶端能實時洞察到服務器上下線的變化

1.5.5 軟負載均衡

在Zookeeper中記錄每臺服務器的訪問數,讓訪問數最少的服務器去處理最新的客戶端請求

1.6 Zookeeper選舉機制

  • 半數機制:集羣中半數以上機器存活,集羣可用。所以Zookeeper適合安裝奇數臺服務器。
  • Zookeeper雖然在配置文件中並沒有指定Master和Slave。但是,Zookeeper工作時,是有一個節點爲Leader,其他則爲Follower,Leader是通過內部的選舉機制臨時產生的。
  • 以一個簡單的例子來說明整個選舉的過程。

假設有五臺服務器組成的Zookeeper集羣,它們的id從1-5,同時它們都是最新啓動的,也就是沒有歷史數據,在存放數據量這一點上,都是一樣的。假設這些服務器依序啓動,來看看會發生什麼。
(1)服務器1啓動,發起一次選舉;
所有的服務器節點都會選自己作爲leader, 此時服務器1投自己1票,但是隻有它一臺服務器啓動了,它發出去的報文沒有任何響應,所以選舉無法完成;
服務器1的狀態一直是LOOKING狀態。
(2)服務器2啓動,再發起一次選舉;
服務器1和服務器2分別投自己1票,服務器之間進行通信,互相交換自己的選舉結果,由於兩者都沒有歷史選舉數據,所以id值較大的服務器2勝出,服務器1更改投票爲服務器2,但是由於沒有達到超過半數以上的服務器都同意選舉它(這個例子中的半數以上是3),所以選舉無法完成;
所以服務器1、2還是繼續保持LOOKING狀態。
(3)服務器3啓動,根據前面的理論分析,服務器3成爲服務器1、2、3中的老大,而與上面不同的是,此時有三臺服務器選舉了它,所以它成爲了這次選舉的Leader,;
服務器1、2還是更改狀態爲FOLLOWING狀態,服務器3更改狀態爲LEADING。
(4)服務器4啓動,發起一次選舉;
此時,服務器1,2,3已經不是LOOKING狀態,不會更改投票信息,服務器3會有3票,服務器4會投自己1票
根據少數服從多數,服務器4會更改自己的投票結果爲服務器3;
服務器4更改狀態爲FOLLOWING狀態
(5)服務器5啓動,同4一樣當小弟。

1.7 Zookeeper節點類型

  • 持久

客戶端和服務端斷開連接後,創建的節點不刪除

  • 短暫

客戶端和服務端斷開連接後,創建的節自己刪除

  • 順序編號

創建znode時設置順序標識,znode名稱後會附加一個值,順序號是一個單調遞增的計數器,由父節點維護;在分佈式系統中,順序號可以被用於爲所有的事件進行全局排序,這樣客戶端可以通過順序號推斷事件的順序

  1. 持久化目錄節點:客戶端與zookeeper斷開連接後,該節點依舊存在
  2. 持久化順序編號目錄節點:客戶端與zookeeper斷開連接後,該節點依舊存在,只是zookeeper在創建該節點時進行順序編號
  3. 臨時目錄節點:客戶端與zookeeper斷開連接後,該節點被刪除
  4. 臨時順序編號目錄節點:客戶端與zookeeper斷開連接後,該節點被刪除,只是zookeeper在創建該節點時進行順序編號

1.8 Zookeeper監聽器原理

1.8.1 常見的監聽類型

監聽節點數據的變化

get path [watch]

監聽子節點增減的變化

ls path [watch]

1.8.2 監聽器原理詳解

在這裏插入圖片描述

  1. 首先要有一個main()線程
  2. 在main()線程中創建zookeeper客戶端,這時就會創建兩個線程,一個負責網絡連接通信(connect),一個負責監聽(listener)
  3. 通過connect線程將註冊的監聽事件發送給zookeeper
  4. 在zookeeper的註冊監聽器列表中將註冊的監聽事件添加到列表中
  5. zookeeper監聽到有數據或路徑變化,就會將這個消息發送給listener線程
  6. listener線程內部調用了process()方法

1.9 Zookeeper寫數據原理

在這裏插入圖片描述

2. Zookeeper單節點standalone安裝

2.1 集羣規劃

hostname CPU 內存 組件 IP地址
hadoop101 2 4G Zookeeper 192.168.1.100

2.2 解壓安裝

節點下分別執行

tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
mv zookeeper-3.4.10 zookeeper

2.3 配置zoo.cfg文件

mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
# 修改如下信息
dataDir=/opt/module/zookeeper/zk-Data

2.4 啓動集羣

節點下分別執行

bin/zkServer.sh start

成功啓動輸出信息

[lytdev@es201 bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

2.5 查看集羣狀態

節點下分別執行

bin/zkServer.sh status

成功啓動輸出信息

[lytdev@es201 bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper/bin/../conf/zoo.cfg
Mode: standalone

3. Zookeeper分佈式安裝

3.1 集羣規劃

hostname CPU 內存 組件IP地址
hadoop101 2 4G Zookeeper
hadoop104 2 4G Zookeeper
hadoop105 2 4G Zookeeper

3.2 解壓安裝

三個節點下分別執行

tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

3.3 配置服務器編號

hadoop101 節點下

mkdir -p zkData
cd zkData
vi myid
# 添加如下信息
1

hadoop104 節點下

mkdir -p zkData
cd zkData
vi myid
# 添加如下信息
4

hadoop105 節點下

mkdir -p zkData
cd zkData
vi myid
# 添加如下信息
5

3.4 配置zoo.cfg文件

mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
# 修改如下信息
dataDir=/opt/module/zookeeper-3.4.10/zkData
# 添加如下信息
server.1=hadoop101:2888:3888
server.4=hadoop104:2888:3888
server.5=hadoop105:2888:3888

3.5 啓動集羣

三個節點下分別執行

bin/zkServer.sh start

3.6 查看集羣狀態

三個節點下分別執行

bin/zkServer.sh status

4. Zookeeper的使用

4.1 客戶端命令行操作

基本語法 功能描述
help 顯示所有操作命令
ls path [watch] 使用ls命令來查看當前znode中所包含的內容
ls2 path [watch] 查看當前節點數據並能看到更新次數等數據
create 普通創建
create -s 含有序列
create -e 臨時創建(重啓或者超時消失)
get path [watch] 獲得節點的值
set 設置節點的具體值
stat 查看節點狀態
delete 刪除節點
deleteall 遞歸刪除節點

** 啓動客戶端**

bin/zkCli.sh

查看當前znode所包含的內容

ls /

查看當前znode節點詳細數據

ls2 /

創建znode節點

create /sanguo "lytdev"

獲取znode節點的值

get /sanguo
get /sanguo/shuguo

創建短暫的znode節點

create -e /sanguo/wuguo "sunquan"

退出客戶端

quit

創建帶順序號的znode節點

create -s /sanguo/weiguo "caocao"

修改znode節點的值

set /sanguo "diaochan"

監聽znode節點的值的變化(只能監聽一次)

get /sanguo watch

監聽znode節點的子節點變化(只能監聽一次)

ls /sanguo watch

刪除znode節點

delete /sanguo/wuguo

遞歸刪除znode節點

rmr /sanguo

5. Zookeeper的面試重點

5.1 如何保持數據全局一致性

zookeeper通過Zab協議保持數據全局一致性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章