Zookeeper學習筆記七之主從節點任務分配
主從節點任務分配
通過前面的學習持久節點和臨時節點,我們知道可以通過建立持久節點和臨時節點配合進行主從任務的分配,下面實現一個小小的例子
前提,已經安裝好了Zookeeper服務端,執行zkServer指令碼啟動服務端,開啟zkCli客戶端連線到服務端進行操作。
一 建立三個重要的父znode: /workers /tasks /assign
新建立的三個節點為永續性節點,且不包含資料,本例中,可以通過這三個節點知道哪些從節點當前有效,哪些任務需要分配,並向從節點分配任務。在真實的應用中,這些znode可能由主程序在分配任務前建立,也可能由一個載入程式建立,一旦節點存在了,主節點就需要監視/workers 和/tasks的子節點變化情況
二 對/wokers /tasks進行節點監控
使用 ls /woker true ls /tasks true 對/workers /tasks 節點進行監控
三 從節點角色
從節點首先要通知主節點,告知從節點可以執行任務。從節點通過再/workers子節點下建立臨時性的znode來進行通知
首先再次開啟一個zkCli客戶端,進行臨時znode的建立 ,命令:create -e /workers/myworker1 "myworker1"
建立完成後切換到之前設定監視點的zkCli,會發現主節點觀察到了從節點建立的資訊
下一步,從節點需要建立一個父 znode/assign/myworker1 來接收任務分配,並通過第二個引數為true的ls命令來監視這個節點的變化,以便等待新的任務
從節點已經準備就緒,可以接受任務分配,接下來通過討論客戶端角色看一下任務分配的問題
四 客戶端角色
客戶端向系統中新增任務,假設客戶端請求主從系統來執行cmd命令,為了向系統新增一個任務,客戶端執行以下操作
前提:再次開啟一個新的zkCli客戶端
我們需要按照任務新增的順序來新增znode,本質上為一個佇列。客戶端必須等待任務執行完畢。執行任務的從節點將任務執行完畢後,會建立一個znode來表示任務狀態。客戶端通過檢視任務狀態的znode是否建立來確定任務是否執行完畢,因此客戶端需要監視狀態znode的建立事件,執行任務的從節點會在/tasks/task-0000000000節點下建立狀態znode節點,因此我們執行命令 ls /task/task-0000000000 true進行監控
之前我們對/tasks節點進行了監控,現在切換到監控/tasks的zkCli,會發現新增任務觸發了監控
主節點之後會檢查這個新的任務,獲得可用的從節點列表,之後分配這個任務給myworker1
從節點收到新任務分配的通知
從節點檢查新任務,確認任務是否分配給自己
一旦從節點完成任務的執行,它就會在/tasks中新增一個狀態的znode,同時,之前設定的監控點將會進行通知,並檢查執行結果
檢查執行結果
客戶端檢查狀態znode的資訊,並確認執行結果。本例中,我們看到任務成功執行,其狀態為"done" 。實際中任務可能非常複雜,並且涉及分散式系統。最終不管是什麼樣的任務,執行任務的機制與通過zookeeper來傳遞結果,本質上是一樣的。
------有些worker單詞少拼了s,請諒解,照著截圖操作,不影響
2018/9/22 中秋節快樂 by minyi