zookeeper(一)

基礎概念

分佈式協調技術

分佈式協調技術,主要用來解決分佈式環境中多個線程間的同步控制,讓他們有序的訪問某種臨界資源,防止形成「髒數據」的後果。node

分佈式鎖

分佈式環境中,經過鎖機制保證多個進程可以有序的訪問的某種臨界資源,該鎖機制稱之爲分佈式鎖。分佈式鎖是分佈式協調技術中的核心內容。數據庫

分佈式鎖的實現

面臨的問題

分佈式環境中,各機器經過網絡實現資源共享和數據互通。問題就出在網絡這,由於網絡是不可靠的。網絡

  • 由於網絡的不可靠,服務調用失敗並不表示必定是失敗的,也多是執行成功了(響應返回時失敗了)
  • A、B都去調用服務C,時間上A比B早一點,最後的結果不必定是A的請求先於B到達
  • 爲了提高可靠性,分佈式環境中會部署多套服務,如何實現多套服務的一致性

分佈式鎖的實現者

  • Google的Chubby,非開源,Google自家用
  • Apache的zookeeper,開源

zookeeper概述

zookeeper,爲分佈式應用設計的高可用高性能一致的開源協調服務,提供了一項基本服務:分佈式鎖服務。因爲zookeeper的開源特性,在分佈式鎖的基礎上,提升了:配置維護組服務分佈式消息隊列分佈式通知/協調等。數據結構

備註:異步

  • zk的性能特色,決定了它能夠用在大型的、分佈式的系統當中
  • 可靠性而言,zk不會由於一個節點的錯誤而崩潰
  • zk提供嚴格的序列訪問控制,意味着複雜的控制原語能夠應用在客戶端上

zk的設計實現

zookeeper提供的服務主要是經過:數據結構 + 原語 + 通知機制,三部分實現的:分佈式

  • znode,數據結構
  • 原語,關於znode數據結構的操做集
  • 通知機制(Wather)

ZK的數據模型

Znode模型

Znode結構

Zookeeper命名空間中的Znode,兼具文件和目錄兩種特色。既像文件同樣維護着數據、元信息、ACL、時間戳等數據結構,又像目錄同樣能夠做爲路徑標識的一部分。每個Znode由3部分組成:性能

  1. stat:狀態信息,描述該Znode的版本、權限等信息
  2. data:與該Znode關聯的數據
  3. children:該znode下的子節點

zk雖然能夠關聯一些數據,但並無被設計爲常規的數據庫或者大數據存儲,相反的是,它用來管理調度數據,好比分佈式應用中的配置文件信息、狀態信息、聚集位置等等。這些數據的共性都是很小的數據,一般以KB爲大小爲單位大數據

數據訪問

zk中每一個節點znode存儲的數據要被原子性的操做,即讀操做將獲取節點相關的全部數據,寫操做也將替換掉節點的全部數據。線程

此外,每個節點都擁有本身的ACL(訪問控制列表),規定了用戶的權限,限定了用戶對目標節點的可執行操做。設計

節點類型

ZK的節點有兩種,分別爲臨時節點和永久節點。節點的類型在節點建立時即被肯定,而且不能被改變。

  • 臨時節點,該節點的生命週期取決於它們的會話。一旦會話結束,臨時節點將被自動刪除,固然也能夠手動刪除。雖然每一個臨時節點都會綁定到一個客戶端會話,但它對其餘客戶端都是可見的。另外,zk的臨時節點不容許擁有子節點。

  • 永久節點,該節點的生命週期不依賴於會話,而且只有在客戶端顯示執行刪除操做的時候,才能被刪除

順序節點

建立Znode時,用戶能夠請求在zk的路徑結尾添加一個遞增的計數器。這個計數對於此節點的父節點來講是惟一的,它的格式爲「%10d」(10爲數字,沒有數值的位數用0填充,例如0000000001)。

觀察

客戶端能夠在節點上設置watcher,稱之爲監視器。當節點狀態發生改變時(znode的增刪改操做)將會觸發watcher所對應的操做。當Watcher被觸發時,zk將會向客戶端發送且僅發送一條通知,由於watcher只能被觸發一次,以減小網絡流量。

zookeeper中的時間記錄

zk中有多種記錄時間的格式,其中包含如下幾個主要屬性:

  1. Zxid時間戳 導致Znode節點狀態改變的每個操做,都將使節點接收到一個Zxid格式的時間戳,而且該時間戳全局有序。若是Zxid1小於Zxid2,那麼Zxid1所對應的事件,早於Zxid2事件發生。

Znode維護着三個Zxid,分別爲:cZxidmZxidpZxid * cZxid,建立節點對應的Zxid時間戳 * mZxid,修改節點對應的Zxid時間戳 * pZxid,最新修改的Zxid,貌似與mZxid重合了

實現中,Zxid是一個64位的數字,其中高32位表明epoch,用來標識leader關係是否改變,每一次leader選舉,都會有一個新的epoch;低32位是個遞增計數

  1. 版本號 對節點的每個操做,都將導致這個節點的版本號增長。每一個節點維護着三個版本號,分別位:
    • version:節點數據版本號
    • cversion:子節點版本號
    • aversion:節點所擁有的ACL版本號

Znode節點屬性

zk中每一個Znode節點擁有表示其狀態的許多重要屬性,以下圖所示: 輸入圖片說明

Zookeeper服務中操做

zk中提供了9個基本操做,如圖所示: 輸入圖片說明

Watch觸發器

Watch概述

ZK提供爲全部的讀操做設置Watch,包括exists()、getChildren()及getData()。Watch事件是一次性的觸發器,當Watch的對象狀態發生改變時,將會觸發此對象上watch事件。Watch事件被異步地發送給客戶端,而且ZK爲watch機制提供了有序的一致性保證。

相關文章
相關標籤/搜索