Zookeeper+websocket實現對分佈式服務器的實時監控(附源碼下載)

我就是個封面html

Zookeeper簡介

Zookeeper是Hadoop的一個子項目,它是分佈式系統中的協調系統。java

簡單來講就是一個Zookeeper註冊同步中心,內部結構爲一個樹形目錄,每一個節點上能夠存放必定量(默認的數據量上限是1M,可是能夠經過調整參數修改)的數據,客戶端(一段經過Zookeeperapi編寫的程序或者一個cmd和shell窗口)鏈接Zookeeper後,能夠在任何節點上註冊監聽(watcher),當節點被刪除或者節點上的數據有變化時,Zookeeper會主動觸發註冊在當前節點上的監聽程序。node

同時Zookeeper相似於文件系統,各個節點均可以配置不一樣的讀寫訪問權限。linux

zookeeper自己是支持多個zookeeper組成集羣,利用選舉機制選出負責不一樣職責的角色,本文暫不涉及。web

案例

備註:因爲全文粘貼代碼實在很差排版,本文代碼相關部分,只介紹了相關片斷,完整的請下載後查看。shell

界面示例(動效):

本文利用Zookeeper節點可存放數據以及節點可監聽的機制,藉助WebSocket實現對多個服務器的實時監控。具體web端效果以下(因爲是模擬,界面略顯粗糙):編程

能夠同時打開多個瀏覽器,接收WebSocket推送的實時監控數據。api

 

實現邏輯

 

實現過程

本文用到maven以及websocket,這兩部份內容本文只作配置介紹,相關知識需本身提早掌握。同時zookeeper的詳細命令和api也不作詳細解釋,可本身試驗。瀏覽器

環境:服務器

eclispe Oxygen Release (4.7.0);

maven 3.2.2

Zookeeper3.4.13

win10環境(通常線上都是linux環境,這裏爲了省事全部都在本身的筆記本上折騰的,因此用了win環境)

一、Zookeeper的安裝

安裝比較簡單,這裏略過,下載後解壓,配置zoo.cfg裏面的目錄參數,完後就能夠啓動了。

二、啓動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

三、建立根目錄

經過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斷開後,須要刪除節點,這樣才監控程序才能知道服務器下線了。固然實際線上應該都會採用持久化節點,而後經過狀態數據來判斷,這裏就偷懶了。

三、代碼編寫

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配置以下:

 

一、business-server(服務器指標採集程序) 代碼片斷:

代碼邏輯爲:啓動後(main方法)鏈接zookeeper並創建臨時節點,同時初始化數據,以後啓動模擬指標採集的線程,間隔一段時間生成隨機指標數據。

 

建立臨時節點代碼片斷:

 

其中ACL是zookeeper的節點訪問權限配置,也須要自行腦補。

模擬指標變化並將數據更新到節點上

 

其中ServerData是我本身建立的bean對象,用於存放服務器指標,以下:

主要包含3個模擬指標,cpu,內存,磁盤,可本身添加。指標和zookeeper無關。

至此採集程序代碼就結束了。

二、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就好了。

三、monitor.jsp獲取實時監控數據

以上即是這個例子的完成介紹過程。

源碼下載

爲防止地址失效,全部下載連接都在公衆號維護,請關注公衆號後,回覆「R002」 獲取完整源碼。

相關文章
相關標籤/搜索