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

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

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

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

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

1. Zookeeper節點介紹

現通過ZooKeeper的API完成簡單的主從協作。在此之前,需瞭解下ZooKeeper中節點的基本概念。節點的類型分爲以下幾類:

    1. 持久節點:節點創建後就一直存在,直到有刪除操作來主動刪除該節點

    2. 臨時節點:臨時節點的生命週期和創建該節點的客戶端會話綁定,即如果客戶端會話失效(客戶端宕機或下線),這個節點自動刪除 

    3. 時序節點:創建節點是可以設置這個屬性,ZooKeeper會自動爲給定的節點加上一個數字後綴,作爲新的節點名。數字後綴的範圍是整型的最大值

     4. 臨時性時序節點:同時具備臨時節點與時序節點的特性,主要用於分佈式鎖的實現

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

 

歡迎關注我的微信公衆號(Sunnick,請掃碼關注),隨時留言交流~

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章