1. 程式人生 > >ZooKeeper學習第四期—構建ZooKeeper應用

ZooKeeper學習第四期—構建ZooKeeper應用

ZooKeeper學習第四期—構建ZooKeeper應用

一、配置服務

配置服務是分散式應用所需要的基本服務之一,它使叢集中的機器可以共享配置資訊中那些公共的部分。簡單地說,ZooKeeper可以作為一個具有高可用性的配置儲存器,允許分散式應用的參與者檢索和更新配置檔案。使用ZooKeeper中的觀察機制,可以建立一個活躍的配置服務,使那些感興趣的客戶端能夠獲得配置資訊修改的通知。

下面來編寫一個這樣的服務。我們通過兩個假設來簡化所需實現的服務(稍加修改就可以取消這兩個假設)。

第一,我們唯一需要儲存的配置資料

字串關鍵字znode的路徑,因此我們在每個znode上儲存了一個鍵/值對。
第二,在任何時候只有一個客戶端會執行更新操作。

除此之外,這個模型看起來就像是有一個主人(類似於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) throws
KeeperException, 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