基于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,請掃碼關注),随時留言交流~