Apache > ZooKeeper
 

ZooKeeper 入門指南

入門:使用 ZooKeeper 協調分散式應用程式

本文件包含快速入門 ZooKeeper 的資訊。它主要針對希望試用的開發人員,並包含單一 ZooKeeper 伺服器的簡單安裝說明、一些用於驗證其執行中的命令,以及一個簡單的程式設計範例。最後,為方便起見,有一些關於更複雜安裝的章節,例如執行複製部署和最佳化交易記錄。但是,有關商業部署的完整說明,請參閱 ZooKeeper 管理員指南

先決條件

請參閱管理員指南中的 系統需求

下載

若要取得 ZooKeeper 發行版,請從 Apache 下載鏡像下載最近的 穩定 版本。

獨立作業

設定獨立模式的 ZooKeeper 伺服器很簡單。伺服器包含在單一 JAR 檔案中,因此安裝包括建立設定檔。

下載穩定的 ZooKeeper 版本後,解壓縮並 cd 到根目錄

若要啟動 ZooKeeper,您需要一個設定檔。以下是一個範例,在 conf/zoo.cfg 中建立它

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181

此檔案可以稱為任何名稱,但為了討論起見,請稱它為 conf/zoo.cfg。變更 dataDir 的值以指定現有的 (一開始為空的) 目錄。以下是每個欄位的意義

現在您已建立設定檔,可以開始 ZooKeeper

bin/zkServer.sh start

ZooKeeper 使用 logback 記錄訊息,詳細資訊請參閱程式設計指南的 記錄 區段。您會看到記錄訊息傳送到主控台 (預設) 和/或記錄檔,具體取決於 logback 設定。

這裡概述的步驟會在獨立模式下執行 ZooKeeper。沒有複寫,因此如果 ZooKeeper 程序失敗,服務將會中斷。這對於大多數開發情況來說沒問題,但若要在複寫模式下執行 ZooKeeper,請參閱 執行複寫 ZooKeeper

管理 ZooKeeper 儲存

對於長時間執行的生產系統,ZooKeeper 儲存必須在外部管理 (dataDir 和記錄檔)。有關更多詳細資訊,請參閱 維護 區段。

連線到 ZooKeeper

$ bin/zkCli.sh -server 127.0.0.1:2181

這讓您可以執行簡單的文件類似操作。

連線後,您應該會看到類似以下的內容

Connecting to localhost:2181
...
Welcome to ZooKeeper!
JLine support is enabled
[zkshell: 0]

在 shell 中,輸入 help 以取得可從用戶端執行的命令清單,如下所示

[zkshell: 0] help
ZooKeeper -server host:port cmd args
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
printwatches on|off
quit
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path

在此,您可以嘗試一些簡單的命令,以了解這個簡單的命令列介面。首先,發出 list 命令,如下所示 ls,產生

[zkshell: 8] ls /
[zookeeper]

接著,執行 create /zk_test my_data 建立新的 znode。這會建立新的 znode,並將字串 "my_data" 與節點關聯。您應該會看到

[zkshell: 9] create /zk_test my_data
Created /zk_test

發出另一個 ls / 命令,以查看目錄的樣貌

[zkshell: 11] ls /
[zookeeper, zk_test]

請注意,zk_test 目錄現在已建立。

接著,執行 get 命令,以驗證資料是否與 znode 關聯,如下所示

[zkshell: 12] get /zk_test
my_data
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 5
mtime = Fri Jun 05 13:57:06 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0
dataLength = 7
numChildren = 0

我們可以執行 set 命令,以變更與 zk_test 關聯的資料,如下所示

[zkshell: 14] set /zk_test junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
[zkshell: 15] get /zk_test
junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0

(請注意,我們在設定資料後執行 get,資料確實已變更。

最後,讓我們執行 delete 刪除節點

[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]

目前就到此為止。若要探索更多內容,請參閱 Zookeeper CLI

編寫 ZooKeeper 程式

ZooKeeper 有 Java 繫結和 C 繫結。它們在功能上是等效的。C 繫結有兩種變體:單執行緒和多執行緒。它們之間的差異僅在於傳遞訊息迴圈的方式。有關更多資訊,請參閱 ZooKeeper 程式設計指南中的程式設計範例,取得使用不同 API 的範例程式碼。

執行複製 ZooKeeper

在獨立模式下執行 ZooKeeper 便於評估、某些開發和測試。但在生產環境中,您應在複製模式下執行 ZooKeeper。同一應用程式中的一組複製伺服器稱為法定人數,在複製模式中,法定人數中的所有伺服器都擁有相同組態檔的副本。

注意

對於複製模式,至少需要三台伺服器,強烈建議您使用奇數個伺服器。如果您只有兩台伺服器,那麼當其中一台發生故障時,就會出現沒有足夠機器來組成多數法定人數的情況。兩台伺服器本質上比單一伺服器不穩定,因為存在兩個單點故障。

複製模式所需的 conf/zoo.cfg 檔類似於獨立模式中使用的檔,但有一些差異。以下是範例

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888

新的項目 initLimit 是 ZooKeeper 用來限制法定人數中的 ZooKeeper 伺服器連線至領導者的時間長度的逾時。項目 syncLimit 限制伺服器與領導者之間的過期時間。

對於這兩個逾時,您使用 tickTime 指定時間單位。在此範例中,initLimit 的逾時為 5 個刻度,每個刻度 2000 毫秒,即 10 秒。

格式為 server.X 的項目會列出組成 ZooKeeper 服務的伺服器。當伺服器啟動時,它會透過在資料目錄中尋找檔案 myid 來知道自己是哪個伺服器。該檔案包含伺服器號碼(以 ASCII 碼表示)。

最後,請注意每個伺服器名稱後面的兩個埠號:「2888」和「3888」。對等方使用前一個埠號連線至其他對等方。此類連線是必要的,以便對等方可以進行通訊,例如就更新順序達成共識。更具體地說,ZooKeeper 伺服器使用此埠號將追隨者連線至領導者。當出現新的領導者時,追隨者會使用此埠號開啟與領導者的 TCP 連線。由於預設的領導者選舉也使用 TCP,因此我們目前需要另一個埠號進行領導者選舉。這是伺服器項目中的第二個埠號。

注意

如果您想在單一機器上測試多台伺服器,請將伺服器名稱指定為 localhost,並為每個伺服器.X 指定唯一的法定人數和領導者選舉埠號(即上述範例中的 2888:3888、2889:3889、2890:3890)。當然,也需要有獨立的 _dataDir_ 和不同的 _clientPort_(在上述的複製範例中,在單一 localhost 上執行時,您仍會有三個組態檔)。

請注意,在單一機器上設定多台伺服器不會產生任何備援。如果發生導致機器毀損的事件,所有 zookeeper 伺服器都將離線。完整的備援需要每台伺服器都有自己的機器。它必須是完全獨立的實體伺服器。同一實體主機上的多台虛擬機器仍容易受到該主機完全故障的影響。

如果您在 ZooKeeper 機器中有多個網路介面,您也可以指示 ZooKeeper 繫結到所有介面,並在發生網路故障時自動切換到正常的介面。有關詳細資訊,請參閱 組態參數

其他最佳化

還有其他幾個組態參數可以大幅提升效能