天天看點

ZooKeeper系列(1)--分布式系統的基石

五分鐘了解ZooKeeper的工作原理

分布式架構有以下幾點普适性的共性需求:

     1. 提供叢集的集中化的配置管理功能,可以不重新開機就讓新的配置參數生效,類似與配置中心

     2. 簡單可靠的叢集節點動态發現機制,便于動态發現服務,動态擴充節點

     3. 簡單可靠的leader選舉機制

     4. 提供分布式鎖

    zookeeper的資料結構整體上可以看作一顆目錄樹,其中每個節點被稱作ZNode,每個Znode都可以通過其路徑(Path)唯一辨別,如/services/helloworld。每個ZNode都可以綁定一個二進制存儲資料(Data),用來存儲少量資料,預設最大1MB。不建議在ZNode中存儲大量的資料,因為資料多份複制,會帶來寬帶壓力,降低性能。

ZooKeeper系列(1)--分布式系統的基石

    ZNode有一個ACL通路權限清單,用來決定目前操作API 的使用者是否有操作此節點的權限。ZNode還提供了實時通知的接口--Watch,應用可以選擇任意ZNode進行監聽,如果被監聽的ZNode或者其Child發生變化,則應用可以實時收到通知,這樣一來,很多場景和需求都能通過ZooKeeper來實作了。

    此外,ZNode是有生命周期的,這取決于節點的類型,節點的類型分為以下幾類:

    1. 持久節點:節點建立後就一直存在,直到有删除操作來主動删除該節點

    2. 臨時節點:臨時節點的生命周期和建立該節點的用戶端會話綁定,即如果用戶端會話失效(用戶端當機或下線),這個節點自動删除 

    3. 時序節點:建立節點是可以設定這個屬性,ZooKeeper會自動為給定的節點加上一個數字字尾,作為新的節點名。數字字尾的範圍是整型的最大值

     4. 臨時性時序節點:同時具備臨時節點與時序節點的特性,主要用于分布式鎖的實作

    從上面的分析來看,持久節點主要用于儲存持久化資料,如叢集的配置資訊,結合Watch特性,實作配置的實時生效。

    臨時節點可以實作複雜的動态服務發現和服務路由功能。通常的做法是,分布式叢集不同伺服器上的服務注冊到同一個ZooKeeper上,并在某個指定的路徑下建立各自對應的臨時節點,如/serviceA/node1, /serviceA/node2,用戶端則監聽/service目錄。當有新的節點加入叢集時,ZooKeeper會把變化實時通知到所有用戶端,用戶端就可以及時更新自己的服務路由轉發表,實作全自動透明的服務發現和服務路由功能。

    時序類型的節點,在建立時,每個節點名都會被追加一個遞增的序号,類似于資料庫自增主鍵,每個ZNode都有唯一序号,而且不會沖突。以此可以實作簡單的Master(Leader)選舉機制。即把一組service執行個體都注冊為臨時性時序節點ZNode,每次選取Master時,選取序号最小的為Master,而當Master當機時,相應的ZNode會消失,新的伺服器清單會推送至用戶端,繼續選舉下一任Master,這樣就做到了動态選舉Master。

    ZooKeeper主要用于以下場景:

    1. 實作配置管理(配置中心)

    2. 服務注冊中心

    3. 叢集通信與控制子系統

    作為服務注冊中心時:

    首先服務提供者将自身的服務資訊注冊到注冊中心。通常注冊資訊包含如下内容:

    1. 服務的類型

    2. 隸屬于哪個系統

    3. 服務的IP/端口

    4. 服務的請求URL

    5. 服務的權重

    其次注冊中心要将所有服務資訊存儲,同時負責将注冊資訊的更新推送到所有的消費者(通過Watch機制實作)。

    最後,服務消費者隻有在初始化及服務變更時會依賴注冊中心,而在整個服務調用過程中與服務提供方直接通信,不依賴于任何第三方,包括注冊中心。

歡迎關注我的微信公衆号(Sunnick,請掃碼關注),随時留言交流~

ZooKeeper系列(1)--分布式系統的基石