ZooKeeper 入門指南

ZooKeeper 入門指南

<h1 id="1">入門:使用ZooKeeper協調分佈式應用程序</h1>

本文檔包含了使您快速入門ZooKeeper的信息。 主要針對希望嘗試的開發人員,包含單個ZooKeeper服務器的簡單安裝說明,一些命令來驗證它正在運行,以及一個簡單的編程示例。 最後,爲了方便起見,有一些關於更復雜安裝的部分,例如運行復制部署,以及優化事務日誌。 但是,有關商業部署的完整說明,請參閱ZooKeeper管理員指南

<h1 id="2">先決條件</h1>

系統要求

支持的平臺

ZooKeeper由多個組件組成。 一些組件得到廣泛支持,其他組件僅在一組較小的平臺上受支持。

  • Client:是Java客戶端庫,由應用程序用來連接ZooKeeper集成。
  • Server:是在ZooKeeper集合節點上運行的Java服務器。
  • Native Client:是一個用C實現的客戶端,類似於Java客戶端,由應用程序用來連接到一個ZooKeeper集合。
  • Contrib:指的是多個可選的附加組件。

以下矩陣描述了在不同的操作系統平臺上運行每個組件的承諾級別。

操作系統 客戶端(Client) 服務器(Server) 本機客戶端(Native Client) 普通發佈版(Contrib)
GNU/Linux 開發和生產 開發和生產 開發和生產 開發和生產
Solaris 開發和生產 開發和生產 不支持 不支持
FreeBSD 開發和生產 開發和生產 不支持 不支持
Windows 開發和生產 開發和生產 不支持
Mac OS X 開發僅開發 只支持 不支持 不支持

對於矩陣中沒有明確提到的任何操作系統,組件可能會或可能不會工作。 ZooKeeper社區將修復爲其他平臺報告的明顯錯誤,但沒有完全支持。

所需的軟件

ZooKeeper以Java運行,版本爲1.7或更高版本(JDK 7或更高版本,FreeBSD支持需要openjdk7)。 它作爲一個ZooKeeper服務器的集合運行。三臺ZooKeeper服務器是建議的最小尺寸,我們也建議他們在不同的機器上運行。 在Yahoo!上,ZooKeeper通常部署在專用的RHEL盒子上,包括雙核處理器,2GB內存和80GB IDE硬盤。

<h1 id="3">下載</h1>

要獲得ZooKeeper發行版,請從Apache下載鏡像中的一個下載最新的穩定版本

<h1 id="4">獨立操作</h1>

在獨立模式下設置ZooKeeper服務器非常簡單。 服務器包含在單個JAR文件中,因此安裝包括創建配置。

一旦你下載了一個穩定的ZooKeeper版本解壓縮並cd到根目錄。

要啓動ZooKeeper,你需要一個配置文件。 這裏是一個示例,在conf / zoo.cfg中創建它:

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

這個文件可以被稱爲任何東西,但是爲了這個討論,把它叫做conf / zoo.cfg。 更改dataDir的值以指定一個現有的(空開始)目錄(沒有就需要創建)。 以下是每個字段的含義:

  • tickTime:ZooKeeper使用的基本時間單位(以毫秒爲單位)。 它用於做心跳,ZK中所有時間都是以這個時間單元爲基礎,進行整數倍配置的。例如:最小會話超時將是tickTime的兩倍。
  • dataDir:存儲內存中數據庫快照的位置,如果不設置參數,更新事務日誌將被存儲到默認位置。
  • clientPort:監聽客戶端連接的端口

現在您已經創建了配置文件,您可以啓動ZooKeeper:

in/zkServer.sh start

ZooKeeper使用log4j記錄消息 - “程序員指南”的“日誌記錄”部分提供了更多詳細信息。 您將看到日誌消息來到控制檯(默認)和/或一個日誌文件取決於log4j配置。

這裏概述的步驟以獨立模式運行ZooKeeper。 沒有複製,所以如果ZooKeeper進程失敗,服務將會關閉。 這在大多數開發情況下都可以,但是要以複製模式運行ZooKeeper,請參閱運行復制ZooKeeper

<h1 id="5">管理ZooKeeper存儲</h1>

對於長時間運行的生產系統,ZooKeeper存儲必須由外部進行管理(dataDir和日誌)。 有關更多詳細信息,請參閱維護部分

<h1 id="6">連接到ZooKeeper</h1>

$ bin/zkCli.sh -server 127.0.0.1:2181

這使您可以執行簡單的文件操作。

一旦你連接,你應該看到像這樣的東西:


Connecting to localhost:2181
log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
Welcome to ZooKeeper!
JLine support is enabled
[zkshell: 0]       

在shell中輸入help來獲取可以從客戶端執行的命令列表,如下所示:


[zkshell: 0] help
ZooKeeper host:port cmd args
        get path [watch]
        ls path [watch]
        set path data [version]
        delquota [-n|-b] path
        quit
        printwatches on|off
        create path data acl
        stat path [watch]
        listquota path
        history
        setAcl path acl
        getAcl path
        sync path
        redo cmdno
        addauth scheme auth
        delete path [version]
        deleteall path
        setquota -n|-b val path

從這裏,你可以嘗試一些簡單的命令來感受這個簡單的命令行界面。 首先,通過發出列表命令開始,如在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

(請注意,我們在設置數據之後做了一個調整,確實發生了變化。

最後,我們通過發出以下命令來刪除節點:


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

現在就是這樣。 要了解更多信息,請繼續閱讀本文檔的其餘部分,並參閱“程序員指南”。

<h1 id="7">編程到ZooKeeper</h1>

ZooKeeper有一個Java綁定和C綁定。 它們在功能上是等同的。 C綁定存在兩種變體:單線程和多線程。 這些僅在消息傳遞循環完成方面有所不同。 有關更多信息,請參閱ZooKeeper程序員指南中的編程示例,瞭解使用不同API的示例代碼。

<h1 id="8">運行復制的ZooKeeper</h1>

以獨立模式運行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集羣中的包含多臺server, 其中一臺爲leader, 集羣中其餘的server爲follower. initLimit參數配置初始化連接時, follower和leader之間的最長心跳時間. 此時該參數設置爲5, 說明時間限制爲5倍tickTime, 即5*2000=10000ms=10s.
  • syncLimit: 該參數配置leader和follower之間發送消息, 請求和應答的最大時間長度. 此時該參數設置爲2, 說明時間限制爲2倍tickTime, 即4000ms.
  • server.X=A:B:C 其中X是一個數字, 表示這是第幾號server. A是該server所在的IP地址. B配置該server和集羣中的leader交換消息所使用的端口. C配置選舉leader時所使用的端口. 由於配置的是僞集羣模式, 所以各個server的B, C參數必須不同.

新條目initLimit是超時值ZooKeeper用來限制仲裁中的ZooKeeper服務器必須連接到領導者的時間長度。 條目syncLimit限制了服務器可以從領導者處過期多久。

有了這兩個超時,您可以使用tickTime指定時間單位。 在這個例子中,initLimit的超時時間爲5倍tickTime, 即5*2000=10000ms=10s。

表單server.X的條目列出了組成ZooKeeper服務的服務器。 當服務器啓動時,它通過在數據目錄中查找文件myid來知道它是哪個服務器。 該文件包含ASCII碼的服務器號碼。

最後,記下每個服務器名稱後的兩個端口號:“2888”和“3888”。 同行使用以前的端口連接到其他同行。 這樣的連接是必要的,以便同行可以溝通,例如,就更新順序達成一致。 更具體地說,一個ZooKeeper服務器使用這個端口將追隨者連接到領導。 當一個新的領導者出現時,一個追隨者使用這個端口打開一個到領導者的TCP連接。 因爲默認領導選舉也使用TCP,所以我們目前需要另一個領導選舉。 這是服務器條目中的第二個端口。

注意:如果要在單臺計算機上測試多臺服務器,請將服務器名稱指定爲具有唯一仲裁和領導者選舉端口的本地主機(即上述示例中的2888:3888,2889:3889,2890:3890) 配置文件。 當然,單獨的dataDirs和不同的clientPort也是必要的(在上面複製的例子中,在一個本地主機上運行,你仍然有三個配置文件)。

請注意,在一臺機器上設置多個服務器不會產生任何冗餘。 如果發生了導致機器死機的事情,所有的動物園管理員服務器都將處於脫機狀態。 完全冗餘要求每臺服務器都有自己的機器。 它必須是一個完全獨立的物理服務器。 同一物理主機上的多個虛擬機仍然容易出現該主機的完全故障。

<h1 id="9">其他優化</h1>

有幾個其他配置參數可以大大提高性能:

  • 爲了在更新時獲得較低的延遲,有一個專用的事務日誌目錄是非常重要的。 默認情況下,事務日誌與數據快照和myid文件放在同一個目錄中。 dataLogDir參數指示用於事務日誌的不同目錄。
  • [待定:什麼是其他配置參數?] ([tbd: what is the other config param?])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章