入門:使用ZooKeeper的協調分佈式應用html
這個文檔使你對ZooKeeper快速入門,它主要針對想嘗試它的開發者。而且包含簡單的單機的ZooKeeper服務的安裝說明,一些驗證是否運行的命令,和一個簡單的編程例子。最後,爲了方便起見,有幾部分關於更復雜的安裝,例如運行復制的部署,優化事務日誌,然而爲了商業部署的完整手冊,請參考ZooKeeper Administrator's Guide。node
參考管理手冊中的 System Requirements。shell
下載數據庫
想要得到ZooKeeper的分發。從Apache的下載鏡像中下載一個最近的穩定版本。apache
單機操做編程
以單機的模型安裝ZooKeeper服務是至關直接的。服務器包含一個單獨的JAR包,因此安裝過程包含建立一個配置文件。一旦你下載了一個ZooKeeper的穩定發行版本。解壓它而後進入到它的根目錄。服務器
爲了啓動ZooKeeper你須要一個配置文件,這裏有一個例子,在conf/zoo.cfg中建立它。多線程
1app 2分佈式 3 |
|
這個文件能夠被叫做任何名字。可是爲了這個討論叫它conf/zoo.cfg。改變dataDir的值使它指向一個存在(一開始爲空)的目錄,下面是每個字段的含義。
tickTimeZooKeeper使用的最基本的毫秒時間單位,它被用來作心跳而且會話失效的最小時間是兩倍的tickTime。
dataDir存儲內存數據庫快照的地址,而且除非另外指定,也是數據庫的更新的事務日誌的地址。
clientPort監聽客戶端鏈接的端口
如今你已經建立了一個配置文件,你能夠用下面的命令啓動ZooKeeper。
1 |
|
ZooKeeper使用log4j來記錄日誌消息,更詳細的內容能夠在開發者的指導手冊中的Logging部分得到。你能夠看到日誌打印到控制檯(默認的)和/或根據log4j的配置的日誌文件中。
這裏列出的是以單機模式運行ZooKeeper的大綱。這裏沒有複製,因此若是ZooKeeper進程失敗,服務將會中止。這對大部分的開發狀況是ok的。可是想要以複製模式運行ZooKeeper,請參考Running Replicated ZooKeeper。
管理ZooKeeper存儲
對於一個長時間運行的生產環境系統,ZooKeeper存儲必須在外部被管理(dataDir and logs)。參考maintenance部分來獲取更多信息。
連接ZooKeeper
一旦ZooKeeper正在運行。你有幾個選項來連接它:
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而且給這個節點關聯一個string "my_data"。你能夠看到:
[zkshell: 9] create /zk_test my_data Created /zk_test
發起另外一個ls / 命令來查看目錄看起來像什麼:
[zkshell: 11] ls / [zookeeper, zk_test]
注意zk_test目錄已經被建立。
下一步,經過運行get命令檢查跟這個節點關聯的數據,例如:
[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命令,例如:
[zkshell: 14] set /zk_test chenkangyao 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 chenkangyao 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操做在set操做以後,而且它確實改變了。
最後,讓咱們刪除這個節點經過:
[zkshell: 16] delete /zk_test [zkshell: 17] ls / [zookeeper] [zkshell: 18]
先就這些吧,要想獲取更多。繼續這個文檔的剩餘部分和Programmer's Guide部分。
ZooKeeper編程
ZooKeeper有一個Java綁定和C綁定。他們在功能上是等價的。C綁定以兩種不一樣的形式存在:單線程和多線程。他們只在消息循環是如何完成時不一樣。更多信息請參考Programming Examples in the ZooKeeper Programmer's Guide。
運行可複製的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服務器鏈接領導者的超時時間。syncLimit限制了一個服務器從一個領導者的過時時間。有了這兩個超時時間,你用tickTime來指定時間單位。在這個例子中,initLimit的超時時間是5個ticks,每一個ticks是2000毫秒,或者10秒。
server.X這樣形式的條目列出了組成ZooKeeper服務的服務器。當服務啓動的時候,經過搜尋數據目錄下的myid文件它知道是那一臺服務器。這個文件以ASCII格式包含服務器數字。
最後,注意每個服務器名字後面的兩個端口號:「2888」和「3888」。服務中的節點前一個端口去連接其它的節點。這個的鏈接是必需的,因此節點之間能夠相互通訊,例如,贊成更新的順序。更具體地說,ZooKeeper用這個端口來鏈接追隨者和領導者。當一個領導者被選舉出來,一個追隨者打開一個TCP鏈接用這個端口。由於默認的領導者選舉也用TCP,咱們如今須要另外一個端口用來領導者選舉,這就是server條目中的第二個端口。
注意:
若是你想在同一臺機器上測試多個服務器,用localhost指定服務名和惟一的法定人數和領導者選舉端口(也就是說.2888:3888,2889:3889,2890:3890)用於每個server.X在服務器的配置文件中。固然獨立的DataDires和不一樣clientPorts 也是必需的(在上面的複製例子,運行在單獨的一個機器,你也須要三個配置文件)。
請注意在一個機器上安裝多個ZooKeeper服務節點將不會建立任何冗餘。若是有什麼致使這個機器掛掉的事件發生,全部的ZooKeeper節點將會掉線。爲了冗餘須要每個節點擁有它本身的機器。它必需是完成獨立的物理機器。同一個物理主機的多個
虛擬機器對這個主機的失敗也是脆弱的。
其它的優化
有其它幾個配置參數可能大大地提升性能: