1. 程式人生 > >Zookeeper學習筆記一之簡介

Zookeeper學習筆記一之簡介

有序 多個 不同 簡介 線程 font 互斥 等待 檢測

一 Zookeeper使命

關於Zookeeper的討論都圍繞著一條主線,它可以在分布式系統中協作多個任務。一個協作任務是指包含多個進程的任務。這個任務可以是為了協作或者是為了管理競爭。協作意味著多個進程需要一同處理某些事情,一些進程采取某些行動使得其他進程可以繼續工作。比如典型的主-從(master-worker)工作模式中,從節點處於空閑狀態時會通知主節點可以接受工作,於是主節點就會分配任務給從節點。競爭則不同,它指的是兩個進程不能同時工作的情況,一個進程必須等待另外一個進程。同樣在主-從工作模式中的例子中,我們想有一個主節點,但是很多進程也許都想成為主節點,因此我們需要實現互斥排他鎖(mutual exclusion)。實際上,我們可以認為獲取主節點身份的過程其實就是獲取鎖的過程,獲得主節點控制權鎖的進程即主節點進程。

在一臺計算機上運行的多個進程和跨計算機運行的多個進程從概念上區分並不大。在多線程情況下有用的同步原語在分布式系統中也同樣有效。一個重要的區別在於,在典型的不共享環境下不同的計算機之間不共享除了網絡之外的其他任何信息。雖然許多消息傳遞算法可以實現同步原語,但是使用一個提供某種有序共享存儲的組件往往更加簡便,這正是Zookeeper所采用的方式。

協作並不總是采取像群首選舉或者加鎖等同步原語的形式。配置元數據也是一個進程通知其他進程需要做什麽的一種常用方式。比如,在一個主-從系統中,從節點需要知道任務已經分配給它們。即使在主節點發生崩潰的情況下,這些信息也需要有效。典型ZooKeeper使用實例有Apache Kafka,Kafka是一個基於發布-訂閱(pub-sub)模型的消息系統。其中Zookeeper用於檢測崩潰,實現主題(topic)的發現,並保持主題的生產和消費狀態。

當開發人員使用Zookeeper進行開發時,開發人員設計的那些應用往往可以看成一組連接到Zookeeper服務器端的客戶端,它們通過Zookeeper的客戶端API連接到ZK服務器端進行相應的操作,ZK的客戶端API功能強大,其中包括(1)保障強一致性,有序性和持久性 (2)實現通用的同步原語的能力 (3)在實際分布式系統中,並發往往導致不正確的行為,Zookeeper提供了一種簡單的並發處理機制。

二 Zookeeper不適用場景

整個ZK的服務器集群管理著應用協作的關鍵數據。ZK不適合做海量數據存儲。對於需要存儲海量應用數據的情況,有其他的備選方案,比如說數據庫和分布式文件系統等。因為不同的應用有不同的需求,如對一致性和持久性的不同需求,所以在設計應用時,最佳實踐還是應該將應用數據和協同數據獨立開。

三 通過Zookeeper構建分布式系統

分布式系統的定義:分布式系統是同時跨越多個物理主機,獨立運行的多個軟件組件所組成的程序。采用分布式設計的原因很多,能夠利用多處理器的運算能力來運行組件,比如並行復制任務。一個系統也許由於戰略原因,需要分布在不同地點。對於分布式系統使用獨立的協調組件有幾個重要的好處(1)可以獨立的設計和實現該組件。這樣獨立的組件可以跨多個應用共享(2)系統架構師可以簡化協作方面的工作(3)可以獨立的運行和協作這些組件。

軟件組件以操作系統進程的方式運行,很多時候還涉及到多線程的執行。因此ZK的服務端和客戶端也是以進程的方式運行,一個單獨的物理機上運行一個單獨的應用進程,以便利用現代處理器的多核處理能力。分布式系統中進程通信有兩種選擇:直接通過網絡進行信息交換,或讀寫某些共享存儲。ZK使用共享存儲模型來實現應用間的協作和同步原語。對於共享存儲本身,又需要在進程和存儲間進行通信。因此網絡通信是分布式中並發設計的基礎。

Zookeeper學習筆記一之簡介