主-從模式的模型中,主要包括三個角色:
-
主節點: 主要負責監視新的節點和任務,分配任務給可用的從節點;
-
從節點: 通過註冊自己,確保主節點看到它們可以執行任務,收到主節點分配的任務後,執行並記錄狀態;
-
客戶端: 建立新的任務並等待系統響應。
1. Zookeeper節點介紹
現通過ZooKeeper的API完成簡單的主從協作。在此之前,需瞭解下ZooKeeper中節點的基本概念。節點的型別分為以下幾類:
-
持久節點:節點建立後就一直存在,直到有刪除操作來主動刪除該節點
-
臨時節點:臨時節點的生命週期和建立該節點的客戶端會話繫結,即如果客戶端會話失效(客戶端當機或下線),這個節點自動刪除
-
時序節點:建立節點是可以設定這個屬性,ZooKeeper會自動為給定的節點加上一個數字字尾,作為新的節點名。數字字尾的範圍是整型的最大值
-
臨時性時序節點:同時具備臨時節點與時序節點的特性,主要用於分散式鎖的實現
2. 各個角色的實現
基於Zookeeper各個型別節點的特點,實現主從模式中的各個角色。在ZooKeeper中建立以下節點用於主從協作:
-
/master 表示主節點;
-
/workers/worker-id 表示從節點;
-
/tasks/task-id 表示任務;
-
/assign 表示任務分配情況。
2.1 主節點角色
因為只有一個程式會成為主節點,所以程式成為主節點後必須鎖定管理權,因此程式需要建立名為/master的臨時節點,並寫入資料,記錄該程式的資訊,如IP,編號等。
其它程式在嘗試建立/master成為主節點時,ZooKeeper會報錯,提示該節點已存在。然而主節點可能會崩潰,其它節點需要接替它成為主節點,因此需要在主節點/master上設定監視點(watch)。當監視到/master不存在時,該程式再次建立/master節點,嘗試成為主節點。
2.2 從節點角色
從節點首先要通知主節點,告知主節點自己可以執行任務。從節點通過在/workers子節點下建立臨時節點,並在位元組點中使用主機名或IP來標識自己,如:/workers/worker1.example.com。主節點通過監視(watch)/workers節點,獲取所有可用的從節點資訊。
從節點需要在/assign下建立自己的子節點,用於接收任務分配,如/assign/worker1.example.com,並監視這個節點的變化,等待新的任務。
2.3 客戶端角色
客戶端向系統中新增任務(有序節點),我們需要按照任務新增的順序建立節點,其本質上是一個佇列。如執行操作create -s /tasks/task-,會生成/tasks/task-00(數字依次遞增),客戶端需要知道該任務的完成狀態,因此需要監視(watch)該節點。
3. 各個角色相互配合實現主從協作
主節點監視/tasks,當客戶端新增任務時,建立/tasks/task-00,主節點收到通知,會去/workers下檢查可用的從節點。
獲取到從節點列表後,選擇其中一個從節點,分派任務:/assign/worker1.example.com/task-00。
從節點通過監視/assign/worker1.example.com,獲取自己的任務,並執行。任務完成後,從節點會在/tasks/task-00下更新狀態,告知客戶端該任務已完成:/tasks/task-00/status。
客戶端收到完成任務完成的通知後,整個任務的執行就結束了。當然任務可能會非常複雜,甚至涉及另一個分散式系統。但是不管是什麼樣的任務,執行的機制與通過ZooKeeper來傳遞結果,本質上都是一樣的。
如果各位有好的想法,歡迎關注我的公眾號(程式設計師順仔)留言討論~