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” 獲取完整源碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM