本文為原創文章,轉載請註明出處,謝謝 Master 選舉 1、原理 伺服器爭搶創建標誌為Master的臨時節點 伺服器監聽標誌為Master的臨時節點,當監測到節點刪除事件後展開新的一輪爭搶 某個伺服器成功創建則為Master 2、架構圖 Master:伺服器爭搶節點 Servers:伺服器列表節點 ...
本文為原創文章,轉載請註明出處,謝謝
Master 選舉
1、原理
- 伺服器爭搶創建標誌為Master的臨時節點
- 伺服器監聽標誌為Master的臨時節點,當監測到節點刪除事件後展開新的一輪爭搶
- 某個伺服器成功創建則為Master
2、架構圖
- Master:伺服器爭搶節點
- Servers:伺服器列表節點
- work Server:伺服器節點
3、流程圖
4、核心代碼
- workServer監聽
public WorkServer(final ServerData serverData) { this.serverData = serverData; dataListener = new IZkDataListener() { @Override public void handleDataChange(String s, Object o) throws Exception { } @Override public void handleDataDeleted(String s) throws Exception { //toBeMaster(); //適應網路抖動 if(null!=masterData && masterData.getName().equals(serverData.getName())) { toBeMaster(); }else{ executorService.schedule(new Runnable() { @Override public void run() { toBeMaster(); } },10, TimeUnit.SECONDS); } } }; }
適應網路抖動:當網路發生異常可能會出現短時間的斷開,發生此情況時給予節點創建的延時,如果上次保存Master信息為當前節點,則此次Master節點爭搶會有10秒鐘的優勢
- 爭搶Master
public void toBeMaster() { if(!running) return; //創建臨時節點,session連接失敗自動刪除 try{ zkClient.create(MASTER_NOTE,serverData, CreateMode.EPHEMERAL); masterData = serverData; System.out.println("當前master:"+masterData.getName()); //測試使用,每5秒釋放master節點 if(checkMaster()) { executorService.schedule(new Runnable() { @Override public void run() { releaseMaster(); } },detay,TimeUnit.SECONDS); } }catch (ZkNodeExistsException e){ //如果master節點已經存在 讀取 ServerData data = zkClient.readData(MASTER_NOTE,true); //數據為空說明此時master 宕機 if(null==data){ toBeMaster(); }else{ masterData = data; } } }
-
ZkNodeExistsException :說明已存在Master節點
- 存在後讀取節點數據,如果節點數據不存在則說明此時Master宕機,進行爭搶
-