主-從模式的模型中,主要包括三個角色:程序員
主節點: 主要負責監視新的節點和任務,分配任務給可用的從節點;分佈式
從節點: 經過註冊本身,確保主節點看到它們能夠執行任務,收到主節點分配的任務後,執行並記錄狀態;cdn
客戶端: 建立新的任務並等待系統響應。生命週期
現經過ZooKeeper的API完成簡單的主從協做。在此以前,需瞭解下ZooKeeper中節點的基本概念。節點的類型分爲如下幾類:隊列
持久節點:節點建立後就一直存在,直到有刪除操做來主動刪除該節點進程
臨時節點:臨時節點的生命週期和建立該節點的客戶端會話綁定,即若是客戶端會話失效(客戶端宕機或下線),這個節點自動刪除it
時序節點:建立節點是能夠設置這個屬性,ZooKeeper會自動爲給定的節點加上一個數字後綴,做爲新的節點名。數字後綴的範圍是整型的最大值io
臨時性時序節點:同時具有臨時節點與時序節點的特性,主要用於分佈式鎖的實現ast
基於Zookeeper各個類型節點的特色,實現主從模式中的各個角色。在ZooKeeper中建立如下節點用於主從協做:class
/master 表示主節點;
/workers/worker-id 表示從節點;
/tasks/task-id 表示任務;
/assign 表示任務分配狀況。
由於只有一個進程會成爲主節點,因此進程成爲主節點後必須鎖定管理權,所以進程須要建立名爲/master的臨時節點,並寫入數據,記錄該進程的信息,如IP,編號等。
其它進程在嘗試建立/master成爲主節點時,ZooKeeper會報錯,提示該節點已存在。然而主節點可能會崩潰,其它節點須要接替它成爲主節點,所以須要在主節點/master上設置監視點(watch)。當監視到/master不存在時,該進程再次建立/master節點,嘗試成爲主節點。
從節點首先要通知主節點,告知主節點本身能夠執行任務。從節點經過在/workers子節點下建立臨時節點,並在字節點中使用主機名或IP來標識本身,如:/workers/worker1.example.com。主節點經過監視(watch)/workers節點,獲取全部可用的從節點信息。
從節點須要在/assign下建立本身的子節點,用於接收任務分配,如/assign/worker1.example.com,並監視這個節點的變化,等待新的任務。
客戶端向系統中添加任務(有序節點),咱們須要按照任務添加的順序建立節點,其本質上是一個隊列。如執行操做create -s /tasks/task-,會生成/tasks/task-00(數字依次遞增),客戶端須要知道該任務的完成狀態,所以須要監視(watch)該節點。
主節點監視/tasks,當客戶端添加任務時,建立/tasks/task-00,主節點收到通知,會去/workers下檢查可用的從節點。
獲取到從節點列表後,選擇其中一個從節點,分派任務:/assign/worker1.example.com/task-00。
從節點經過監視/assign/worker1.example.com,獲取本身的任務,並執行。任務完成後,從節點會在/tasks/task-00下更新狀態,告知客戶端該任務已完成:/tasks/task-00/status。
客戶端收到完成任務完成的通知後,整個任務的執行就結束了。固然任務可能會很是複雜,甚至涉及另外一個分佈式系統。可是無論是什麼樣的任務,執行的機制與經過ZooKeeper來傳遞結果,本質上都是同樣的。
若是各位有好的想法,歡迎關注個人公衆號(程序員順仔)留言討論~