1. 程式人生 > >Zookeeper+websocket實現對分散式伺服器的實時監控(附原始碼下載)

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