zookeeper系列(一)

zookeeper概覽

ZooKeeper 是一個開源的分佈式協調服務,ZooKeeper框架最初是在「Yahoo!"上構建的,用於以簡單而穩健的方式訪問他們的應用程序。 後來,Apache ZooKeeper成爲Hadoop,HBase和其餘分佈式框架使用的有組織服務的標準。 例如,Apache HBase使用ZooKeeper跟蹤分佈式數據的狀態。 ZooKeeper 的設計目標是將那些複雜且容易出錯的分佈式一致性服務封裝起來,構成一個高效可靠的原語集,並以一系列簡單易用的接口提供給用戶使用。

ZooKeeper 是一個典型的分佈式數據一致性解決方案,分佈式應用程序能夠基於 ZooKeeper 實現諸如數據發佈/訂閱、負載均衡、命名服務、分佈式協調/通知、集羣管理、Master 選舉、分佈式鎖和分佈式隊列等功能。node

zookeeper在dubbo中的使用場景

Zookeeper 一個最經常使用的使用場景就是用於擔任服務生產者和服務消費者的註冊中心(提供發佈訂閱服務)。

服務生產者將本身提供的服務註冊到Zookeeper中心,服務的消費者在進行服務調用的時候先到Zookeeper中查找服務,獲取到服務生產者的詳細信息以後,再去調用服務生產者的內容與數據。linux

以下圖所示,在 Dubbo架構中 Zookeeper 就擔任了註冊中心這一角色。bash


zookeeper數據模型

ZNode(數據節點)是 ZooKeeper 中數據的最小單元,每一個ZNode上均可以保存數據,同時仍是能夠有子節點(這就像樹結構同樣,以下圖所示)。能夠看出,節點路徑標識方式和Unix文件 系統路徑很是類似,都是由一系列使用斜槓"/"進行分割的路徑表示,開發人員能夠向這個節點中寫入數據,也能夠在節點下面建立子節點。這些操做咱們後面都會介紹到。 


相信你們也都知道事務是怎麼回事,事務的ACID四大特性等等,可是在zookeeper中的事務和咱們以前所認識的事務有點不太同樣。服務器

在Zookeeper中,事務是指可以改變 ZooKeeper 服務器狀態的操做,咱們也稱之爲事務操做或更新操做,通常包括數據節點建立與刪除、數據節點內容更新和客戶端會話建立與失效等操做。架構

對於每個事務請求,ZooKeeper 都會爲其分配一個全局惟一的事務ID,用 ZXID 來表示,一般是一個64位的數字。每個ZXID對應一次更新操做,從這些 ZXID 中能夠間接地識別出Zookeeper處理這些更新操做請求的全局順序。
負載均衡

ZNode(數據節點)的結構

每一個 ZNode 由2部分組成:
  • stat:狀態信息
  • data:數據內容

以下所示,我經過 get 命令來獲取 根目錄下的 dubbo 節點的內容。(命令操做會以後介紹)

[zk: localhost:2181(CONNECTED) 2] get /dubbo
null
cZxid = 0x2
ctime = Tue May 21 21:37:08 CST 2019
mZxid = 0x2
mtime = Tue May 21 21:37:08 CST 2019
pZxid = 0x3b
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: localhost:2181(CONNECTED) 3] 複製代碼
這些狀態信息其實就是 Stat 對象的格式化輸出。Stat 類中包含了一個數據節點的全部狀態信息的字段,包括事務ID、版本信息和子節點個數等。

關於數據節點的狀態信息說明(也就是對Stat 類中的各字段進行說明),能夠參考下圖(圖源:《從Paxos到Zookeeper 分佈式一致性原理與實踐》)。框架


zookeeper中的常見命令操做

鏈接 ZooKeeper 服務

進入安裝 ZooKeeper文件夾的 bin 目錄下執行下面的命令鏈接 ZooKeeper 服務(Linux環境下)(鏈接以前首選要肯定你的 ZooKeeper 服務已經啓動成功)。分佈式

./zkCli.sh -server 127.0.0.1:2181複製代碼


從上圖能夠看出控制檯打印出了不少信息,包括咱們的主機名稱、JDK 版本、操做系統等等。若是你成功看到這些信息,說明你成功鏈接到 ZooKeeper 服務。

1.查看經常使用命令(help 命令)

help 命令查看 zookeeper 經常使用命令


2.建立節點(create 命令)

這個命令建立了一個新的 znode 節點「 zk 」以及與它關聯的字符串。
經過 create 命令在根目錄建立了node1節點,與它關聯的字符串是"node1"

[zk: localhost:2181(CONNECTED) 0] create /node1 「node1」複製代碼
經過 create 命令在node1節點下建立node1.1節點,與它關聯的內容是數字 123

[zk: localhost:2181(CONNECTED) 1] create /node1/node1.1 123Created /node1/node1.1
複製代碼

3.更新節點數據內容(set 命令)

[zk: localhost:2181(CONNECTED) 11] set /node1 "set node1"複製代碼

4.獲取節點的數據(get 命令)

get 命令能夠獲取指定節點的數據內容和節點的狀態,能夠看出咱們經過set 命令已經將節點數據內容改成 "set node1"。

[zk: localhost:2181(CONNECTED) 7] get /node1
set node1
cZxid = 0x4d
ctime = Thu May 30 10:47:02 CST 2019
mZxid = 0x4f
mtime = Thu May 30 10:49:45 CST 2019
pZxid = 0x4e
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1 複製代碼

5.查看某個目錄下的子節點(ls 命令)

使用 ls 命令來查看當前 ZooKeeper 中所包含的內容。
經過 ls 命令查看根目錄下的節點

[zk: localhost:2181(CONNECTED) 3] ls /[dubbo, zookeeper, node1]
複製代碼
經過 ls 命令查看 node1 目錄下的節點

[zk: localhost:2181(CONNECTED) 5] ls /node1[node1.1]複製代碼
zookeeper 中的 ls 命令和 linux 命令中的 ls 相似, 這個命令將列出絕對路徑path下的全部子節點信息(列出1級,並不遞歸)
#監聽這個節點的變化,當另一個客戶端改變/zk時,它會打出下面的
#WATCHER::
#WatchedEvent state:SyncConnected type:NodeDataChanged path:/node1

[zk: localhost:2181(CONNECTED) 4] get /node1 watch複製代碼

6.查看節點狀態(stat 命令)

經過 stat 命令查看節點狀態

[zk: localhost:2181(CONNECTED) 1] stat /node1
cZxid = 0x4d
ctime = Thu May 30 10:47:02 CST 2019
mZxid = 0x4f
mtime = Thu May 30 10:49:45 CST 2019
pZxid = 0x4e
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1
複製代碼
上面顯示的一些信息好比cversion、aclVersion、numChildren等等,我在上面 「ZNode(數據節點)的結構」 這部分已經介紹到。

7.查看節點信息和狀態(ls2 命令)

ls2 命令更像是 ls 命令和 stat 命令的結合。

ls2 命令返回的信息包括2部分:子節點列表 + 當前節點的stat信息oop

[zk: localhost:2181(CONNECTED) 14] ls2 /node1
[node1.1]
cZxid = 0x4d
ctime = Thu May 30 10:47:02 CST 2019
mZxid = 0x4f
mtime = Thu May 30 10:49:45 CST 2019
pZxid = 0x4e
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1
複製代碼

8.刪除節點(delete 命令)

這個命令很簡單,可是須要注意的一點是若是你要刪除某一個節點,那麼這個節點必須無子節點才行。

[zk: localhost:2181(CONNECTED) 3] delete /node1/node1.1複製代碼

9.刪除節點:rmr(遞歸刪除)

[zk: localhost:2181(CONNECTED) 5] rmr /node1複製代碼

Zookeeper的節點類型

1.Znode有兩種類型:ui

  • 短暫(ephemeral)(斷開鏈接本身刪除)
  • 持久(persistent)(斷開鏈接不刪除)

2.Znode有四種形式的目錄節點(默認是persistent )

  • PERSISTENT(持久節點)
  • PERSISTENT_SEQUENTIAL(持久順序節點)
  • EPHEMERAL(臨時節點)
  • EPHEMERAL_SEQUENTIAL(臨時順序節點)

3.建立znode時設置順序標識,znode名稱後會附加一個值,順序號是一個單調遞增的計數器,由父節點維護。

4.在分佈式系統中,順序號能夠被用於爲全部的事件進行全局排序,這樣客戶端能夠經過順序號推斷事件的順序。

小結

今天帶你們瞭解了zookeeper是什麼以及對zookeeper節點的一些操做,節點的特性跟Linux的文件系統其實真的十分類似,很好理解。本篇文章就是就是對zookeeper的一個入門介紹,下篇我會對zookeeper的一些高級機制進行講解。

相關文章
相關標籤/搜索