1. 程式人生 > >說說zookeeper【壹】_基礎知識

說說zookeeper【壹】_基礎知識

本系列文章內容大部分總結自倪超老師的《從Paxos到Zookeeper分散式一致性原理與實踐》,如果想了解zookeeper,那麼讀著一本書就夠了。連結如下:


本文先介紹下什麼是zookeeper。

zookeeper介紹

zookeeper是一個開發原始碼的分散式協調服務,由雅虎建立,是Google Chubby的開源實現。其設計目標是將那些複雜且容易出錯的分散式一致性服務封裝起來,構成一個高效可靠的原語集,並以一系列簡單易用的介面提供給使用者使用。

zookeeper致力於提供一個高效能、高可用,且具有嚴格的順序訪問控制能力(主要是寫操作的嚴格順序性)的分散式協調服務。

zookeeper使得分散式程式能夠通過一個共享的、樹型結構的名字空間來進行相互協調。這裡zode樹形結構的名字空間,是指zookeeper伺服器記憶體中的一個數據模型,由一系列被稱為znode的資料節點組成,而znode之間的層級關係就像檔案系統的目錄結構一樣。不過zookeeper將全量資料儲存在記憶體中,以此來實現提高伺服器吞吐、減少延遲的目的。

說白了,zookeeper就是通過

內部維護的znode樹狀模型,來協助分散式應用完成一些分散式協調工作。常見的應用場景有:資料釋出/訂閱、負載均衡、命名服務、分散式協調/通知、叢集管理、master選舉、分散式鎖和分散式佇列等。(詳見此文)

zookeeper特性

1.順序性
從同一個客戶端傳送的請求,最終將會嚴格按照其傳送順序進入zookeeper中,先進先出。

2.原子性
所有請求的響應結果咋整個分散式叢集環境中具有原子性。要麼都成功地處理了該請求,要麼都沒處理。

3.單一性
無論客戶端連線到哪個zookeeper伺服器,所看到的服務端資料模型都是一致的,不會出現兩種資料狀態。(zookeeper之間是有同步機制的)

4.可靠性


一旦伺服器資料狀態發生了變化,就會立即儲存起來。

5.實時性
當某個請求成功處理後,客戶端能夠立即獲取服務端的最新資料狀態,整個過程具有實時性。

zoo.config配置檔案

參考樣例:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181
server.<id>=<ip>:<port1>:<port2>
server.<id>=<ip>:<port1>:<port2>


-- port1:leader節點和follow節點進行心跳檢測與資料同步所用的埠
-- port2:領導選舉中,用於投票通訊的介面

tickTime

: 稱為"喃塔時間",用於配置ZooKeeper中最小時間單元的長度,實際上 ZooKeeper 中很多執行時的時間間隔都是使用 tickle 的倍數來表示的。例如, ZooKeeper 中會話的最小超時時間預設為2倍的 tickTime, 即 2*tickTime。 該配置項的預設值為3000, 單位為毫秒。

initLimit: 用於配置Leader節點等待Follower節點啟動並完成資料同步的時間。 Follower節點在啟動過程中會與Leader節點建立連線並完成對資料的同步,從而確定自己對外提供服務的起始狀態,Leader節點允許Follower節點在initLimit時間內完成這個工作。該配置項的預設值為 10, 即10*tickTime。 通常情況下,我們不用太在意這個配置項,使用其預設值即可。如果隨著ZooKeeper叢集管理的資料量不斷增大,Follower節點在啟動的時候,從Leader節點上進行資料同步的時間也會相應變長,於是無法在較短的時間內完成資料同步,在這種情況下,有必要適當調大這個引數。

syncLimit:用於配置Leader節點和Follower節點之間進行"心跳檢測"的最大延時時間。在ZooKeeper叢集執行過程中,Leader節點會與所有Follower節點進行心跳檢測來確定該節點是否存活。如果 Leader節點在 syncLimit 時間內無法獲取Follower節點的心跳檢測響應,那麼Leader節點就會認為該Follower節點己經脫離了與自己的同步。該配置的預設值為5, 即5*tickTime。

dataDir: 用於配置ZooKeeper伺服器儲存快照檔案的目錄,不建議將其指定到/tmp目錄下,因為該目錄下的檔案可能被自動刪除。在ZooKeeper叢集環境中,將生成一個名為myid的檔案,該檔案用於存放ZooKeeper叢集節點的ID, 我們需保證在整個叢集環境中,這個ID是唯一的。

clientPort:用於配置當前ZooKeeper伺服器對外暴露的埠,客戶端會通過該埠在 ZooKeeper伺服器上建立連線並建立會話,一般設定為2181。每臺ZooKeeper伺服器都可以配置任意可用的埠, 實際上,叢集中的所有伺服器也無須使用相同的clientPort。