ZooKeeper系列(3)--基於ZooKeeper實現主從協作

順仔發表於2019-04-13

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

  • 主節點: 主要負責監視新的節點和任務,分配任務給可用的從節點;

  • 從節點: 通過註冊自己,確保主節點看到它們可以執行任務,收到主節點分配的任務後,執行並記錄狀態;

  • 客戶端: 建立新的任務並等待系統響應。

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來傳遞結果,本質上都是一樣的。

如果各位有好的想法,歡迎關注我的公眾號(程式設計師順仔)留言討論~

ZooKeeper系列(3)--基於ZooKeeper實現主從協作

相關文章