Zookeeper+websocket實現對分散式伺服器的實時監控(附原始碼下載)
我就是個封面
Zookeeper簡介
Zookeeper是Hadoop的一個子專案,它是分散式系統中的協調系統。
簡單來說就是一個Zookeeper註冊同步中心,內部結構為一個樹形目錄,每個節點上可以存放一定量(預設的資料量上限是1M,但是可以通過調整引數修改)的資料,客戶端(一段通過Zookeeperapi編寫的程式或者一個cmd和shell視窗)連線Zookeeper後,可以在任何節點上註冊監聽(watcher),當節點被刪除或者節點上的資料有變化時,Zookeeper會主動觸發註冊在當前節點上的監聽程式。
同時Zookeeper類似於檔案系統,各個節點都可以配置不同的讀寫訪問許可權。
zookeeper本身是支援多個zookeeper組成叢集,利用選舉機制選出負責不同職責的角色,本文暫不涉及。
案例
備註:由於全文貼上程式碼實在不好排版,本文程式碼相關部分,只介紹了相關片段,完整的請下載後檢視。
介面示例(動效):
本文利用Zookeeper節點可存放資料以及節點可監聽的機制,藉助WebSocket實現對多個伺服器的實時監控。具體web端效果如下(由於是模擬,介面略顯粗糙):
可以同時開啟多個瀏覽器,接收WebSocket推送的實時監控資料。
實現邏輯
實現過程
本文用到maven以及websocket,這兩部分內容本文只做配置介紹,相關知識需自己提前掌握。同時zookeeper的詳細命令和api也不做詳細解釋,可自己試驗。
環境:
eclispe Oxygen Release (4.7.0);
maven 3.2.2
Zookeeper3.4.13
win10環境(一般線上都是linux環境,這裡為了省事所有都在自己的筆記本上折騰的,所以用了win環境)
1、Zookeeper的安裝
安裝比較簡單,這裡略過,下載後解壓,配置zoo.cfg裡面的目錄引數,完後就可以啟動了。
2、啟動Zookeeper
開啟cmd視窗執行Zookeeper安裝目錄bin下的zkServer.cmd,即可。
也可寫個bat檔案,方便每次使用,內容(儲存即可,其中d:\zookeeper-3.4.13\bin是我的zookeeper的bin目錄)如下:
cd d:\zookeeper-3.4.13\bin
d:
zkServer.cmd
@pause
3、建立根目錄
通過cmd連線到Zookeeper建立更目錄/servers,也可通過java程式碼來建立。
client的bat啟動內容參考如下:
cd d:\zookeeper-3.4.13\bin
d:
zkCli.cmd -server 127.0.0.1:2181
@pause
回車之後,通過命令create /server serverlist 完成根節點的建立, 後面所有待監控的伺服器都在此節點下建立子節點(臨時節點)。
關於zookeeper節點的型別,也請自行腦補。
這裡根節點為持久化節點,伺服器資料節點為臨時節點,是因為伺服器程式在於zookeeper斷開後,需要刪除節點,這樣才監控程式才能知道伺服器下線了。當然實際線上應該都會採用持久化節點,然後通過狀態資料來判斷,這裡就偷懶了。
3、程式碼編寫
maven配置
整個示例有2個專案組成:一個是模擬伺服器的程式(定時採集監控指標,把指標資料更新到node上),一個是監控程式(用於監控zookeeper節點變化,並獲取節點資料計算閾值,並通過Websocket推送資料到瀏覽器)。
business-server(伺服器指標採集程式)的maven配置
只依賴zookeeper的jar:
business-server-monitor(監控程式)的maven配置:
由於有web介面,所以需依賴Servlet、JavaEE相關包,同時容器採用了maven的jetty外掛,關於maven配置jetty以及如何啟動可以參考上一篇文章中的相關介紹:模組化程式設計及Maven配置最佳實踐之一。
當然實現Websocket的方式有很多,比如SpringMvc,SpringBoot等等,這裡為了防止太多幹擾就用了原生寫法。具體maven配置如下:
1、business-server(伺服器指標採集程式) 程式碼片段:
程式碼邏輯為:啟動後(main方法)連線zookeeper並建立臨時節點,同時初始化資料,之後啟動模擬指標採集的執行緒,間隔一段時間生成隨機指標資料。
建立臨時節點程式碼片段:
其中ACL是zookeeper的節點訪問許可權配置,也需要自行腦補。
模擬指標變化並將資料更新到節點上
其中ServerData是我自己建立的bean物件,用於存放伺服器指標,如下:
主要包含3個模擬指標,cpu,記憶體,磁碟,可自己新增。指標和zookeeper無關。
至此採集程式程式碼就結束了。
2、business-server-monitor(監控程式)實時監控zookeeper節點變化並推送資料的程式碼片段
專案啟動採用了JavaEE的ServletContextListener監聽啟動的方式來啟動和Zookeeper的連線,需要在web.xml配置這個Listener。
繼承ServletContextListener
當jetty容器初始化後,觸發建立和zookeeper的連線並註冊監聽:
然後通過Zookeeper api中的的getChildren獲取節點資料並啟動監聽,
List<String> servers = zk.getChildren(ServerData.serverRootNode, true);
當節點發生資料變化時觸發監聽的process方法,process方法獲取根節點下的所有子節點的資料並封裝成ServerData物件列表,用於websocket推送。
之後通過Websocket推送到瀏覽器:
Websocket配置很簡單,只需要註釋上先關annotation(@ServerEndpoint)即可,無需其他配置,容器啟動時會自行掃描到此類。
推送資料這裡就簡單了拼接成了html,介面上就直接放在div就行了。
3、monitor.jsp獲取實時監控資料
以上便是這個例子的完成介紹過程。
原始碼下載
為防止地址失效,所有下載連結都在公眾號維護,請關注公眾號後,回覆“R002” 獲取完整原始碼。