主-從模式的模型中,主要包括三個角色:
主節點:主要負責監視新的節點和任務,分配任務給可用的從節點;
從節點:通過註冊自己,確保主節點看到它們可以執行任務,收到主節點分配的任務後,執行並記錄狀態;
客戶端:建立新的任務並等待系統響應。
現通過zookeeper的api完成簡單的主從協作。在此之前,需了解下zookeeper中節點的基本概念。節點的型別分為以下幾類:
1. 持久節點:節點建立後就一直存在,直到有刪除操作來主動刪除該節點
2. 臨時節點:臨時節點的生命週期和建立該節點的客戶端會話繫結,即如果客戶端會話失效(客戶端宕機或下線),這個節點自動刪除
3. 時序節點:建立節點是可以設定這個屬性,zookeeper會自動為給定的節點加上乙個數字字尾,作為新的節點名。數字字尾的範圍是整型的最大值
4. 臨時性時序節點:同時具備臨時節點與時序節點的特性,主要用於分布式鎖的實現
基於zookeeper各個型別節點的特點,實現主從模式中的各個角色。在zookeeper中建立以下節點用於主從協作:
/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來傳遞結果,本質上都是一樣的。
zookeeper主從服務切換
zookeeper使用curatorframework實現主從服務切換demo,下面github上的demo可以直接執行。demo使用springboot jdk1.8 zookeeper 3.4.12 demo主要實現了,當前服務部署在多台伺服器上時,需要其中一台來跑定時任務時,優先搶到leade...
Dubbo基於Zookeeper實現分布式服務
點關注不迷路,歡迎再訪!精簡部落格內容,盡量已行業術語來分享。努力做到對每一位認可自己的讀者負責。幫助別人的同時更是豐富自己的良機。既然是新手教學,肯定很多同學不明白什麼是分布式和遠端服務呼叫,為什麼要分布式,為什麼要遠端呼叫。下圖為例 以前什麼的都在乙個伺服器上,呼叫方法直接就自然而然呼叫了,沒啥...
基於Amoba實現mysql主從讀寫分離
一 amoeba簡介 amoeba是乙個以mysql為底層資料儲存,並對應用提供mysql協議介面的proxy。它集中地響應應用的請求,依據使用者事先設定的規則,將sql請求傳送到特定的資料庫上執行。基於此可以實現負載均衡 讀寫分離 高可用性等需求。與mysql官方的mysql proxy相比,作者...