1. 程式人生 > >使用Apache Curator管理ZooKeeper

使用Apache Curator管理ZooKeeper

Apache ZooKeeper是為了幫助解決複雜問題的軟體工具,它可以幫助使用者從複雜的實現中解救出來。 然而,ZooKeeper只暴露了原語,這取決於使用者如何使用這些原語來解決應用程式中的協調問題。 社群已經在ZooKeeper資料模型及其API之上開發了高階框架。 Apache Curator是一個高階的包裝類庫和框架,使得ZooKeeper非常簡單易用。

Tips
Curator最初由Netflix開發,現在是一個Apache專案。 專案頁面位於http://curator.apache.org/
一 Curator元件

Curator是ZooKeeper的高階類庫;它使處理ZooKeeper變得更容易,並擴充套件了核心ZooKeeper的功能。 Curator在高層次上由以下部分組成:

Client:Curator客戶端是ZooKeeper的Java客戶端的一個包裝器。 它是Curator堆疊中的一個低階API,並且抽象出ZooKeeper客戶端的功能。
Framework:Curator框架是一個具有高階功能的高階API,如自動連線管理,操作重試等等。 它在很大程度上簡化了ZooKeeper的使用。
Recipe:Curator Recipe提供ZooKeeper Recipe的實現; 這些實現可以直接用於分散式應用程式來解決協調問題。
Extensions:Curator Recipe包實現了常見的Recipe。 為了避免這個包的膨脹,使用一個單獨的擴充套件包。
除了前面的元件外,Curator還附帶一些ZooKeeper有用的工具。 Curator堆疊如下圖所示:

Curator JARs可以在Maven Central的倉庫中找到。 Curator可以很容易地包含在Maven,Gradle,Ivy,SBT等構建指令碼中。

二 Curator客戶端

Curator Client是ZooKeeper Java客戶端的一個包裝器。它使客戶端訪問ZooKeeper更簡單,更不易出錯。

Curator客戶端提供以下功能:

連線管理:管理與ZooKeeper伺服器的連線
操作重試實用程式:這是重試操作的機制
測試ZooKeeper伺服器:這是用於測試ZooKeeper伺服器
使用Curator客戶端連線ZooKeeper伺服器的MyCuratorClient.java的程式碼片段如下:

public void myCuratorClient() throws Exception
{
CuratorZookeeperClient client = new CuratorZookeeperClient(server.getConnectString(), 10000, 10000, null,new RetryOneTime(1));
client.start();
try
{
client.blockUntilConnectedOrTimedOut();
String path = client.getZooKeeper().create(“/test_znode”, “”.getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
finally
{
client.close();
}
}
CuratorZooKeeperClient構造方法用於連線到ZooKeeper伺服器。 它需要連線字串或ZooKeeper主機埠對列表,會話和連線超時時間,可選的觀察器物件以及要使用的重試策略。 重試策略是客戶端在重試連線時嘗試各種重試機制的機制。在前面的例子中,使用了一個客戶端只會重試一次的策略。

Curator客戶端支援以下重試策略:

BoundedExponentialBackoffRetry:通過增加重試之間的休眠時間直到最大上限重試指定的次數
ExponentialBackoffRetry:通過增加重試之間的休眠時間來重試指定的次數
RetryNTimes:重試n次
RetryOneTime:只重試一次
RetryUntilElapsed:一直重試,直到超過指定時間
一旦客戶端啟動,blockUntilConnectedOrTimedOut方法直到ZooKeeper連線伺服器成功或者連線超時。連線成功之後,建立/testznode的znode。getZooKeeper()方法將連線的例項返回給託管的ZooKeeper伺服器。

Note
Curator API文件可在http://curator.apache.org/apidocs/index.html察看。
Curator客戶端是一個低層次的API,它提供了對管理員客戶端API的抽象。開發人員應該使用Curator框架,而不是直接在他們的應用程式中使用CuratorZookeeperClient類作為最佳實踐。

三 Curator框架

Curator框架(org.apache.curator.framework)是一個高層次的API,很大程度上簡化了ZooKeeper的使用。 它提供的一些功能如下:

自動連線管理:此功能自動且透明地處理客戶端需要重新建立與ZooKeeper伺服器的連線和/或重試操作的場景。
簡單而靈活的API:使用一組新式且流暢的介面來應用ZooKeeper原始的API。
Recipe:這個功能實現了常見的ZooKeeper Recipe。
CuratorFramework使用CuratorFrameworkFactory進行分配。 它提供了工廠方法以及構造器建立例項。CuratorFramework例項完全是執行緒安全的。在使用CuratorFramework開發應用程式時,開發人員應該為每個ZooKeeper叢集建立和共享一個CuratorFramework例項。CuratorFramework使用fluent風格介面。

以下展示的是ZooKeeper客戶端使用CuratorFramework的程式碼示例:

public void myCuratorFrameworkClient()
throws Exception
{
CuratorFramework client =
CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));
client.start();
try
{
String path = client.create().withMode(
CreateMode.PERSISTENT).forPath(
“/test_znode”, “”.getBytes());
}
finally
{
client.close();
}
}
newClient()工廠方法建立一個新的客戶端例項,預設會話超時和預設連線超時。 它需要一個連線字串,是ZooKeeper主機-埠對列表和要使用的重試策略。

CuratorFramework有一個名稱空間的概念。 通過這個,可以在使用構造器方法建立CuratorFramework例項時設定名稱空間。 當其中一個API被呼叫時,該框架將該名稱空間預載入到所有路徑:

CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder();
CuratorFramework client = builder.connectString (server.getConnectString()).namespace(“MyApp”).retryPolicy(new RetryOneTime(1)).build();
client.create().forPath(“/test_znode”, data);
在這裡,儘管znode的名稱被指定為/test_znode,但是建立的實際znode是/MyApp/test_znode。

Curator框架還提供了一個名為CuratorTempFramework的有限功能框架介面,用於通過不可靠的網路(如WAN)進行臨時連線。 在這個框架中,如果會話保持空閒一段時間,ZooKeeper連線將被關閉。

四 Curator recipe

在這裡,將簡略地介紹一下ZooKeeper的recipe:

領導者選舉:Curator為領導選舉提供了兩種演算法:領導者鎖定(leader latch)和領導者選擇( leader selector)。兩種演算法在連線到Zookeeper叢集的多個競爭者中選擇一個“領導者”。
在領導者鎖定中,如果一組n個參與者與競爭領導,則將n個參與者中的一個隨機分配為領導,而在領導選擇中,按照到達該Zookeeper伺服器的請求的順序來選擇領導。 當領導者解除領導時,選擇叢集中的n個參與者的另一個競爭者。
鎖:Curator實現以下不同型別的分散式鎖:
共享重入鎖:這種型別的鎖提供全域性同步的全分佈鎖。
共享鎖:這是非重入共享重入鎖。
共享重入讀/寫鎖:這是一個可跨JVM使用的重入讀/寫互斥鎖。
共享訊號量:這是一個計數訊號量(semaphore),可以跨JVM使用。
多鎖共享:這是用來管理多個鎖作為一個單一的實體。 acquire()呼叫獲取所有的鎖。 如果呼叫失敗,所有獲得的路徑被釋放。 release()呼叫釋放所有託管的鎖。
屏障(Barrier):這是屏障和雙重屏障的具體實現。
計數器:提供了一種機制來管理共享計數器的共享整數。它還給出了分散式原子增量的分散式原子長整型,分散式原子整型和分散式原子值的機制。
快取:快取是通過路徑快取,節點快取和樹快取recipe實現的,分別儲存ZK路徑的znode,本地快取節點和所有本地快取的子節點的狀態變化資料。
佇列:這提供了分散式佇列實現。 支援以下不同型別的佇列:
分散式佇列:這是一個簡單的分散式佇列,其中放入佇列中的條目是在FIFO中排序的。
分散式ID佇列:這是一個分散式佇列的版本,允許一些識別符號與佇列項相關聯。
分散式優先順序佇列:這是ZooKeeper的分散式優先順序佇列的實現。在內部,它使用一個分散式佇列,其中可以將優先順序指定給專案。
分散式延遲佇列:這是使用時間作為優先順序的分散式優先順序佇列的變體。當將條目新增到佇列時,會給出一個延遲值。直到超過延遲時間,該專案將被髮送給消費者。
簡單的分散式佇列:這是ZooKeeper分散式org.apache.zookeeper.recipes.queue.DistributedQueue佇列的一部分替代實現。
節點:這提供了一個persistent ephemeral節點的recipe;這是一個ephemeral的節點,即使在連線和會話中斷的情況下也會試圖保持在ZooKeeper中。
五 Curator實用程式

Curator類庫也為ZooKeeper提供了一些有用的工具。 其中一些如下所示:

Test server:這是一個可用於本地程序ZooKeeper伺服器的測試
Test cluster:這是一個內部執行的用於ZooKeeper伺服器ensemble的測試
ZKPaths:提供了各種使用ZooKeeper znode路徑的靜態方法
EnsurePath:確保在使用之前建立特定znode路徑的實用程式
BlockingQueueConsumer:一個類似於Java中的BlockingQueue的佇列消費者
Reaper:刪除沒有子節點的路徑和沒有資料的節點的實用程式
六 Curator擴充套件

Curator擴充套件包除了包含在recipe包中那些外,還包括額外的recipe。 擴充套件包中的recipe具有curator-x-name的命名約定。

Curator目前提供以下擴充套件功能:

Service discovery:這是一個使用ZooKeeper作為服務發現機制的系統。
Service discovery server:這是一個使用REST服務進行非Java和遺留程式的Curator服務發現。 它公開RESTful Web服務來註冊,刪除和查詢服務。
Curator RPC proxy:該模組實現了一個代理,將非Java環境與Curator框架和recipe橋接在一起。 它使用Apache Thrift,使大量的語言和環境使用Curator的功能,並統一ZooKeeper跨語言/環境的用法。
ZKClient bridge:這個擴充套件是Curator和ZKClient之間的橋樑(https://github.com/sgroschupf/zkclient)。 使用ZKClient編寫的應用程式在不改變現有程式碼的情況下使用Curator類庫會非常有用。 ZKClient bridge不作為Curator分發的一部分進行打包。 它可以在它自己的Maven中心儲存庫中的curator-x-zkclient-bridge中找到。
到目前為止,我們已經瞭解Curator類庫及其各種元件。Curator為ZooKeeper API實現了一個非常好的,可靠的擴充套件,將ZooKeeper的許多複雜性抽象出來。 強烈建議開發人員使用Curator在Java語言的ZooKeeper開發分散式應用程式。 不僅如此,Curator的強大功能也可以從Java以外的語言編寫的應用程式中使用。

相關推薦

使用Apache Curator管理ZooKeeper

Apache ZooKeeper是為了幫助解決複雜問題的軟體工具,它可以幫助使用者從複雜的實現中解救出來。 然而,ZooKeeper只暴露了原語,這取決於使用者如何使用這些原語來解決應用程式中的協調問題。 社群已經在ZooKeeper資料模型及其API之上開發了

Apache Curator操作zookeeper的API使用

zookeeper 分布式 集群 curator 中間件 curator簡介與客戶端之間的異同點 常用的zookeeper java客戶端: zookeeper原生Java API zkclient Apache curator ZooKeeper原生Java API的不足之處: 在

Apache Curator操作zookeeper的API使用——watcher

curator在註冊watch事件上,提供了一個usingWatcher方法,使用這個方法註冊的watch事件和預設watch事件一樣,監聽只會觸發一次,監聽完畢後就會銷燬,也就是一次性的。而這個方法有兩種引數可選,一個是zk原生API的Watcher介面的實現類,另一個是Curator提供的Cur

zookeeperApache curator的使用及zk分布式鎖實現

sets finally tac -- ont zkcli 單節點 基本操作 新建 上篇,本篇主要講Apache開源的curator的使用,有了curator,利用Java對zookeeper的操作變得極度便捷. 其實在學之前我也有個疑慮,我為啥要學curator,撇開漲薪

zookeeperApache curator的使用及zk分散式鎖實現

接上篇,本篇主要講Apache開源的curator的使用,有了curator,利用Java對zookeeper的操作變得極度便捷. 其實在學之前我也有個疑慮,我為啥要學curator,撇開漲薪這些外在的東西,就單技術層面來講,學curator能幫我做些什麼?這就不得不從zookeeper說起,上

zookeeper Apache Curator

1 簡介     Curator是Netflix公司開源的一套Zookeeper客戶端框架。瞭解過Zookeeper原生API都會清楚其複雜度。Curator幫助我們在其基礎上進行封裝、實現一些開發細節,包括接連重連、反覆註冊Watcher和NodeExistsExcep

Apache 開源的curator 基於Zookeeper實現分散式鎖以及原始碼分析

前一段時間,我發表了一篇關於Redis實現分散式鎖 分散式環境下利用Redis實現分散式鎖,今天我帶領大家熟悉用zookeeper實現分散式鎖。 在學習分散式鎖之前,讓我們想一想,在什麼業務場景下會用到分散式鎖以及設計分散式鎖要注意什麼? 分散式鎖介紹 1、在什麼業務場

Apache 日誌管理

apache 以及 完成 路徑 值範圍 acc ota 大小 錯誤 日誌參數 %% 百分號(Apache2.0.44或更高的版本) %a 遠端IP地址 %A 本機IP地址 %B 除HTTP頭以外傳送的字節數 %b 以CLF格式顯示的除HTTP頭以外傳送的字節數,也就是當

csvn(apache+svn)管理工具搭建

系統環境:centos7.4 一、服務端 下載這個檔案並解壓(如果打不開,請下方留言) https://pan.baidu.com/s/1miwdBc8 1、安裝jdk,上傳到伺服器上,解壓 [[email protected] opt]# tar -zxvf jdk-8u91

Curator連線Zookeeper的策略

Curator連線Zookeeper的五種策略: public CuratorOperator(){ /* * * Curator連線Zookeeper的策略:ExponentialBackoffRetry * bas

Apache Curator客戶端

一:Apache Curator簡介 1. Curator主要從以下幾個方面降低了zk使用的複雜性 重試機制:提供可插拔的重試機制, 它將給捕獲所有可恢復的異常配置一個重試策略,並且內部也提供了幾種標準的重試策略(比如指數補償) 連線狀態監控: Curator初始化

基於Curator操作ZooKeeper(三)-Curator整合Spring

Java原生API操作ZooKeeper可參看: Java原生API操作Zookeeper(一) Java原生API操作Zookeeper(二) 相關內容: 基於Curator操作ZooKeeper(一)-基本操作 基於Curator操作ZooKeeper(二)-Watche

基於Curator操作ZooKeeper(二)-Watcher操作-補充TreeCache

轉自:https://blog.csdn.net/Leafage_M/article/details/78735485#treecache Java原生API操作ZooKeeper可參看: Java原生API操作Zookeeper(一) Java原生API操作Zookeeper(二)

基於Curator操作ZooKeeper(二)-Watcher操作

Java原生API操作ZooKeeper可參看: Java原生API操作Zookeeper(一) Java原生API操作Zookeeper(二) 相關內容: 基於Curator操作ZooKeeper(一)-基本操作 基於Curator操作ZooKeeper(二)-Watche

基於Curator操作ZooKeeper(一)-基本操作

Java原生API操作ZooKeeper可參看: Java原生API操作Zookeeper(一) Java原生API操作Zookeeper(二) 相關內容: 基於Curator操作ZooKeeper(二)-Watcher操作 基於Curator操作ZooKeeper(二)-W

java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy解決方法

今天整合es-job到公司的框架時,啟動時出現上述錯誤 java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy at storm.kafka.KafkaSpout.open(KafkaSpout.java:68) at backtype.

第7章 Apache Curator客戶端的使用

Apache Curator客戶端的使用 7-1 curator簡介與客戶端之間的異同點 7-2 搭建maven工程,建立curator與zkserver的連線 7-3 zk名稱空間以及建立節點 7-9 zk-watcher例項 統一更新N臺節點的配置

Apache Curator簡單介紹

提供了一個抽象級別更高的API,來操作Zookeeper,類似Guava提供的很多工具,讓Java書寫起來更加方便。至於有沒有用,那就要看每個人自己的理解了。 1、依賴 <dependency> <groupId>org.a

Apache Solr with Zookeeper Ensemble

Let us now see how we can actually practically implement an Apache Solr cloud using external Zookeeper ensemble.Let us assume we have 3 separate nodes as t

Curator 操作 zookeeper 全面講解

zookeeper 的安裝與叢集的搭建 請參考我的另一片文章 https://blog.csdn.net/weixin_40461281/article/details/85336396 首先 建立一個maven專案 (不細講了,不會的自行百度) 匯入curator jar包