ZooKeeper學習第四期—構建ZooKeeper應用
ZooKeeper學習第四期—構建ZooKeeper應用
一、配置服務
配置服務是分散式應用所需要的基本服務之一,它使叢集中的機器可以共享配置資訊中那些公共的部分。簡單地說,ZooKeeper可以作為一個具有高可用性的配置儲存器,允許分散式應用的參與者檢索和更新配置檔案。使用ZooKeeper中的觀察機制,可以建立一個活躍的配置服務,使那些感興趣的客戶端能夠獲得配置資訊修改的通知。
下面來編寫一個這樣的服務。我們通過兩個假設來簡化所需實現的服務(稍加修改就可以取消這兩個假設)。
第一,我們唯一需要儲存的配置資料
第二,在任何時候只有一個客戶端會執行更新操作。
除此之外,這個模型看起來就像是有一個主人(類似於HDFS中的namenode)在更新資訊,而他的工人則需要遵循這些資訊。
在名為ActiveKeyValueStore的類中編寫了如下程式碼:
package org.zk; import java.nio.charset.Charset; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.data.Stat; public class ActiveKeyValueStore extends ConnectionWatcher { private static final Charset CHARSET=Charset.forName("UTF-8"); public void write(String path,String value) throwsKeeperException, InterruptedException { Stat stat = zk.exists(path, false); if(stat==null){ zk.create(path, value.getBytes(CHARSET),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); }else{ zk.setData(path, value.getBytes(CHARSET),-1); } } public String read(String path,Watcher watch) throws KeeperException, InterruptedException{ byte[] data = zk.getData(path, watch, null); return new String(data,CHARSET); } }
View Code
write()方法的任務是將一個關鍵字及其值寫到ZooKeeper。它隱藏了建立一個新的znode和用一個新值更新現有znode之間的區別,而是使用exists操作來檢測znode是否存在,然後再執行相應的操作。其他值得一提的細節是需要將字串值轉換為位元組陣列,因為我們只用了UTF-8編碼的getBytes()方法。☆☆☆
read()方法的任務是讀取一個節點的配置屬性。ZooKeeper的getData()方法有三個引數:
(1)路徑
(2)一個觀察物件
(3)一個Stat物件
Stat物件由getData()方法返回的值填充,用來將資訊回傳給呼叫者。通過這個方法,呼叫者可以獲得一個znode的資料和元資料,但在這個例子中,由於我們對元資料不感興趣,因此將Stat引數設為null。
為了說明ActiveKeyValueStore的用法,我們編寫了一個用來更新配置屬性值的類ConfigUpdater,如程式碼1.1所示。
程式碼1.1 用於隨機更新ZooKeeper中的屬性
package org.zk; import java.io.IOException; import java.util.Random; import java.util.concurrent.TimeUnit; import org.apache.zookeeper.KeeperException; public class ConfigUpdater { public static final String PATH="/config"; private ActiveKeyValueStore store; private Random random=new Random(); public ConfigUpdater(String hosts) throws IOException, InterruptedException { store = new ActiveKeyValueStore(); store.connect(hosts); } public void run() throws InterruptedException, KeeperException{ while(true){ String value=random.nextInt(100)+""; store.write(PATH, value); System.out.printf("Set %s to %s\n",PATH,value); TimeUnit.SECONDS.sleep(random.nextInt(100)); } } public static void main(String[] args) throws IOException, InterruptedException, KeeperException { ConfigUpdater configUpdater = new ConfigUpdater(args[0]); configUpdater.run(); } }
View Code
這個程式很簡單,ConfigUpdater中定義了一個ActiveKeyValueStore,它在ConfigUpdater的建構函式中連線到ZooKeeper。run()方法永遠在迴圈,在隨機時間以隨機值更新/config znode。
作為配置服務的使用者,ConfigWatcher建立了一個ActiveKeyValueStore物件store,並且在啟動之後通過displayConfig()呼叫了store的read()方法,顯示它所讀到的配置資訊的初始值,並將自身作為觀察傳遞給store。當節點狀態發生變化時,再次通過displayConfig()顯示配置資訊,並再次將自身作為觀察傳遞給store,參見程式碼1.2:
例1.2 該用應觀察ZooKeeper中屬性的更新情況,並將其列印到控制檯
package org.zk; import java.io.IOException; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.EventType; public class ConfigWatcher implements Watcher{ private ActiveKeyValueStore store; @Override public void process(WatchedEvent event) { if(event.getType()==EventType.NodeDataChanged){ try{ dispalyConfig(); }catch(InterruptedException e){ System.err.println("Interrupted. exiting. "); Thread.currentThread().interrupt(); }catch(KeeperException e){ System.out.printf("KeeperException錛?s. Exiting.\n", e); } } } public ConfigWatcher(String hosts) throws IOException, InterruptedException { store=new ActiveKeyValueStore(); store.connect(hosts); } public void dispalyConfig() throws KeeperException, InterruptedException{ String value=store.read(ConfigUpdater.PATH, this); System.out.printf("Read %s as %s\n",ConfigUpdater.PATH,value); } public static void main(String[] args) throws IOException, InterruptedException, KeeperException { ConfigWatcher configWatcher = new ConfigWatcher(args[0]); configWatcher.dispalyConfig(); //stay alive until process is killed or Thread is interrupted Thread.sleep(Long.MAX_VALUE); } }
View Code
當ConfigUpdater更新znode時,ZooKeeper產生一個型別為EventType.NodeDataChanged的事件,從而觸發觀察。ConfigWatcher在它的process()方法中對這個事件做出反應,讀取並顯示配置的最新版本。由於觀察僅傳送單次訊號,因此每次我們呼叫ActiveKeyValueStore的read()方法時,都將一個新的觀察告知ZooKeeper來確保我們可以看到將來的更新。但是,我們還是不能保證接收到每一個更新,因為在收到觀察事件通知與下一次讀之間,znode可能已經被更新過,而且可能是很多次,由於客戶端在這段時間沒有註冊任何觀察,因此不會收到通知。對於示例中的配置服務,這不是問題,因為客戶端只關心屬性的最新值,最新值優先於之前的值。但是,一般情況下,這個潛在的問題是不容忽視的。
讓我們看看如何使用這個程式。在一個終端視窗中執行ConfigUpdater,然後在另一個客戶端執行ConfigWatcher,我們可以預先分別在兩個客戶端輸入命令,先不按回車,等兩個客戶端的命令輸入好後,先在執行ConfigUpdater的客戶端按回車,再在另一個客戶端按回車,執行結果如下:
相關推薦
ZooKeeper學習第四期---構建ZooKeeper應用
一、配置服務 配置服務是分散式應用所需要的基本服務之一,它使叢集中的機器可以共享配置資訊中那些公共的部分。簡單地說,ZooKeeper可以作為一個具有高可用性的配置儲存器,允許分散式應用的參與者檢索和更新配置檔案。使用ZooKeeper中的觀察機制,可以建立一個活躍的配置服務,使那些感興趣的客戶端能夠獲得
ZooKeeper學習第四期—構建ZooKeeper應用
ZooKeeper學習第四期—構建ZooKeeper應用 一、配置服務 配置服務是分散式應用所需要的基本服務之一,它使叢集中的機器可以共享配置資訊中那些公共的部分。簡單地說,ZooKeeper可以作為一個具有高可用性的配置儲存器,允許分
ZooKeeper學習第七期--ZooKeeper一致性原理
一、ZooKeeper 的實現 1.1 ZooKeeper處理單點故障 我們知道可以通過ZooKeeper對分散式系統進行Master選舉,來解決分散式系統的單點故障,如圖所示。 圖 1.1 ZooKeeper解決單點故障 那麼我們繼續分析一下,ZooKeeper通過Master選舉來幫助分散
ZooKeeper學習第八期——ZooKeeper伸縮性
一、ZooKeeper中Observer 1.1 ZooKeeper角色 經過前面的介紹,我想大家都已經知道了在ZooKeeper叢集當中有兩種角色Leader和Follower。Leader可以接受client 請求,也接收其他Server轉發的寫請求,負責更新系統狀態。 Follower也可以接收
ZooKeeper學習第六期---ZooKeeper機制架構
一、ZooKeeper許可權管理機制 1.1 許可權管理ACL(Access Control List) ZooKeeper 的許可權管理亦即ACL 控制功能,使用ACL來對Znode進行訪問控制。ACL的實現和Unix檔案訪問許可非常相似:它使用許可位來對一個節點的不同操作進行允許或禁止的權 限
ZooKeeper學習第五期--ZooKeeper管理分散式環境中的資料
引言 本節本來是要介紹ZooKeeper的實現原理,但是ZooKeeper的原理比較複雜,它涉及到了paxos演算法、Zab協議、通訊協議等相關知 識,理解起來比較抽象所以還需要藉助一些應用場景,來幫我們理解。由於內容比較多,一口氣吃不成胖子,得慢慢來一步一個腳印,因此我對後期 ZooKeeper的學習規
ZooKeeper學習第七期–ZooKeeper一致性原理
ZooKeeper學習第七期–ZooKeeper一致性原理 <div class="postBody"> <div id="cnblogs_post_body" class="blogpost-body"><h2
ZooKeeper學習第六期—ZooKeeper機制架構
ZooKeeper學習第六期—ZooKeeper機制架構 一、ZooKeeper許可權管理機制 1.1 許可權管理ACL(Access Control List) ZooKeeper 的許可權管理亦即ACL 控制功能,使用
ZooKeeper學習第五期–ZooKeeper管理分散式環境中的資料
ZooKeeper學習第五期–ZooKeeper管理分散式環境中的資料 引言 本節本來是要介紹ZooKeeper的實現原理,但是ZooKeeper的原理比較複雜,它涉及到了paxos演算法、Zab協議、通訊協議等相關知識,理解起來比較抽
【Yolo的聽課筆記一】七月線上 深度學習第四期 深度學習初步 Softmax, DNN, Wide&&Deep Model
【Yolo的聽課筆記一】深度學習初步 Softmax, DNN, Wide&&Deep Model 我是剛剛接觸計算機視覺的小白Yolo,很多知識都處於摸索階段。為了記錄自己的學習歷程,我在這裡把自己的學習內容進行總結. 聽課筆記
【阿里雲總監課第四期】時髦的雲原生應用怎麼寫?
概述應用已經跨入了雲原生的時代。要寫一個時髦的雲原生應用,首先當然要了解什麼是雲原生。CNCF,也就是雲原生計算基金會,作為目前人氣最旺的雲端計算行業協會,在今年6月份給出了雲原生的定義,阿里雲牽頭做了一個官方的翻譯: “雲原生技術有利於各組織在公有云、私有云和混合雲等新型動態環境中,構建和執行可彈性擴充套
ZooKeeper學習第三期---Zookeeper命令操作
一、Zookeeper的四字命令 Zookeeper支援某些特定的四字命令字母與其的互動。他們大多數是查詢命令,用來獲取Zookeeper服務的當前狀態及相關資訊。使用者在客戶端可以通過telnet或nc向Zookeeper提交相應的命令。Zookeeper常用的四字命令見下圖所示。 下圖,是Zoo
ZooKeeper學習第三期---zookeeper常用配置
基本配置 clientPort 該引數無預設值,必須配置,不支援系統屬性方式配置。引數clientPort用於配置當前伺服器對外的伺服器埠,客戶端會通過該埠和Zookeeper伺服器建立連線,一般設定為2181。每臺Zookeeper伺服器都可以配置任意可用的埠,同時,叢集
阿里雲總監課第四期,時髦的雲原生應用怎麼寫?
概述 應用已經跨入了雲原生的時代。要寫一個時髦的雲原生應用,首先當然要了解什麼是雲原生。CNCF,也就是雲原生計算基金會,作為目前人氣最旺的雲端計算行業協會,在今年6月份給出了雲原生的定義,阿里雲牽頭做了一個官方的翻譯: “雲原生技術有利於各組織在公有云、私有云和混合雲等新型動態環境中,
ZooKeeper學習第三期—Zookeeper命令操作
ZooKeeper學習第三期—Zookeeper命令操作 一、Zookeeper的四字命令 Zookeeper支援某些特定的四字命令字母與其的互動。他們大多數是查詢命令,用來獲取Zookeeper服務的當前狀態及相關資訊。使用者在客戶端
ZooKeeper學習第二期–ZooKeeper安裝配置
ZooKeeper學習第二期–ZooKeeper安裝配置 一、Zookeeper的搭建方式 Zookeeper安裝方式有三種,單機模式和叢集模式以及偽叢集模式。 ■ 單機模式:Zookeeper只執行在一臺伺服器上,適合測試環
ZooKeeper學習第一期—Zookeeper簡單介紹
ZooKeeper學習第一期—Zookeeper簡單介紹 一、分散式協調技術 在給大家介紹ZooKeeper之前先來給大家介紹一種技術——分散式協調技術。那麼什麼是分散式協調技術?那麼我來告訴大家,其實分散式協調技術主要用來解決分散式
zookeeper學習筆記(五)——具體應用:秒殺
秒殺一般有幾個場景 1.電商秒殺商品 2.搶紅包 3.搶票 假設一個場景如下 某電商公司搞活動,一折秒殺,推出幾種秒殺的商品,每種商品1000個,預計100w人搶購 要求: 不能超賣.絕對不可以賣多了. 資料庫要扣減庫存,並且記錄訂單明細
zookeeper學習(四):配置zookeeper叢集節點的操作
1.zookeeper的節點就是一個樹形結構。 2.對節點的操作 1、使用 ls 命令來檢視當前 ZooKeeper 中所包含的內容: ls / 2、建立一個新的 znode ,使用 create /zk myData 。這個命令建立了一個新的 znode
Linux學習第四章
linux5-1-1查看系統負載命令命令 w或命令uptimeload average :a(1分鐘內系統的平均負載 ),b(5分鐘內),c(15分鐘內)a:一分鐘內有多少個進程使用cpucat /proc/cpuinfo 顯示的processor的值就是cpu核數a>核數 負載偏高5-1-2vmsta