1. 程式人生 > >zookeeper學習筆記(六)—— 概念

zookeeper學習筆記(六)—— 概念

zookeeper 核心

  • Zookeeper資料模型
  • Zookeeper會話
  • Zookeeper Watches
  • 一致性保證(分散式事務涉及)

zookeeper 資料模型

定義

是zk的分層的名稱空間。類似分散式檔案系統。名稱空間的每個節點既可以關聯資料,又可以關聯目錄。並且路徑節點總是通過斜線”/”分隔

znodes

概念

zk中的每個節點都被稱為znode。
znode維護一個stat結構(包括資料變化的版本號、訪問控制列表變化和時間戳)

作用

版本號和時間戳可以讓zk驗證快取和協調更新。znode的資料只要發生了變化,版本號就會增加。
當客戶端執行更新或刪除時,客戶端必須提供他正在改變的znode的版本號。如果它提供的版本號和真實的資料版本號不一致,更新將會失敗(行為可能被覆蓋)

對zk進行程式設計主要是對znode作為主體操作

關於node的擴充套件

在分散式應用工程中,node可以指的是一般的主機,一個伺服器,全體成員的一員,一個客戶端程式,等等。在Zookeeper的文件中,znode指的是資料節點。Servers指的是組成Zookeeper服務的機器;quorum peers 指的是組成全體的servers;client指的是任何使用Zookeeper服務的主機和程式。

znode 基本特徵

watches

znode的變化將會觸發watches後清除watches。觸發watches時,Zookeeper向客戶端傳送一個通知

資料訪問

  1. 名稱空間裡的每個znodes上的資料儲存都是原子性的讀取和寫入
  2. 讀取時獲取所有與znode有關的資料位元組,寫入時替換所有的資料位元組。
  3. 每個節點通過訪問控制列表進行限制訪問
  4. zk不用來儲存資料,只是用來管理協調資料。資料形式可以是配置表單,狀態資訊,集合點等
  5. 各種形式的協調資料屬性都非常小
  6. 如果需要大資料儲存,通常的做法是將資料儲存進大儲存器系統,如NFS和HDFS,然後將儲存指標和地址儲存進Zookeeper

臨時節點

znode一旦session建立就存在,session結束就被刪除
臨時節點不可以有子節點

序列節點

  1. 當建立znode的時候你還可以請求在路徑的最後追加一個單調遞增的計數器
  2. 計數器在父節點命名唯一。而且是int型別。

zookeeper 計時

Zxid(事務ID)

每個zk狀態的變化都以zxid的形式接收到標記
zx特徵:如果zxid1早於zxid2則zxid1一定小於zxid2。並且暴露zk所有變化的總排序

版本號

節點的每個變化都會引起那個節點的版本號的其中之一增加
1.version: 資料變化版本號
2.cversion:子目錄變化版本號
3.aversion:訪問控制列表的變化版本號

Ticks

  1. 伺服器使用ticks定義事件(如狀態上傳,會話超時,同事之間的連線超時等)的時間。通常在多伺服器中使用
  2. 如果一個客戶端請求會話超時小於最小的會話超時,伺服器就會告訴客戶端會話超時實際上是最低會話超時時間。

Real Time

zk不使用實時或時鐘時間,除了將時間戳加在znode建立和更新的stat結構上。

zookeeper Stat

  • czxid - 引起這個znode建立的zxid
  • mzxid - znode最後更新的zxid
  • ctime - znode被建立的毫秒數(從1970年開始)
  • mtime - znode最後修改的毫秒數(從1970年開始)
  • version - znode資料變化號
  • cversion - znode子節點變化號
  • aversion - znode訪問控制列表的變化號
  • ephemeralOwner - 如果是臨時節點這個是znode擁有者的session - id。如果不是臨時節點則是0。
  • dataLength - znode的資料長度
  • numChildren - znode子節點數量

zookeeper 會話

Zookeeper客戶端通過使用語言繫結在服務上建立一個handle建立一個和Zookeeper服務的會話

會話成功:handle連線zk伺服器。從connection變為connected狀態。
會話失敗:handle變為closed狀態(例如會話超時或授權失敗,或應用明確的關閉處理器)

建立客戶端會話
以逗號分隔開的host:port的列表
(eg:”127.0.0.1:4545” or “127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002”)

zk會選擇任意一個服務並嘗試連線它。如果這個連線失敗,客戶端變為disconected,客戶端會自動的嘗試連線列表裡的下一個伺服器,直到建立連線

connectionString+chroot:改變程式執行時所參考的根目錄位置
chroot命令的作用

客戶端連線zk會話,作為安全措施,需要將sessionId(64位的數字)和密碼傳送給客戶端

當客戶端從ZK叢集分隔。它將開始搜尋在session建立期間指定的伺服器列表server.x 。session狀態將會從”connected”轉為”expired”(重建超時)

zk客戶端會自動重連,只有當zk通知session超時才能建立新的session。

zk叢集管理session會話

timeout決定會話何時過期。
當叢集在指定的session超時週期內沒有聽到客戶端(沒有心跳)時發生。
叢集會刪除全部session的臨時節點並立即通知其他客戶端(watch這些znode的客戶端)。

過期會話狀態轉化例項通過watcher檢視

  1. ‘connected’:建立session且正在和叢集通訊
  2. …客戶端從叢集分離
  3. ‘disconnected’:客戶端丟失叢集的連線
  4. …時間消失,’timeout’週期之後叢集過期session,客戶端什麼都看不到
  5. …時間消失,客戶端收復叢集的連通性
  6. ‘expired’:最終客戶端重連到叢集,然後是過期通知

zookeeper Watches

Zookeeper裡的所有讀取操作都有設定watch的選項 。watch事件是one-time觸發,向客戶端傳送設定watch,當設定watch的資料變化時發生

watch特徵

  • 一次觸發
  • 發往客戶端
  • 為資料設定watch

Watch特徵

  • Watches和其他事件、watches和非同步恢復都是有序的。Zookeeper客戶端保證每件事都是有序派發。
  • 客戶端在看到新資料之前先看到watch事件。
  • 對應更新順序的Zookeeper watches事件順序由Zookeeper服務所見。

注意:
1. 如果你得到一個watch事件且想在將來的變化得到通知,必須設定另一個watch
2. 因為watches是一次觸發且在獲得事件和傳送請求得到wathes之間有延遲你不能可靠的看到發生在Zookeeper節點的每一個變化
3. 一個watch物件,或function/context對,對於指定的通知只能觸發一次。(eg. 如果相同的檔案通過exists和getData註冊了相同的watch物件並且檔案稍後刪除了,watch將只會觸發檔案的刪除通知)
4. 從服務端斷開連線時(比如伺服器故障),將不會得到任何watches直到重新建立連線

zookeeper ACLs

  1. Zookeeper使用ACLs控制訪問它的znodes(Zookeeper的資料節點)
  2. Zookeeper節點不由三個標準範圍(使用者,組 和 world)限制。Zookeeper沒有znode所有者的概念。而是一個ACLs指定一組ids和與這些ids相關聯的許可權
  3. ACL只適用於特定的znode。尤其不適用於children
  4. ACLs不是遞迴控制
    (eg. 如果/app對ip:192.168.1.56是隻讀的並且/app/status是全都可讀的,任何人可以讀取/app/status)
  5. Zookeeper支援可插拔的許可權認證方案

ACL許可權

  • CREATE:可以建立子節點
  • READ:可以從節點獲取資料並列出它的子節點
  • WRITE:可以向節點設定資料
  • DELETE:可以刪除一個子節點
  • ADMIN:可以設定許可權

內嵌的ACL schemes

  • world:有單獨的id,anyone,代表任何人
  • auth:不適用任何id,代表任何授權的使用者。
  • digest:使用username;password字串生成MD5雜湊作為ACL ID身份。通過傳送username:password明文授權。在ACL裡使用時expression將會是username:base64編碼的SHA1 password摘要。
  • ip:使用客戶端IP作為ACL ID身份。

一致性保證

順序一致性

客戶端的更新將傳送到序列

原子性

更新成功或失敗 – 沒有區域性結果

單一系統影像

客戶端看到的服務端的檢視都一樣

可靠性

一旦更新應用了,它將會一直保持到下次更新覆蓋。這個保證有兩個推論

  • 如果客戶端成功,更新就被應用。客戶端看不到失敗現象。
    客戶端可以看到任何更新,通過讀取請求或成功的更新
    時效性

  • 系統的客戶端檢視在特定的時間保證是最新的。

Java

建立Zookeeper的時候,同時建立了兩個執行緒:一個IO執行緒和事件執行緒。所有的IO都在在IO執行緒上(使用Java NIO)。所有的事件回撥都在事件執行緒上。Session在IO執行緒上維護如重連Zookeeper服務和維護心跳。同步方法呼叫也在IO執行緒處理。所有非同步呼叫和watche事件在事件執行緒上處理