利用 Java API 監控 Zookeeper 的結點變化

作爲分佈式系統的協調工具,Zookeeper 在 Hadoop 生態系統裏扮演着很重要的角色。因爲利用 Zookeeper,我們可以很輕鬆地在分佈式系統裏實現諸如“統一命名服務”、“分佈式鎖服務”、“ 配置管理”和“選舉領導者”等功能。而Zookeeper能有如此多用武之地的主要原因是它擁有分佈式系統中至關重要的幾個性能:高一致性、高可用性和高性能。其中最重要的特性是高一致性。 在分佈式系統裏面實現高一致性是件很困難的事情,而Zookeeper實現這個特性主要根據Paxos算法——該算法可謂大名鼎鼎,是一個由Leslie Lamport在1990年提出的基於消息傳遞的一致性算法。

本文主要展示一個非常簡單的 Zookeeper Java 程序,旨在通過該小程序來窺看Zookeeper的兩個基本功能:結點監控功能和數據一致性功能。該程序會監控一個指定的Zookeeper 的結點的變化,並且在該結點變化後在Watcher.process()方法裏面讀取最新的結點內容(本文章的代碼結構借鑑於blog http://blog.csdn.net/ganglia/article/details/11785777,在此感謝!)。代碼中監控的結點是/root/ele-charge, 其內容是Paxos島上的當前電費。

Java 代碼:





爲做測試,我搭建了一個Zookeeper 集羣,它包含3個Zookeeper server:Server1, Server2和Server3。在運行本代碼之前,我先在一個結點上通過zkCli.sh連接到Server1,並且創建好目標結點/root/ele-charge,並且賦予其值爲“$0.5”:


然後,將該Java code打包爲zk.jar,並在另一個結點上執行該jar包。命令爲“java -Xbootclasspath/a:zookeeper-3.4.5.jar:lib/log4j-1.2.15.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar -r zk.jar”。此時,可以看到該Java client會一直監控目標結點/root/ele-charge:

此時,如果目標結點/root/ele-charge沒有什麼變化,則不會觸發任何Java client端的代碼。所以,我們可以在剛纔通過zkCli.sh建立的client連接來將/root/ele-charge的值更新爲“$0.8”:


接着,Java client端的Watcher.process()方法被觸發,併成功得到最新的/root/ele-charge值!


發佈了29 篇原創文章 · 獲贊 6 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章