1. 程式人生 > >ZooKeeper搭建系列集 (這套很全,也很詳細)

ZooKeeper搭建系列集 (這套很全,也很詳細)

本篇文章結構:

總共包括10個系列

******************

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ZooKeeper 是一個為分散式應用所設計的分佈的、開源的協調服務。分散式的應用可以建立在同步、配置管理、分組和命名等服務的更高級別的實現的基礎之上。

 ZooKeeper 意欲設計一個易於程式設計的環境,它的檔案系統使用我們所熟悉的目錄樹結構。 ZooKeeper 使用 Java 所編寫,但是支援 Java  C 兩種程式語言。

    眾所周知,協調服務非常容易出錯,但是卻很難恢復正常,例如,協調服務很容易處於競態以至於出現死鎖。我們設計 ZooKeeper 的目的是為了減輕分散式應用程式所承擔的協調任務。

ZooKeeper資料模型和層次名稱空間

提供的名稱空間與標準的檔案系統非常相似。一個名稱是由通過斜線分隔開的路徑名序列所組成的。ZooKeeper中的每一個節點是都通過路徑來識別。 

下圖是Zookeeper中節點的資料模型,這種樹形結構的名稱空間操作方便且易於理解。

 

圖:ZooKeeper層次名稱空間

ZooKeeper中節點和臨時節點

ZooKeeper的節點是通過像樹一樣的結構來進行維護的,並且每一個節點通過路徑來標示以及訪問。除此之外,每一個節點還擁有自身的一些資訊,包括:資料、資料長度、建立時間、修改時間等等。從這樣一類既含有資料,又作為路徑表標示的節點的特點中,可以看出,ZooKeeper的節點既可以被看做是一個檔案,又可以被看做是一個目錄,它同時具有二者的特點。為了便於表達,今後我們將使用Znode來表示所討論的ZooKeeper節點。

具體地說,Znode維護著資料、ACL(access control list,訪問控制列表)、時間戳等交換版本號等資料結構,它通過對這些資料的管理來讓快取生效並且令協調更新。每當Znode中的資料更新後它所維護的版本號將增加,這非常類似於資料庫中計數器時間戳的操作方式。

另外Znode還具有原子性操作的特點:名稱空間中,每一個Znode的資料將被原子地讀寫。讀操作將讀取與Znode相關的所有資料,寫操作將替換掉所有的資料。除此之外,每一個節點都有一個訪問控制列表,這個訪問控制列表規定了使用者操作的許可權。

ZooKeeper中同樣存在臨時節點。這些節點與session同時存在,當session生命週期結束,這些臨時節點也將被刪除。臨時節點在某些場合也發揮著非常重要的作用。

---------------------------


ZooKeeper的安裝模式分為三種,分別為:單機模式(stand-alone)、叢集模式和叢集偽分佈模式。ZooKeeper 單機模式的安裝相對比較簡單,如果第一次接觸ZooKeeper的話,建議安裝ZooKeeper單機模式或者叢集偽分佈模式。

1)單機模式

首先,從Apache官方網站下載一個ZooKeeper 的最近穩定版本。

http://hadoop.apache.org/zookeeper/releases.html

作為國內使用者來說,選擇最近的的原始檔伺服器所在地,能夠節省不少的時間。

http://labs.renren.com/apache-mirror//hadoop/zookeeper/

ZooKeeper 要求 JAVA 的環境才能執行,並且需要 JAVA6 以上的版本,可以從 SUN 官網上下載,並對JAVA 環境變數進行設定。除此之外,為了今後操作的方便,我們需要對 ZooKeeper 的環境變數進行配置,方法如下,在 /etc/profile 檔案中加入如下的內容:

#Set ZooKeeper Enviroment

export ZOOKEEPER_HOME=/root/hadoop-0.20.2/zookeeper-3.3.1

export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf

ZooKeeper 伺服器包含在單個 JAR 檔案中,安裝此服務需要使用者建立一個配置文件,並對其進行設定。我們在 ZooKeeper-*.*.* 目錄(我們以當前 ZooKeeper 的最新版 3.3.1 為例,故此下面的“ ZooKeeper-*.*.* ”都將寫為“ ZooKeeper-3.3.1” )的 conf 資料夾下建立一個 zoo.cfg 檔案,它包含如下的內容:

tickTime=2000

dataDir=/var/zookeeper

clientPort=2181

在這個檔案中,我們需要指定 dataDir 的值,它指向了一個目錄,這個目錄在開始的時候需要為空。下面是每個引數的含義:

tickTime :基本事件單元,以毫秒為單位。它用來指示心跳,最小的 session 過期時間為兩倍的 tickTime. 。

dataDir :儲存記憶體中資料庫快照的位置,如果不設定引數,更新事務日誌將被儲存到預設位置。

clientPort :監聽客戶端連線的埠

使用單機模式時使用者需要注意:這種配置方式下沒有 ZooKeeper 副本,所以如果 ZooKeeper 伺服器出現故障, ZooKeeper 服務將會停止。

以下程式碼清單 A 是我們的根據自身情況所設定的 zookeeper 配置文件: zoo.cfg

程式碼清單 A : zoo.cfg

# The number of milliseconds of each tick

tickTime=2000

# the directory where the snapshot is stored.

dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/snapshot/data

# the port at which the clients will connect

clientPort=2181

2)叢集模式

為了獲得可靠的 ZooKeeper 服務,使用者應該在一個叢集上部署 ZooKeeper 。只要叢集上大多數的ZooKeeper 服務啟動了,那麼總的 ZooKeeper 服務將是可用的。另外,最好使用奇數臺機器。 如果 zookeeper擁有 5 臺機器,那麼它就能處理 2 臺機器的故障了。

之後的操作和單機模式的安裝類似,我們同樣需要對 JAVA 環境進行設定,下載最新的 ZooKeeper 穩定版本並配置相應的環境變數。不同之處在於每臺機器上 conf/zoo.cfg 配置檔案的引數設定,參考下面的配置:

tickTime=2000

dataDir=/var/zookeeper/

clientPort=2181

initLimit=5

syncLimit=2

server.1=zoo1:2888:3888

server.2=zoo2:2888:3888

server.3=zoo3:2888:3888

“ server.id=host:port:port. ”指示了不同的 ZooKeeper 伺服器的自身標識,作為叢集的一部分的機器應該知道 ensemble 中的其它機器。使用者可以從“ server.id=host:port:port. ”中讀取相關的資訊。 在伺服器的 data( dataDir 引數所指定的目錄)目錄下建立一個檔名為 myid 的檔案,這個檔案中僅含有一行的內容,指定的是自身的 id 值。比如,伺服器“ 1 ”應該在 myid 檔案中寫入“ 1 ”。這個 id 值必須是 ensemble 中唯一的,且大小在 1 到 255 之間。這一行配置中,第一個埠( port )是從( follower )機器連線到主( leader )機器的埠,第二個埠是用來進行 leader 選舉的埠。在這個例子中,每臺機器使用三個埠,分別是: clientPort ,2181 ; port , 2888 ; port , 3888 。

我們在擁有三臺機器的 Hadoop 叢集上測試使用 ZooKeeper 服務,下面程式碼清單 B 是我們根據自身情況所設定的 ZooKeeper 配置文件:

程式碼清單 B : zoo.cfg

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/snapshot/d1

# the port at which the clients will connect

clientPort=2181

server.1=IP1:2887:3887

server.2=IP2:2888:3888

server.3=IP3:2889:3889

清單中的 IP 分別對應的配置分散式 ZooKeeper 的 IP 地址。當然,也可以通過機器名訪問 zookeeper ,但是需要在ubuntu 的 hosts 環境中進行設定。讀者可以查閱 Ubuntu 以及 Linux 的相關資料進行設定。

3)叢集偽分佈

簡單來說,叢集偽分佈模式就是在單機下模擬叢集的ZooKeeper服務。

那麼,如何對配置 ZooKeeper 的叢集偽分佈模式呢?其實很簡單,在 zookeeper 配置文件中, clientPort引數用來設定客戶端連線 zookeeper 的埠。 server.1=IP1:2887:3887 中, IP1 指示的是組成 ZooKeeper 服務的機器 IP 地址, 2887 為用來進行 leader 選舉的埠, 3887 為組成 ZooKeeper 服務的機器之間通訊的埠。叢集偽分佈模式我們使用每個配置文件模擬一臺機器,也就是說,需要在單臺機器上執行多個 zookeeper 例項。但是,我們必須要保證各個配置文件的 clientPort 不能衝突。

下面是我們所配置的叢集偽分佈模式,通過 zoo1.cfg , zoo2.cfg , zoo3.cfg 模擬了三臺機器的 ZooKeeper叢集。詳見程式碼清單 C :

程式碼清單C : zoo1.cfg :

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_1

# the port at which the clients will connect

clientPort=2181

server.1=localhost:2887:3887

server.2=localhost:2888:3888

server.3=localhost:2889:3889

zoo2.cfg :

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_2

# the port at which the clients will connect

clientPort=2182

#the location of the log file

dataLogDir=/root/hadoop-0.20.2/zookeeper-3.3.1/logs

server.1=localhost:2887:3887 

server.2=localhost:2888:3888

server.3=localhost:2889:3889

zoo3.cfg :

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_2

# the port at which the clients will connect

clientPort=2183

#the location of the log file

dataLogDir=/root/hadoop-0.20.2/zookeeper-3.3.1/logs

server.1=localhost:2887:3887 

server.2=localhost:2888:3888

server.3=localhost:2889:3889

從上述三個程式碼清單中可以看到,除了 clientPort 不同之外, dataDir 也不同。另外,不要忘記在 dataDir 所對應的目錄中建立 myid 檔案來指定對應的 zookeeper 伺服器例項。

這裡ZooKeeper的安裝已經說完了,下一節我們來談一談對ZooKeeper的引數配置 的理解。


-------------------------------------------------

ZooKeeper 的功能特性通過 ZooKeeper 配置檔案來進行控制管理( zoo.cfg 配置檔案)。 ZooKeeper 這樣的設計其實是有它自身的原因的。通過前面對 ZooKeeper 的配置可以看出,對 ZooKeeper 叢集進行配置的時候,它的配置文件是完全相同的(對於叢集偽分佈模式來說,只有很少的部分是不同的)。這樣的配置方使得在部署 ZooKeeper 服務的時候非常地方便。另外,如果伺服器使用不同的配置檔案,必須要確保不同配置檔案中的伺服器列表相匹配。

在設定 ZooKeeper 配置文件的時候,某些引數是可選的,但是某些引數是必須的。這些必須的引數就構成了ZooKeeper 配置文件的最低配置要求。

下面是在最低配置要求中必須配置的引數:

1 )最低配置

clientPort

監聽客戶端連線的埠;

dataDir

儲存記憶體中資料庫快照的位置;

注意 應該謹慎地選擇日誌存放的位置,使用專用的日誌儲存裝置能夠大大地提高系統的效能,如果將日誌儲存在比較繁忙的儲存裝置上,那麼將會在很大程度上影響系統的效能。

  tickTime

基本事件單元,以毫秒為單位。它用來控制心跳和超時,預設情況下最小的會話超時時間為兩倍的 tickTime。

2 )高階配置

下面是高階配置要求中可選的配置引數,使用者可以使用下面的引數來更好地規定 ZooKeeper 的行為:

dataLogDir

這個操作將管理機器把事務日誌寫入到“ dataLogDir ”所指定的目錄,而不是“ dataDir ”所指定的目錄。這將允許使用一個專用的日誌裝置並且幫助我們避免日誌和快照之間的競爭。配置如下:

#the location of the log file

dataLogDir=/root/hadoop-0.20.2/zookeeper-3.3.1/log/data_log

這個操作將限制連線到 ZooKeeper 的客戶端的數量,限制併發連線的數量,它通過 IP 來區分不同的客戶端。此配置選項可以用來阻止某些類別的 Dos 攻擊。將它設定為 0 或者忽略而不進行設定將會取消對併發連線的限制。

例如,此時我們將 maxClientCnxns 的值設定為 1 ,如下所示:

#set maxClientCnxns

maxClientCnxns=1

啟動 ZooKeeper 之後,首先用一個客戶端連線到 ZooKeeper 伺服器之上。然後,當第二個客戶端嘗試對ZooKeeper 進行連線,或者某些隱式的對客戶端的連線操作,將會觸發 ZooKeeper 的上述配置。系統會提示相關資訊,如下圖 1 所示:


圖 1 : ZooKeeper maxClientCnxns 異常

minSessionTimeout 和 maxSessionTimeout

最小的會話超時時間以及最大的會話超時時間。其中,最小的會話超時時間預設情況下為 2 倍的 tickTme 時間,最大的會話超時時間預設情況下為 20 倍的會話超時時間。在啟動時,系統會顯示相應資訊,見下圖 2 所示,預設會話超時時間:

 

圖2 :預設會話超時時間

從上圖中可以看書, minSessionTimeout 以及 maxSessionTimeout 的值均為 -1 ,現在我們來設定系統的最小會話超時時間以及最大會話超時時間,如下所示:

#set minSessionTimeout

minSessionTimeout=1000

#set maxSessionTImeout

maxSessionTimeout=10000

在配置 minSessionTmeout 以及 maxSessionTimeout 的值的時候需要注意,如果將此值設定的太小的話,那麼會話很可能剛剛建立便由於超時而不得不退出。一般情況下,不能將此值設定的比 tickTime 的值還小。

3 )叢集配置

initLimit

此配置表示,允許 follower (相對於 leader 而言的“客戶端”)連線並同步到 leader 的初始化連線時間,它以 tickTime 的倍數來表示。當超過設定倍數的 tickTime 時間,則連線失敗。

syncLimit

此配置表示, leader 與 follower 之間傳送訊息,請求和應答時間長度。如果 follower 在設定的時間內不能與leader 進行通訊,那麼此 follower 將被丟棄。

---------------------

1)單機模式

使用者可以通過下面的命令來啟動 ZooKeeper 服務:

zkServer.sh start

這個命令預設情況下執行 ZooKeeper  conf 資料夾下的 zoo.cfg 配置檔案。當執行成功使用者會看到類似如下的提示介面:

[email protected]:~# zkServer.sh start

JMX enabled by default

Using config: /root/hadoop-0.20.2/zookeeper-3.3.1/bin/../conf/zoo.cfg

Starting zookeeper ...

STARTED

... ...

2011-01-19 10:04:42,300 - WARN[main:[email protected]] - Either no config or no quorum defined in config, runningin standalone mode

... ...

2011-01-19 10:04:42,419 - INFO[main:[email protected]] - tickTime set to 2000

2011-01-19 10:04:42,419 - INFO[main:[email protected]] - minSessionTimeout set to -1

2011-01-19 10:04:42,419 - INFO[main:[email protected]] - maxSessionTimeout set to -1

2011-01-19 10:04:42,560 - INFO[main:[email protected]] - binding to port 0.0.0.0/0.0.0.0:2181

2011-01-19 10:04:42,806 - INFO[main:[email protected]] - Reading snapshot /root/hadoop-0.20.2/zookeeper-3.3.1/data/version-2/snapshot.200000036

2011-01-19 10:04:42,927 - INFO[main:[email protected]] - Reading snapshot /root/hadoop-0.20.2/zookeeper-3.3.1/data/version-2/snapshot.200000036

2011-01-19 10:04:42,950 - INFO[main:[email protected]] - Snapshotting: 400000058

從上面可以看出,執行成功後,系統會列出 ZooKeeper 執行的相關環境配置資訊。

2)叢集模式

叢集模式下需要使用者在每臺 ZooKeeper 機器上執行第一部分的命令,這裡不再贅述。

3)叢集偽分佈模式

在叢集偽分佈模式下,我們只有一臺機器,但是要執行三個 ZooKeeper 服務例項。此時,如果再使用上述命令式肯定行不通的。這裡,我們通過下面三條命能夠令來執行 ZooKeeper系列之三:ZooKeeper的安裝  我們配置的 ZooKeeper 服務。如下所示:

zkServer.sh start zoo1.cfg

zkServer.sh start zoo2.cfg

zkServer.sh start zoo3.cfg

在執行完第一條命令之後,讀者將會發現一些系統錯誤提示,如下圖 1 所示:


 1 :叢集偽分佈異常提示

產生如上圖所示的異常資訊是由於 ZooKeeper 服務的每個例項都擁有全域性的配置資訊,它們在啟動的時候需要隨時地進行 Leader 選舉操作(此部分內容下面將會詳細講述)。此時第一個啟動的 Zookeeper 需要和另外兩個 ZooKeeper 例項進行通訊。但是,另外兩個 ZooKeeper 例項還沒有啟動起來,因此將會產生上述所示的異常資訊。

我們直接將其忽略即可,因為當把圖示中的“ 2 號”和“ 3 號” ZooKeeper 例項啟動起來之後,相應的異常資訊就回自然而然地消失。

----------------------------

ZooKeeper 支援某些特定的四字命令字母與其的互動。它們大多是查詢命令,用來獲取 ZooKeeper 服務的當前狀態及相關資訊。使用者在客戶端可以通過 telnet 或 nc 向 ZooKeeper 提交相應的命令。 ZooKeeper 常用四字命令見下表 1 所示:

表 1 : ZooKeeper 四字命令

ZooKeeper 四字命令

功能描述

conf

輸出相關服務配置的詳細資訊。

cons

列出所有連線到伺服器的客戶端的完全的連線 / 會話的詳細資訊。包括“接受 / 傳送”的包數量、會話 id 、操作延遲、最後的操作執行等等資訊。

dump

列出未經處理的會話和臨時節點。

envi

輸出關於服務環境的詳細資訊(區別於 conf 命令)。

reqs

列出未經處理的請求

ruok

測試服務是否處於正確狀態。如果確實如此,那麼服務返回“imok ”,否則不做任何相應。

stat

輸出關於效能和連線的客戶端的列表。

wchs

列出伺服器 watch 的詳細資訊。

wchc

通過 session 列出伺服器 watch 的詳細資訊,它的輸出是一個與watch 相關的會話的列表。

wchp

通過路徑列出伺服器 watch 的詳細資訊。它輸出一個與 session相關的路徑。

下圖 1 是 ZooKeeper 四字命令的簡單用例:


圖 1 : ZooKeeper 四字命令用例

當啟動 ZooKeeper 服務成功之後,輸入下述命令,連線到 ZooKeeper 服務:

zkCli.sh –server 10.77.20.23:2181

連線成功後,系統會輸出 ZooKeeper 的相關環境以及配置資訊,並在螢幕輸出“ Welcome to ZooKeeper”等資訊。

輸入 help 之後,螢幕會輸出可用的 ZooKeeper 命令,如下圖 1 所示:

 

圖 1 : ZooKeeper 命令



1 )使用 ls 命令來檢視當前 ZooKeeper 中所包含的內容:

[zk: 10.77.20.23:2181(CONNECTED) 1] ls /

[zookeeper]

2 )建立一個新的 znode ,使用 create /zk myData 。這個命令建立了一個新的 znode 節點“ zk ”以及與它關聯的字串:

[zk: 10.77.20.23:2181(CONNECTED) 2] create /zk myData

Created /zk

3 )再次使用 ls 命令來檢視現在 zookeeper 中所包含的內容:

[zk: 10.77.20.23:2181(CONNECTED) 3] ls /

[zk, zookeeper]

此時看到, zk 節點已經被建立。

4 )下面我們執行 get 命令來確認第二步中所建立的 znode 是否包含我們所建立的字串:

[zk: 10.77.20.23:2181(CONNECTED) 4] get /zk

myData

Zxid = 0x40000000c

time = Tue Jan 18 18:48:39 CST 2011

Zxid = 0x40000000c

mtime = Tue Jan 18 18:48:39 CST 2011

pZxid = 0x40000000c

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 6

numChildren = 0

5 )下面我們通過 set 命令來對 zk 所關聯的字串進行設定:

[zk: 10.77.20.23:2181(CONNECTED) 5] set /zk shenlan211314

cZxid = 0x40000000c

ctime = Tue Jan 18 18:48:39 CST 2011

mZxid = 0x40000000d

mtime = Tue Jan 18 18:52:11 CST 2011

pZxid = 0x40000000c

cversion = 0

dataVersion = 1

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 13

numChildren = 0

6 )下面我們將剛才建立的 znode 刪除:

[zk: 10.77.20.23:2181(CONNECTED) 6] delete /zk

7 )最後再次使用 ls 命令檢視 ZooKeeper 所包含的內容:

[zk: 10.77.20.23:2181(CONNECTED) 7] ls /

[zookeeper]

經過驗證, zk 節點已經被刪除。

----------------------------------------------

1)ZooKeeper API 簡介

ZooKeeper API 共包含 5 個包,分別為: org.apache.zookeeper , org.apache.zookeeper.data ,org.apache.zookeeper.server , org.apache.zookeeper.server.quorum 和org.apache.zookeeper.server.upgrade 。其中 org.apache.zookeeper 包含 ZooKeeper 類,它我們程式設計時最常用的類檔案。

這個類是 ZooKeeper 客戶端庫的主要類檔案。如果要使用 ZooKeeper 服務,應用程式首先必須建立一個Zookeeper 例項,這時就需要使用此類。一旦客戶端和 ZooKeeper 服務建立起連線, ZooKeeper 系統將會分配給此連接回話一個 ID 值,並且客戶端將會週期地向伺服器傳送心跳來維持會話的連線。只要連線有效,客戶端就可以呼叫 ZooKeeper API 來做相應的處理。

它提供了表 1 所示幾類主要方法 , :

  表 1 : ZooKeeper API 描述

功能

描述

create

在本地目錄樹中建立一個節點

delete

刪除一個節點

exists

測試本地是否存在目標節點

get/set data

從目標節點上讀取 / 寫資料

get/set ACL

獲取 / 設定目標節點訪問控制列表資訊

get children

檢索一個子節點上的列表

sync

等待要被傳送的資料

2)ZooKeeper API 的使用

這裡,筆者通過一個例子來簡單介紹,如何使用 ZooKeeper API 編寫自己的應用程式,見程式碼清單 1 :

程式碼清單 1 : ZooKeeper API 的使用

2.

3. import org.apache.zookeeper.CreateMode;

4. import org.apache.zookeeper.KeeperException;

5. import org.apache.zookeeper.Watcher;

6. import org.apache.zookeeper.ZooDefs.Ids;

7. import org.apache.zookeeper.ZooKeeper;

8.

9. public class demo {

10.     // 會話超時時間,設定為與系統預設時間一致

11.     private static final int SESSION_TIMEOUT=30000;

12.    

13.     // 建立 ZooKeeper 例項

14.     ZooKeeper zk;

15.    

16.     // 建立 Watcher 例項

17.     Watcher wh=new Watcher(){

18.            public void process(org.apache.zookeeper.WatchedEvent event)

19.            {

20.                    System.out.println(event.toString());

21.            }

22.     };

23.    

24.     // 初始化 ZooKeeper 例項

25.     private void createZKInstance() throws IOException

26.     {             

27.            zk=new ZooKeeper("localhost:2181",demo.SESSION_TIMEOUT,this.wh);

28.           

29.     }

30.    

31.     private void ZKOperations() throws IOException,InterruptedException,KeeperException

32.     {

33.            System.out.println("/n1. 建立 ZooKeeper 節點 (znode : zoo2, 資料: myData2 ,許可權:OPEN_ACL_UNSAFE ,節點型別: Persistent");

34.            zk.create("/zoo2","myData2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

35.           

36.            System.out.println("/n2. 檢視是否建立成功: ");

37.            System.out.println(new String(zk.getData("/zoo2",false,null)));

38.                           

39.            System.out.println("/n3. 修改節點資料 ");

40.            zk.setData("/zoo2", "shenlan211314".getBytes(), -1);

41.           

42.            System.out.println("/n4. 檢視是否修改成功: ");

43.            System.out.println(new String(zk.getData("/zoo2", false, null)));

44.                           

45.            System.out.println("/n5. 刪除節點 ");

46.            zk.delete("/zoo2", -1);

47.           

48.            System.out.println("/n6. 檢視節點是否被刪除: ");

49.            System.out.println(" 節點狀態: ["+zk.exists("/zoo2", false)+"]");

50.     }

51.    

52.     private void ZKClose() throws  InterruptedException

53.     {

54.            zk.close();

55.     }

56.    

57.     public static void main(String[] args) throws IOException,InterruptedException,KeeperException {

58.            demo dm=new demo();

59.            dm.createZKInstance( );

60.            dm.ZKOperations();

61.            dm.ZKClose();

62.     }

63.}

此類包含兩個主要的 ZooKeeper 函式,分別為 createZKInstance ()和 ZKOperations ()。其中createZKInstance ()函式負責對 ZooKeeper 例項 zk 進行初始化。 ZooKeeper 類有兩個建構函式,我們這裡使用“ ZooKeeper ( String connectString, , int sessionTimeout, , Watcher watcher )”對其進行初始化。因此,我們需要提供初始化所需的,連線字串資訊,會話超時時間,以及一個 watcher 例項。 17 行到 23 行程式碼,是程式所構造的一個 watcher 例項,它能夠輸出所發生的事件。

ZKOperations ()函式是我們所定義的對節點的一系列操作。它包括:建立 ZooKeeper 節點( 33 行到 34行程式碼)、檢視節點( 36 行到 37 行程式碼)、修改節點資料( 39 行到 40 行程式碼)、檢視修改後節點資料( 42行到 43 行程式碼)、刪除節點( 45 行到 46 行程式碼)、檢視節點是否存在( 48 行到 49 行程式碼)。另外,需要注意的是:在建立節點的時候,需要提供節點的名稱、資料、許可權以及節點型別。此外,使用 exists 函式時,如果節點不存在將返回一個 null 值。關於 ZooKeeper API 的更多詳細資訊,讀者可以檢視 ZooKeeper 的 API 文件,如下所示:


--------------------------------------------------

     1)一致性保證

Zookeeper 是一種高效能、可擴充套件的服務。 Zookeeper 的讀寫速度非常快,並且讀的速度要比寫的速度更快。另外,在進行讀操作的時候, ZooKeeper 依然能夠為舊的資料提供服務。這些都是由於 ZooKeepe 所提供的一致性保證,它具有如下特點:

順序一致性

客戶端的更新順序與它們被髮送的順序相一致。

原子性

更新操作要麼成功要麼失敗,沒有第三種結果。

單系統映象

無論客戶端連線到哪一個伺服器,客戶端將看到相同的 ZooKeeper 檢視。

可靠性

一旦一個更新操作被應用,那麼在客戶端再次更新它之前,它的值將不會改變。。這個保證將會產生下面兩種結果:

1 .如果客戶端成功地獲得了正確的返回程式碼,那麼說明更新已經成果。如果不能夠獲得返回程式碼(由於通訊錯誤、超時等等),那麼客戶端將不知道更新操作是否生效。

2 .當從故障恢復的時候,任何客戶端能夠看到的執行成功的更新操作將不會被回滾。

實時性

在特定的一段時間內,客戶端看到的系統需要被保證是實時的(在十幾秒的時間裡)。在此時間段內,任何系統的改變將被客戶端看到,或者被客戶端偵測到。

給予這些一致性保證, ZooKeeper 更高階功能的設計與實現將會變得非常容易,例如: leader 選舉、佇列以及可撤銷鎖等機制的實現。

2)Leader選舉

ZooKeeper 需要在所有的服務(可以理解為伺服器)中選舉出一個 Leader ,然後讓這個 Leader 來負責管理叢集。此時,叢集中的其它伺服器則成為此 Leader  Follower 。並且,當 Leader 故障的時候,需要ZooKeeper 能夠快速地在 Follower 中選舉出下一個 Leader 。這就是 ZooKeeper  Leader 機制,下面我們將簡單介紹在 ZooKeeper 中, Leader 選舉( Leader Election )是如何實現的。

此操作實現的核心思想是:首先建立一個 EPHEMERAL 目錄節點,例如“ /election ”。然後。每一個ZooKeeper 伺服器在此目錄下建立一個 型別的節點,例如“ /election/n_ ”。在SEQUENCE 標誌下, ZooKeeper 將自動地為每一個 ZooKeeper 伺服器分配一個比前一個分配的序號要大的序號。此時建立節點的 ZooKeeper 伺服器中擁有最小序號編號的伺服器將成為 Leader 

在實際的操作中,還需要保障:當 Leader 伺服器發生故障的時候,系統能夠快速地選出下一個 ZooKeeper伺服器作為 Leader 。一個簡單的解決方案是,讓所有的 follower 監視 leader 所對應的節點。當 Leader 發生故障時, Leader 所對應的臨時節點將會自動地被刪除,此操作將會觸發所有監視 Leader 的伺服器的 watch 。這樣這些伺服器將會收到 Leader 故障的訊息,並進而進行下一次的 Leader 選舉操作。但是,這種操作將會導致“從眾效應”的發生,尤其當叢集中伺服器眾多並且頻寬延遲比較大的時候,此種情況更為明顯。

 Zookeeper 中,為了避免從眾效應的發生,它是這樣來實現的:每一個 follower  follower 叢集中對應的比自己節點序號小一號的節點(也就是所有序號比自己小的節點中的序號最大的節點)設定一個 watch 。只有當follower 所設定的 watch 被觸發的時候,它才進行 Leader 選舉操作,一般情況下它將成為叢集中的下一個Leader 。很明顯,此 Leader 選舉操作的速度是很快的。因為,每一次 Leader 選舉幾乎只涉及單個 follower 的操作。

相關推薦

ZooKeeper搭建系列 詳細

本篇文章結構: 總共包括10個系列 ****************** --------------------------------------------------------------------------------

機器學習入門系列關鍵詞:邏輯迴歸正則化

一、邏輯迴歸 1.邏輯迴歸 什麼是邏輯迴歸問題,通俗地講就是監督下的分類問題。通過前面的學習,我們已經掌握如何解決線性(非線性)迴歸的問題。那面對分類問題我們是否也可以用線性迴歸呢?簡單起見,我們先討論二元分類,首先讓我們來看一個例子,腫瘤的大小與是否是惡性的關係,其中紅色的×表示腫瘤大小,對應的y軸

vimrc檔案配置的全文收錄史上最附帶中文解釋

一、vi與vim的不同vi類似於windows的記事本,比較適合編輯普通文字,但是用於編寫指令碼程式碼就不太合適了,缺少高亮顯示程式碼、自動縮排等重要功能;而vim類似於windows下的高階編輯器,為了提高開發效率,需要使用vim而不是vi。因此,首先做如下調整,以便只使用vim作為開發指令碼的功能工具:

vimrc文件配置的全文收錄史上最附帶中文解釋

更新 普通 鈴聲 echo rec expand 開發 空格 缺少 一、vi與vim的不同vi類似於windows的記事本,比較適合編輯普通文本,但是用於編寫腳本代碼就不太合適了,缺少高亮顯示代碼、自動縮進等重要功能;而vim類似於windows下的高級編輯器,為了提高開發

linux環境使用SolrCloud和Zookeeper搭建分散式群系統

使用虛擬機器(本例VMware)安裝CentOS6後修改網路配置 編輯--->虛擬網路編輯器,選中型別為NAT模式下的虛擬網路,將子網ip改為形如192.168.30.0 DHCP設定中開始ip地址和結束ip地址可以分別設定為192.168.30.100和192.168.

linux 忘記root裏以centos 6.5為例密碼的解決辦法

理發 我們 bsp ext sso 用戶模式 正常 修改 啟動 在使用linux的過程中有時候會忘記root用戶的密碼(尤其是進行交接而文檔內容不全的時候),這個時候我們就可以進入單用戶模式來重置root用戶密碼。下面來講解重置root密碼的方式,也可以說是破解root密碼

洛谷P3402 【模板】可持久化並查可持久化線段樹線段樹

std 樹節點 https case 深度 build eof spa 復雜度 orz TPLY 巨佬,題解講的挺好的。 這裏重點梳理一下思路,做一個小小的補充吧。 寫可持久化線段樹,葉子節點維護每個位置的fa,利用每次只更新一個節點的特性,每次插入\(logN\)個節點,

搭建LNMP環境基於最小化安裝CentOS 6.5

解壓 hive ima zlib RM opp 客戶 killall 宋體 本文檔主要說明在單臺服務器上手動安裝LNMP環境的操作步驟,本文檔使用的系統版本可能與您的實際使用版本不同,您可以根據實際情況選擇相應版本。一、本文檔LNMP環境版本說明:OS:最小化安裝CentO

Apache搭建虛擬主機基於IP、端口、域名實現內附源碼包

多臺 主機 enable tps alt 防火墻 -- gcc 一定的 簡介 虛擬主機是指在網絡服務器上分出一定的磁盤空間,管理員可以利用此部分空間,放置站點及應用組件,提供必要的數據存放和傳輸功能。虛擬主機,就是把一臺運行在互聯網上的物理服務器劃分成多個“虛擬”服務器。

vue搭建後臺管理頁面點擊左側導航切換右側內容

htm right 後臺 opd imp page con com ng- home.vue頁面 <template> <div style="background-color: #EBEBEB;min-height:900px">

2018-9-9-03關於ajax好像是第三次總結了

什麼是ajax(前後端分離和不分離的優勢弊端)   ajax基礎知識 什麼是ajax? async javascript and xml ,非同步的js和xml xml:可擴充套件的標

Opencv中並行影象處理環境的搭建和配置opencv1.0 CUDA3.0vs2010

這一章我們將介紹如何從頭搭建並配置一個用於影象處理的VC++平行計算環境。所用作業系統為Windows 7的32位系統,程式設計環境為VS2005,CUDA版本為3.0,OpenCV版本為1.0。內容包括建立一個基於VS2005的簡單的對話方塊工程,安裝和使用OpenCV,以及安裝配置CUDA環境。

浪潮培訓7Socket接字非同步

一、輸入輸出流 1、用BufferedReader的readLine的時候,以\n\r結束, 2、並且資訊傳送端必須呼叫flush推送資料 3、並且資訊的最後要用識別符號結束,比如,@:end 4、java中套接字是new 完就連結成功了 5、用client.getStream獲得流,用流

考場沙雕錯誤錦大賽前必看救命提分良藥

記住,無論什麼測試,一定要先打三題暴力(至少不會被屠得太慘) 2018.10.4 1.記得算記憶體。(OI一年一場空,沒算記憶體見祖宗) 2018.10.6 1.在二分許多個字串時(二分長度),要以長度的最小值作二分右端點 (今日考場本該必A的題,因為我將右端點改成長度最大值

8、CentOS7 安裝Docker之擴充套件將docker程序移動到一個不同的分割槽注:操作雖然簡單實用。

將docker程序移動到一個不同的分割槽 Docker把與你的容器和映象相關的資料儲存到一個目錄下。由於可能會儲存潛在的大量不同的映象,這個目錄會很快變得很大! 如果你的主機有不同的分割槽,你可能會更快遇到空間受限的問題。在這種情況下,你可能需要把Docker的資料目錄移動到其它分割槽。 問

51 Nod 1035 最長的迴圈節 此題還不是日後再看

轉自: 51nod 1035 最長的迴圈節(無限小數的迴圈節) 2016年09月07日 09:53:13 單木 閱讀數:867更多 個人分類: 數學51nod 版權宣告:本文為博主原創文章,歡迎轉載。 https://blog.csdn.net/define_da

redis搭建公網叢集6個幾點三主三從

## 注意以下是公網搭建,請全部讀完了在搭建,你會少走很多彎路 1,首先安裝redis單機版,網上教程很多就不介紹了。 2,redis叢集是用的ruby指令碼,所以要想執行該指令碼,需要ruby環境.。對應redis的原始碼src目錄下的redis-trib.rb,red

Commandos 空間上的dp目前少接觸。藉著這個機會學習一下和平面上的dp是一樣的。

A commando is a soldier of an elite light infantry often specializing in amphibious landings, abseiling or parachuting. This time our Comm

掌握框架思維你的智慧合約開發將進入開掛狀態!

原創: 賣課的小姐姐 各位同學好,我是一塊鏈習賣課的小姐姐。今天,我們想要鄭重且欣喜的為大家介紹一堂剛上線不久的重量級課程: 「以太坊智慧合約開發(進階)課」 現在這門課程已經歷“內測”+“第一期”的考驗,馬上就要開啟第二期了,在開啟之前,我們想要為它再次發聲。

演算法工程師過去一年:理想豐滿現實骨感

本文轉自100offer微信公眾號【導讀】人工智慧火熱的 2017 年,演算法相關崗位無論在薪資