天天看點

《ZooKeeper:分布式過程協同技術詳解》——2.4 一個主-從模式例子的實作

本節書摘來自華章計算機《zookeeper:分布式過程協同技術詳解》一書中的第2章,第2.4節,作者:flavio junqueira, benjamin reed 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

本節中我們通過zkcli工具來實作主-從示例的一些功能。這個例子僅用于教學目的,我們不推薦使用zkcli工具來搭建系統。使用zkcli的目的僅僅是為了說明如何通過zookeeper來實作協作菜單,進而撇開在實際實作中所需的大量細節。我們将在下一章中進入實作的細節。

主-從模式的模型中包括三個角色:

主節點

主節點負責監視新的從節點和任務,配置設定任務給可用的從節點。

從節點

從節點會通過系統注冊自己,以確定主節點看到它們可以執行任務,然後開始監視新任務。

用戶端

用戶端建立新任務并等待系統的響應。

現在探讨這些不同的角色以及每個角色需要執行的确切步驟。

2.4.1 主節點角色

因為隻有一個程序會成為主節點,是以一個程序成為zookeeper的主節點後必須鎖定管理權。為此,程序需要建立一個臨時znode,名為/master:

剛剛發生了什麼?首先建立一個臨時znode /master。我們在znode中添加了主機資訊,以便zookeeper外部的其他程序需要與它通信。添加主機資訊并不是必需的,但這樣做僅僅是為了說明我們可以在需要時添加資料。為了設定znode為臨時性的,需要添加-e标志。記得,一個臨時節點會在會話過期或關閉時自動被删除。

現在讓我們看下我們使用兩個程序來獲得主節點角色的情況,盡管在任何時刻最多隻能有一個活動的主節點,其他程序将成為備份主節點。假如其他程序不知道已經有一個主節點被選舉出來,并嘗試建立一個/master節點。讓我們看看會發生什麼:

zookeeper告訴我們一個/master節點已經存在。這樣,第二個程序就知道已經存在一個主節點。然而,一個活動的主節點可能會崩潰,備份主節點需要接替活動主節點的角色。為了檢測到這些,需要在/master節點上設定一個監視點,操作如下:

stat指令可以得到一個znode節點的屬性,并允許我們在已經存在的znode節點上設定監視點。通過在路徑後面設定參數true來添加監視點。當活動的主節點崩潰時,我們會觀察到以下情況:

在輸出的最後,我們注意到nodedeleted事件。這個事件指出活動主節點的會話已經關閉或過期。同時注意,/master節點已經不存在了。現在備份主節點通過再次建立

/master節點來成為活動主節點。

因為備份主節點成功建立了/master節點,是以現在用戶端開始成為活動主節點。

2.4.2 從節點、任務和配置設定

在我們讨論從節點和用戶端所采取的步驟之前,讓我們先建立三個重要的父znode,

這三個新的znode為持久性節點,且不包含任何資料。本例中,通過使用這些znode可以告訴我們哪個從節點目前有效,還告訴我們目前有任務需要配置設定,并向從節點配置設定任務。

在真實的應用中,這些znode可能由主程序在配置設定任務前建立,也可能由一個引導程式建立,不管這些節點是如何建立的,一旦這些節點存在了,主節點就需要監視

/workers和/tasks的子節點的變化情況:

請注意,在主節點上調用stat指令前,我們使用可選的true參數調用ls指令。通過true這個參數,可以設定對應znode的子節點變化的監視點。

2.4.3 從節點角色

從節點首先要通知主節點,告知從節點可以執行任務。從節點通過在/workers子節點下建立臨時性的znode來進行通知,并在子節點中使用主機名來辨別自己:

注意,輸出中,zookeeper确認znode已經建立。之前主節點已經監視了/workers的子節點變化情況。一旦從節點在/workers下建立了一個znode,主節點就會觀察到以下通知資訊:

watcher::

下一步,從節點需要建立一個父znode/assing/worker1.example.com來接收任務配置設定,并通過第二個參數為true的ls指令來監視這個節點的變化,以便等待新的任務。

從節點現在已經準備就緒,可以接收任務配置設定。之後,我們通過讨論用戶端角色來看一下任務配置設定的問題。

2.4.4 用戶端角色

用戶端向系統中添加任務。在本示例中具體任務是什麼并不重要,我們假設用戶端請求主從系統來運作cmd指令。為了向系統添加一個任務,用戶端執行以下操作:

我們需要按照任務添加的順序來添加znode,其本質上為一個隊列。用戶端現在必須等待任務執行完畢。執行任務的從節點将任務執行完畢後,會建立一個znode來表示任務狀态。用戶端通過檢視任務狀态的znode是否建立來确定任務是否執行完畢,是以用戶端需要監視狀态znode的建立事件:

執行任務的從節點會在/tasks/task-0000000000節點下建立狀态znode節點,是以我們需要用ls指令來監視/tasks/task-0000000000的子節點。

一旦建立任務的znode,主節點會觀察到以下事件:

主節點之後會檢查這個新的任務,擷取可用的從節點清單,之後配置設定這個任務給worker1.example.com:

從節點接收到新任務配置設定的通知:

從節點之後便開始檢查新任務,并确認該任務是否配置設定給自己:

一旦從節點完成任務的執行,它就會在/tasks中添加一個狀态znode:

之後,用戶端接收到通知,并檢查執行結果:

用戶端檢查狀态znode的資訊,并确認任務的執行結果。本例中,我們看到任務成功執行,其狀态為“done”。當然任務也可能非常複雜,甚至涉及另一個分布式系統。最終不管是什麼樣的任務,執行任務的機制與通過zookeeper來傳遞結果,本質上都是一樣的。

繼續閱讀