我就是個封面
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” 獲取完整源碼。