【七日打卡】一文帶你瞭解Zookeeper全部核心概念

前言

Zookeeper做爲分佈式應用的分佈式協調服務,提供C語言和Java語言的API調用。其自己,由Java開發,有一些核心概念,咱們須要有很明確的認識,纔可以更好地使用該服務中間件。本次將從如下幾個部分展開:java

  • Session會話node

  • Watch算法

  • 數據模型數據庫

Session

如圖所示,ZK是一個C/S架構,包含客戶端、服務端,客戶端鏈接服務端,稱之爲一個會話。express

創建會話的流程、特色以下:服務器

  1. 一個客戶端鏈接一個會話,由ZK進行分配惟一的會話idmarkdown

  2. 客戶端以特定的時間間隔發送心跳以保持會話有效性,經過參數tickTime來設定session

  3. 超過會話超時時間未收到客戶端心跳,服務端則斷定,該客戶端失效,已掛掉;架構

  4. minSessionTimeout 會話的最小超時時間,(默認爲2倍的tickTime)分佈式

  5. maxSessionTimeout 會話的最大超時時間,(默認爲20倍的tickTime)

  6. 會話中的請求按照FIFO順序執行,相似於隊列

數據模型

ZK做爲分佈式協調服務,同時也是個集中存儲服務,數據存儲在內容中,具備高性能、低延時特色,依賴於自己的數據模型。

層次名稱空間
  • 相似unix文件系統,以(/)爲根圖片

  • 區別:節點能夠包含與之關聯的數據以及子節點(在文件系統看來,既是文件也是文件夾)

  • 節點的路徑老是表示爲規範的、絕對的、斜槓分隔的路徑

如圖所示,每一個節點,均可以設置對應的值

其中,每一個節點,稱之爲znode。

znode
  • 名稱惟一,命名規範

  • 節點類型:持久、順序、臨時、臨時順序

  • 節點數據構成

znode - 命名規範

節點名稱除下列限制外,可使用任何unicode字符

  1. null字符(\u0000)不能做爲路徑名的一部分

  2. 如下字符不能使用,由於不能很友好的顯式,\u0001 - \u0019 和\u007F - \u009F

  3. 不容許使用如下字符:\ud800 - uf8fff,\uFFF0 - \uFFFF

  4. "."字符能夠用做另外一個名稱的一部分,可是「.」 和 ".." 不能單獨用於指示路徑上的節點,zookeeper不適用相對路徑,都是絕對路徑的節點例如:「/a/b/./c」 "c/a/b/../" 都是無效的節點命名

  5. zookeeper有一個保留節點 「zookeeper」

znode-節點類型

節點包含四種節點類型

持久節點

create /test1 test
複製代碼

臨時節點

create -e /test1 /abd abds
複製代碼

順序節點

create -s /test1/abc 908
複製代碼

臨時順序節點

create -e -s /test1/abd/ 90
複製代碼

其中,順序節點,爲10位的十進制序號,每一個父節點都攜帶一個計數器,zk是由java開發,計數器是帶符號的int(4字節),數值到2147483647,以後將發生溢出,致使名稱「 -2147483648」

如圖所示,完成四種節點類型節點的建立,能夠看到順序節點的十進制序號

同時,臨時節點,有效範圍在當前會話有效期內,關閉當前會話,從新開一個客戶端

圖示內,能夠看到當前sessionid 0x100002011b80003

再次查看節點,便可發現臨時節點 c 、f0000000005 都已經不存在。臨時節點在協調服務中應用普遍。

znode-數據構成

節點數據:存儲的協調數據(狀態信息、配置、位置信息等)

節點元數據(stat結構)

數據量上限:1M

zk爲分佈式協調服務,非存儲型數據庫,僅用來用於分佈式協調,所以數據量小,保證高性能。

znode-元數據stat結構

在zk客戶端,可使用stat命令,查看節點元數據。包括如下數據:

Stat結構字段 描述
cZxid 建立該節點的zxid(事務id)
mZxid 最後修改該節點的zxid
pZxid 當前節點最後更新的子節點zxid
ctime 節點建立時間
mtime 節點最後修改時間
dataVersion 節點數據修改次數
cversion 節點子節點變動次數
dataLength 節點數據長度
numChildren 節點子節點數
ephemeralOwner 節點爲臨時節點,全部者會話id,若是不是臨時節點,值爲0
aclVersion 節點訪問控制列表變動次數

客戶端提供下面命令,可使用訪問控制功能

create [-s] [-e] [-c] [-t ttl] path [data] [acl]

setAcl [-s] [-v version] [-R] path acl

getAcl [-s] path

提供設置格式爲 (scheme:expression, perms)

schemes包括

  • world 任何客戶端均可以訪問.

  • auth 擁有受權的客戶端.

  • digest 使用username:base64 encoded SHA1 password digest.

  • ip ip:127.0.0.1,read

  • x509

perms包括

  • CREATE: 可建立子節點

  • READ: 可獲取節點數據以及子節點列表.

  • WRITE: 設置節點數據

  • DELETE: 刪除子節點

  • ADMIN: 設置權限

Zookeeper中的時間

zk採用多種方式,來追蹤時間。

  1. Zxid Zookeeper中的每次更改操做都會對應一個惟一的事務id,稱爲Zxid,是一個全局有序的時間戳標記。

  2. Version numbers版本號,每一個節點的更改操做,都會版本號增長

  3. Ticks 當使用zk集羣時,服務端,採用「滴答」tick,來定義事件的時間,如狀態上傳、會話超時、對等點之間的鏈接超時等。ticktime僅經過最小會話超時時間間接公開(默認爲2倍ticktime)若是客戶端請求的設置會話超時,小於服務端設置最小會話超時,服務端會通知客戶端會話超時實際超時時間,即會採用服務端的配置時間,且把結果告知客戶端。若是客戶端設置會話超時,大於服務端配置,則使用客戶端設置。

  4. Real time Zookeeper除了在znode建立和修改時間時將時間戳放入stat結構以外,其餘不使用real time或者時鐘時間

Watch監聽機制

客戶端,能夠經過在znode上設置watch,實現實時監聽znode的變化

  • data watch 監聽數據變動

  • child watch 監聽子節點變化

首先,對節點添加watch監聽,而後對節點數據更改,全部客戶端,會觸發watch時間,監聽到變化。

addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE

Zookeeper在3.6.0版本後,經過addWatch方法,增長watch能夠設置watch監聽模式,默認爲PERSISTENT_RECURSIVE,持久遞歸,能夠觸發屢次

Zookeeper特性

  1. 順序一致性: 保證客戶端操做是按照順序生效的

  2. 原子性: 更新成功或失敗,沒有部分結果

  3. 單個系統映像:不管鏈接到哪一個集羣中服務器,客戶端都能看到相同的內容

  4. 可靠性: 數據的變動不會丟失,除非被客戶端覆蓋修改

  5. zk發生數據更改時,先進行事務記錄,會在集羣中進行一致性算法處理,最終實現一致性,實現可靠

  6. 及時性: 保證系統的客戶端當時讀取的數據是最新的

相關文章
相關標籤/搜索