一文入門ZooKeeper

1. ZooKeeper: 分佈式應用程序協調服務(A Distributed Coordination Service for Distributed Application)

ZooKeeper特性

  • 序列一致性(Sequential Consistency):那客戶端發送順序有序更新
  • 原子性(Atomicity):更新要麼成功,要麼失敗。沒有中間狀態。
  • 單一系統鏡像(Single System Image):無論連接到哪臺服務器,客戶端都會看到相同的服務視圖
  • 可靠性(Reliability):應用更新後,它將從該時間開始持續,直到客戶端覆蓋更新。
  • 實時性(Timeliness):系統的客戶端視圖保證在特定時間範圍內是最新的。

2.體系結構

客戶端與服務端結構

一文入門ZooKeeper

ZooKeeper Service

  • 服務器端節點有leader,follower和observer三種角色
  • 讀寫分離,Leader寫和讀,follower和observer讀。
  • leader:集群的核心,起到了主導整個集群的作用,事務請求的調度和處理。
  • follower:處理客戶端的非事務請求,轉發事務請求,參與事務的投票過程,參與leader選舉投票。
  • observer:觀察者角色,瞭解集群中的狀態變化,進行狀態同步。可以響應非事務請求。observer與follwer工作原理一致,區別是不參與事務請求的投票,投票會影響性能。當引入更多節點提升性能時候,多投票,多網絡請求,但observer可以在不投票不增加網絡請求的情況下提升讀性能,所以引入了observer。
一文入門ZooKeeper

Zookeeper服務器端角色

3.ZooKeeper的文件系統

如下圖所示,

一文入門ZooKeeper

ZNode層次結構

  • ZooKeeper的命名空間類似於標準文件系統。名稱是由斜槓(/)分隔的路徑,所以znode名稱也稱為path。
  • ZooKeeper命名空間中的每個節點都由路徑標識,這些節點被稱為znode。其中znode /表示根節點。
  • 與標準文件系統不同,ZooKeeper命名空間中的每個節點(znode)都可以(也可空)包含與之關聯的數據以及子項。
  • Znodes維護一個stat結構,其中包括數據更改,ACL更改和時間戳的版本號,以允許緩存驗證和協調更新。每次znode的數據更改時,版本號都會增加。
  • 每個znode的數據以原子方式讀取和寫入。
  • 每個znode都有一個訪問控制列表(ACL),限制誰可以做什麼。

znode類型

從持久狀態來分,znode分為持久節點和臨時節點;從編號來分,znode分為普通(無編號)節點和有編號節點。

兩兩組合即組成以下四種節點類型:

  • 持久節點:Client斷開與Server的連接(Session斷開)不會消失
  • 臨時節點(Ephemeral Nodes):Session斷開會消失
  • 持久有編號節點:Session斷開不會消失,創建節點時會在path後添加編號,如<path>0000000001/<path>
  • 臨時有編號節點:Session斷開會消失,創建節點時會在path後添加編號
一文入門ZooKeeper

ZNode類型

:編號是單調遞增的計數器。 此計數器對於父znode是唯一的。 計數器是帶有0填充的10位數,範圍0000000000~2147483647。

4.簡單配置

  • zookeeper安裝目錄的conf目錄下面的zoo_sample.cfg是配置模板文件,建議不要直接修改該文件cp zoo_sample.cfg zoo.cfg。
  • zoo.cfg下面默認有五個屬性,他們分別是:
  • tickTime:客戶端和服務端通信心跳時間
  • initLimit:follower與leader之間初始連接時能容忍的最多心跳數(tickTime的數量)。
  • syncLimit:flower跟leader之間的請求和應答最多能容忍的心跳數。
  • dataDir:每臺server,在該目錄下創建myid文件,myid內容僅有一行,標註server.id中的id。不要使用/tmp作為dataDir;myid內容不要有空格和換行。
  • clientPort:默認2181
  • 配置文件中添加server,如下所示
# server.中的id這個數字需要和myid中的數字對應
# hadoop01:server域名
# 2888:server內部通訊端口
# 3888:選舉端口
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888

5.CLI基本操作

# 啟動server
zkServer.sh start
# client連接server
zkCli.sh -server ip:2181
# 連接後,可以輸入'h'查看所有cli命令
一文入門ZooKeeper

ZooKeeper CLI命令

Cli主要命令

  • ls path:查看某個節點下的所有子節點信息
  • stat path:獲取指定節點的狀態信息
  • get path:獲取當前節點的數據內容
  • ls2 path:是ls 和 stat兩個命令的結合
  • set path data [version]:修改當前節點的數據內容。如果指定版本,需要和當前節點的數據版本一致
  • delete path [version]:刪除指定路徑的節點 如果有子節點要先刪除子節點
  • rmr path:刪除當前路徑節點及其所有子節點
  • connect host:port和 close:在當前連接中連接其他的ZooKeeper服務器和關閉服務器
  • setquota -n|-b val path:設置節點配額(比如限制節點數據長度,限制節點中子節點個數)。-n 是限制子節點個數,-b是限制節點數據長度。超出配額後,ZooKeeper不會報錯,而是在日誌信息中記錄。
  • listquota path:查看路徑節點的配額信息
  • delquota [-n|-b] path:刪除節點路徑的配額信息
  • history 和 redo cmdno:查看客戶端這次會話所執行的所有命令 和 執行指定歷史命令
  • quit:退出客戶端

stat顯示的znode信息

  • czxid:創建該節點的事物ID
  • ctime:創建該節點的時間
  • mZxid:更新該節點的事物ID
  • mtime:更新該節點的時間
  • pZxid:操作當前節點的子節點列表的事物ID(這種操作包含增加子節點,刪除子節點)
  • cversion:當前節點的子節點版本號
  • dataVersion:當前節點的數據版本號
  • aclVersion:當前節點的acl權限版本號
  • ephemeralowner:當前節點的如果是臨時節點,該屬性是臨時節點的事物ID
  • dataLength:當前節點的d的數據長度
  • numchildren:當前節點的子節點個數

6.Watch文件監聽

一個Watch事件是一個一次性的觸發器,當被設置了Watch的數據發生了改變的時候,則服務器將這個改變發送給設置了Watch的客戶端,以便通知它們。

一個zk的節點可以被監控,包括這個目錄中存儲的數據的修改,子節點目錄的變化,一旦變化可以通知設置監控的客戶端,這個功能是zookeeper對於應用最重要的特性,通過這個特性可以實現的功能包括配置的集中管理,集群管理,分佈式鎖等等。

  • 可以註冊watcher的方法:getData、exists、getChildren。
  • 可以觸發watcher的方法:create、delete、setData。連接斷開的情況下觸發的watcher會丟失。
  • 一個Watcher實例是一個回調函數,被回調一次後就被移除了。如果還需要關注數據的變化,需要再次註冊watcher。
一文入門ZooKeeper

觸發操作及其觸發事件

一文入門ZooKeeper

事件類型和註冊Watcher的對應關係

7.應用場景

ZooKeeper特性使用和組合,主要有以下五大應用場景:

  • 命名服務:持久節點+NodeCreateEvent
  • 配置管理:有value的持久節點+NodaDataChangedEvent
  • 集群管理
  • 選主:臨時節點+
  • 增刪節點:臨時節點+NodeCreateEvent,NodeDeleteEvent
  • 分佈式鎖
  • 讀鎖(共享鎖):臨時有編號節點
  • 寫鎖(排它鎖):臨時節點
  • 時序鎖:有編號節點
  • 消息隊列
  • 同步隊列:有編號節點
  • FIFO


分享到:


相關文章: