zookeeper分散式系統中面臨的很多問題, 如分散式鎖,統一的命名服務,配置中心,叢集的管理Leader的選舉等

環境準備

分散式系統中各個節點之間通訊,Zookeeper保證了這個過程中 資料的唯一性,安全可靠

官網下載地址

  • 修改配置檔案

將/conf/zoo_sample.cfg 修改成 zoo.cfg

配置檔案解讀

# zookeeper  伺服器和客戶端之間維持心跳的時間間隔,即每個ticktime傳送一個心跳包,單位是毫秒
# zookeeper 中session過期的時間是 ticktime*2
tickTime=2000
# Leader 允許Follower在initLimit時間內完成從Leader身上同步全部資料的工作, 隨機叢集的不斷擴大,Follower從Leader上同步資料的時間就會變成,此時有必要,預設是0
initLimit=10
# Leader會和叢集中的其他機器進行通訊,在syncLimit時間內,都沒有從Follower上獲取返回資料,就認為這個節點掛了
syncLimit=5
# 儲存快照檔案的目錄,預設情況下事務日誌也在這裡了,下面單獨配置,因為因為日誌的寫效能影響zookeeper的效能
dataDir=E:\\zookeeper\\zookeeper-3.4.14\\data

dataLogDir=E:\\zookeeper\\zookeeper-3.4.14\\log
# the port at which the clients will connect
# 客戶端連線的埠
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
  • 啟動

啟動的指令碼在 /bin/目錄下
linux啟動 ./zkCli.sh -server localhost:2181
****
啟動成功,進入客戶端控制檯

 # 預設的節點叫zookeeper
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]
# 建立一個節點
[zk: localhost:2181(CONNECTED) 11] create /changwu1 "num1" 
Created /changwu1 
 # 重新檢視
[zk: localhost:2181(CONNECTED) 14] ls /
[zookeeper, changwu1]
 # 獲取節點的內容
[zk: localhost:2181(CONNECTED) 17] get /changwu1
num1
cZxid = 0x2
ctime = Mon Sep 16 15:56:27 CST 2019
mZxid = 0x2
mtime = Mon Sep 16 15:56:27 CST 2019
pZxid = 0x2
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0

# 退出
quit

# 刪除一個節點
[zk: localhost:2181(CONNECTED) 32] delete /changwu1
[zk: localhost:2181(CONNECTED) 33] ls /
[zookeeper]

# 遞迴刪除節點
rmr /path1/path2
這個path1 和 path2 其實是兩個節點
# 修改節點資料
set /path "value"

# 節點的狀態
[zk: localhost:2181(CONNECTED) 50] stat /z1
cZxid = 0x5
ctime = Mon Sep 16 16:04:35 CST 2019
mZxid = 0x7
mtime = Mon Sep 16 16:06:31 CST 2019
pZxid = 0x6
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 1

# 建立永久有序節點
create -s /path

建立節點的形式,和我們mkdir,建立一個目錄結構是相似的


叢集搭建

  • 將zoo.cfg複製三份,並修改配置檔案

第二個埠2887,用來同步Leader 和 Follower之間的資料, 第三個埠選舉新的Leader使用

  • 在tmp目錄建立六個目錄 分別是 zoo_data_1-3 zoo_logs_1-3
  • 建立myid檔案
[[email protected] tmp]# echo 1 > zoo_data_1/myid
[[email protected] tmp]# echo 2 > zoo_data_2/myid
[[email protected] tmp]# echo 3 > zoo_data_3/myid

啟動叢集服務端

[[email protected] bin]# ./zkServer.sh start ../conf/zoo1.cfg 
ZooKeeper JMX enabled by default
Using config: ../conf/zoo1.cfg
Starting zookeeper ... STARTED
[[email protected] bin]# ./zkServer.sh start ../conf/zoo2.cfg 
ZooKeeper JMX enabled by default
Using config: ../conf/zoo2.cfg
Starting zookeeper ... STARTED
[[email protected] bin]# ./zkServer.sh start ../conf/zoo3.cfg 
ZooKeeper JMX enabled by default
Using config: ../conf/zoo3.cfg
Starting zookeeper ... STARTED

分別檢視各個節點的狀態

[[email protected] bin]# ./zkServer.sh status ../conf/zoo3.cfg 
ZooKeeper JMX enabled by default
Using config: ../conf/zoo3.cfg
Mode: follower

[[email protected] bin]# ./zkServer.sh status ../conf/zoo1.cfg 
ZooKeeper JMX enabled by default
Using config: ../conf/zoo1.cfg
Mode: leader

[[email protected] bin]# ./zkServer.sh status ../conf/zoo2.cfg 
ZooKeeper JMX enabled by default
Using config: ../conf/zoo2.cfg
Mode: follower
    

連線客戶端

./zkCli -server localhost:服務端的埠號

zkCli.sh -server localhost:2181
zkCli.sh -server localhost:2182
zkCli.sh -server localhost:2183

新增觀察者

  1. 和前三個一樣,在tmp目錄建立哨兵使用的目錄 分別是 zoo_data_4 zoo_logs_4
  2. 在zoo_data_4目錄下建立它myid檔案,寫入4
  3. 更改前三個節點的配置檔案
tickTime=2000
initLimit=10
syncLimit=5

dataDir=/tmp/zoo_data_1
dataLogDir=/tmp/zoo_logs_1

clientPort=2181

# 第一個端用於Leader和Leanner之間同步, 第二個埠,使用者選舉過程中的投票通訊
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.4=localhost:2890:3890:observer
  1. 新增觀察者的配置檔案
tickTime=2000
initLimit=10
syncLimit=5

dataDir=/tmp/zoo_data_4
dataLogDir=/tmp/zoo_logs_4

# 觀察者的配置
peerType=observer

clientPort=2184

# 第一個端用於Leader和Leanner之間同步, 第二個埠,使用者選舉過程中的投票通訊
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
server.4=localhost:2890:3890:observer

叢集中的角色

Leader

發起投票和決議,已經更新最終狀態

Follower

接收處理客戶端的請求,參與Leader發起的決議

Observer

接受客戶端的連線,將請求轉發給Leader位元組,但是它不參加投票,而僅僅同步Leader的狀態,它的zookeeper拓展的方式

為什麼會新增Observer呢? 這和zookeeper的工作方式息息相關:

一個zookeeper叢集由多個Server組成,每一個Server都可以去處理多個client的請求, 如果是讀請求,用當前的Server的本地資料庫分本直接相應,但是,如果請求是改變zookeeper狀態的寫請求,就變得麻煩起來, zookeeper的leader節點會發起投票這個機制就是zab協議,超過半數的節點同意時,才會把這個操作載入到記憶體中,並對client進行回覆

在這個過程中,zookeeper擔任兩個職能,一方面接受客戶端的連線,另一方面又得去發起投票決議, 這兩個功能限制了zookeeper的擴充套件想支援更多的客戶端連線,就得新增server,但是server越來越多每次發起投票就變的沉重,於是Observer應運而生

Observer,不會參加投票,在其他節點處於投票階段時,Observer接收client的連線,把連線轉發的leader,而且,它還會收到投票的處理結果,從而大大提高系統的吞吐量

Leaner

和Leader一起同步狀態的節點的統稱,Observer和Follower統稱為Leaner

Zookeeper的CPA

CP: 當叢集中的節點僅僅剩下Leader Follower時, Leader掛了,就得重新選舉,選舉的過程中系統不可用

AP: Leader Follower Observer ,這三者組成的就群,實現了AP, 當Leader掛了,同樣進行選舉, 但是Observer可以繼續接受client的請求,只不過Observer中的資料可能不是最新的資料

相關文章