ZooKeeper入門(二)

入門:使用ZooKeeper的協調分佈式應用html

這個文檔使你對ZooKeeper快速入門,它主要針對想嘗試它的開發者。而且包含簡單的單機的ZooKeeper服務的安裝說明,一些驗證是否運行的命令,和一個簡單的編程例子。最後,爲了方便起見,有幾部分關於更復雜的安裝,例如運行復制的部署,優化事務日誌,然而爲了商業部署的完整手冊,請參考ZooKeeper Administrator's Guidenode

Pre-requisites

參考管理手冊中的 System Requirements。shell

下載數據庫

想要得到ZooKeeper的分發。從Apache的下載鏡像中下載一個最近的穩定版本。apache

單機操做編程

以單機的模型安裝ZooKeeper服務是至關直接的。服務器包含一個單獨的JAR包,因此安裝過程包含建立一個配置文件。一旦你下載了一個ZooKeeper的穩定發行版本。解壓它而後進入到它的根目錄。服務器

爲了啓動ZooKeeper你須要一個配置文件,這裏有一個例子,在conf/zoo.cfg中建立它。多線程

1app

2分佈式

3

tickTime=2000

dataDir=/var/lib/zookeeper

clientPort=2181

這個文件能夠被叫做任何名字。可是爲了這個討論叫它conf/zoo.cfg。改變dataDir的值使它指向一個存在(一開始爲空)的目錄,下面是每個字段的含義。

tickTimeZooKeeper使用的最基本的毫秒時間單位,它被用來作心跳而且會話失效的最小時間是兩倍的tickTime。

dataDir存儲內存數據庫快照的地址,而且除非另外指定,也是數據庫的更新的事務日誌的地址。

clientPort監聽客戶端鏈接的端口

如今你已經建立了一個配置文件,你能夠用下面的命令啓動ZooKeeper。

1

bin/zkServer.sh start

 ZooKeeper使用log4j來記錄日誌消息,更詳細的內容能夠在開發者的指導手冊中的Logging部分得到。你能夠看到日誌打印到控制檯(默認的)和/或根據log4j的配置的日誌文件中。

這裏列出的是以單機模式運行ZooKeeper的大綱。這裏沒有複製,因此若是ZooKeeper進程失敗,服務將會中止。這對大部分的開發狀況是ok的。可是想要以複製模式運行ZooKeeper,請參考Running Replicated ZooKeeper

管理ZooKeeper存儲

對於一個長時間運行的生產環境系統,ZooKeeper存儲必須在外部被管理(dataDir and logs)。參考maintenance部分來獲取更多信息。

連接ZooKeeper

一旦ZooKeeper正在運行。你有幾個選項來連接它:

  • Java 使用
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節點將會掉線。爲了冗餘須要每個節點擁有它本身的機器。它必需是完成獨立的物理機器。同一個物理主機的多個

虛擬機器對這個主機的失敗也是脆弱的。

其它的優化

有其它幾個配置參數可能大大地提升性能:

  • 爲了更新裏有低的延遲,有一個特定的事務日誌目錄是重要的。默認狀況下事務日誌被放在和數據快照和myid文件相同的目錄。dataLogDir參數爲事務日誌指明瞭一個不一樣的目錄。
  • [其它配置參數呢]
相關文章
相關標籤/搜索