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 的值以指定現有的 (一開始為空的) 目錄。以下是每個欄位的意義
-
tickTime:ZooKeeper 使用的毫秒為基本時間單位。它用於執行心跳,且最小會話逾時時間將是 tickTime 的兩倍。
-
dataDir:儲存記憶體中資料庫快照的位置,除非另有指定,否則為資料庫更新的交易記錄。
-
clientPort:偵聽用戶端連線的埠
現在您已建立設定檔,可以開始 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 繫結到所有介面,並在發生網路故障時自動切換到正常的介面。有關詳細資訊,請參閱 組態參數。
其他最佳化
還有其他幾個組態參數可以大幅提升效能
- 若要針對更新取得低延遲,有專用的交易記錄目錄非常重要。預設情況下,交易記錄會放置在與資料快照和 myid 檔案相同的目錄中。dataLogDir 參數會指出要使用於交易記錄的不同目錄。