ZooKeeper的安裝與運行

本文講述如何安裝和部署ZooKeeper。

一、系統要求

ZooKeeper可以運行在多種系統平臺上面,表1展示了zk支持的系統平臺,以及在該平臺上是否支持開發環境或者生產環境。

表1:ZooKeeper支持的運行平臺

系統開發環境生產環境
Linux 支持 支持
Solaris 支持 支持
FreeBSD 支持 支持
Windows 支持 不支持
MacOS 支持 不支持

ZooKeeper是用Java編寫的,運行在Java環境上,因此,在部署zk的機器上需要安裝Java運行環境。爲了正常運行zk,我們需要JRE1.6或者以上的版本。 
對於集羣模式下的ZooKeeper部署,3個ZooKeeper服務進程是建議的最小進程數量,而且不同的服務進程建議部署在不同的物理機器上面,以減少機器宕機帶來的風險,以實現ZooKeeper集羣的高可用。 
ZooKeeper對於機器的硬件配置沒有太大的要求。例如,在Yahoo!內部,ZooKeeper部署的機器其配置通常如下:雙核處理器,2GB內存,80GB硬盤。

二、下載

可以從 https://zookeeper.apache.org/releases.html 下載ZooKeeper,目前最新的穩定版本爲 3.4.8 版本,用戶可以自行選擇一個速度較快的鏡像來下載即可。

三、目錄

下載並解壓ZooKeeper軟件壓縮包後,可以看到zk包含以下的文件和目錄:

這裏寫圖片描述 
圖1:ZooKeeper軟件的文件和目錄

  • bin目錄 
    zk的可執行腳本目錄,包括zk服務進程,zk客戶端,等腳本。其中,.sh是Linux環境下的腳本,.cmd是Windows環境下的腳本。
  • conf目錄 
    配置文件目錄。zoo_sample.cfg爲樣例配置文件,需要修改爲自己的名稱,一般爲zoo.cfg。log4j.properties爲日誌配置文件。
  • lib 
    zk依賴的包。
  • contrib目錄 
    一些用於操作zk的工具包。
  • recipes目錄 
    zk某些用法的代碼示例

四、單機模式

ZooKeeper的安裝包括單機模式安裝,以及集羣模式安裝。

單機模式較簡單,是指只部署一個zk進程,客戶端直接與該zk進程進行通信。 
在開發測試環境下,通過來說沒有較多的物理資源,因此我們常使用單機模式。當然在單臺物理機上也可以部署集羣模式,但這會增加單臺物理機的資源消耗。故在開發環境中,我們一般使用單機模式。 
但是要注意,生產環境下不可用單機模式,這是由於無論從系統可靠性還是讀寫性能,單機模式都不能滿足生產的需求。

4.1 運行配置

上面提到,conf目錄下提供了配置的樣例zoo_sample.cfg,要將zk運行起來,需要將其名稱修改爲zoo.cfg。 
打開zoo.cfg,可以看到默認的一些配置。

  • tickTime 
    時長單位爲毫秒,爲zk使用的基本時間度量單位。例如,1 * tickTime是客戶端與zk服務端的心跳時間,2 * tickTime是客戶端會話的超時時間。 
    tickTime的默認值爲2000毫秒,更低的tickTime值可以更快地發現超時問題,但也會導致更高的網絡流量(心跳消息)和更高的CPU使用率(會話的跟蹤處理)。
  • clientPort 
    zk服務進程監聽的TCP端口,默認情況下,服務端會監聽2181端口。
  • dataDir 
    無默認配置,必須配置,用於配置存儲快照文件的目錄。如果沒有配置dataLogDir,那麼事務日誌也會存儲在此目錄。

4.2 啓動

在Windows環境下,直接雙擊zkServer.cmd即可。在Linux環境下,進入bin目錄,執行命令

./zkServer.sh start
  • 1

這個命令使得zk服務進程在後臺進行。如果想在前臺中運行以便查看服務器進程的輸出日誌,可以通過以下命令運行:

./zkServer.sh start-foreground
  • 1

執行此命令,可以看到大量詳細信息的輸出,以便允許查看服務器發生了什麼。

使用文本編輯器打開zkServer.cmd或者zkServer.sh文件,可以看到其會調用zkEnv.cmd或者zkEnv.sh腳本。zkEnv腳本的作用是設置zk運行的一些環境變量,例如配置文件的位置和名稱等。

4.3 連接

如果是連接同一臺主機上的zk進程,那麼直接運行bin/目錄下的zkCli.cmd(Windows環境下)或者zkCli.sh(Linux環境下),即可連接上zk。 
直接執行zkCli.cmd或者zkCli.sh命令默認以主機號 127.0.0.1,端口號 2181 來連接zk,如果要連接不同機器上的zk,可以使用 -server 參數,例如:

bin/zkCli.sh -server 192.168.0.1:2181
  • 1

五、集羣模式

單機模式的zk進程雖然便於開發與測試,但並不適合在生產環境使用。在生產環境下,我們需要使用集羣模式來對zk進行部署。

注意 
在集羣模式下,建議至少部署3個zk進程,或者部署奇數個zk進程。如果只部署2個zk進程,當其中一個zk進程掛掉後,剩下的一個進程並不能構成一個quorum的大多數。因此,部署2個進程甚至比單機模式更不可靠,因爲2個進程其中一個不可用的可能性比一個進程不可用的可能性還大。

5. 1 運行配置

在集羣模式下,所有的zk進程可以使用相同的配置文件(是指各個zk進程部署在不同的機器上面),例如如下配置:

  1.  
    tickTime=2000
  2.  
    dataDir=/home/myname/zookeeper
  3.  
    clientPort=2181
  4.  
    initLimit=5
  5.  
    syncLimit=2
  6.  
    server.1=192.168.229.160:2888:3888
  7.  
    server.2=192.168.229.161:2888:3888
  8.  
    server.3=192.168.229.162:2888:3888
  • initLimit 
    ZooKeeper集羣模式下包含多個zk進程,其中一個進程爲leader,餘下的進程爲follower。 
    當follower最初與leader建立連接時,它們之間會傳輸相當多的數據,尤其是follower的數據落後leader很多。initLimit配置follower與leader之間建立連接後進行同步的最長時間。
  • syncLimit 
    配置follower和leader之間發送消息,請求和應答的最大時間長度。
  • tickTime 
    tickTime則是上述兩個超時配置的基本單位,例如對於initLimit,其配置值爲5,說明其超時時間爲 2000ms * 5 = 10秒。
  • server.id=host:port1:port2 
    其中id爲一個數字,表示zk進程的id,這個id也是dataDir目錄下myid文件的內容。 
    host是該zk進程所在的IP地址,port1表示follower和leader交換消息所使用的端口,port2表示選舉leader所使用的端口。
  • dataDir 
    其配置的含義跟單機模式下的含義類似,不同的是集羣模式下還有一個myid文件。myid文件的內容只有一行,且內容只能爲1 - 255之間的數字,這個數字亦即上面介紹server.id中的id,表示zk進程的id。

注意 
如果僅爲了測試部署集羣模式而在同一臺機器上部署zk進程,server.id=host:port1:port2配置中的port參數必須不同。但是,爲了減少機器宕機的風險,強烈建議在部署集羣模式時,將zk進程部署不同的物理機器上面。

5.2 啓動

假如我們打算在三臺不同的機器 192.168.229.160,192.168.229.161,192.168.229.162上各部署一個zk進程,以構成一個zk集羣。 
三個zk進程均使用相同的 zoo.cfg 配置:

  1.  
    tickTime=2000
  2.  
    dataDir=/home/myname/zookeeper
  3.  
    clientPort=2181
  4.  
    initLimit=5
  5.  
    syncLimit=2
  6.  
    server.1=192.168.229.160:2888:3888
  7.  
    server.2=192.168.229.161:2888:3888
  8.  
    server.3=192.168.229.162:2888:3888

在三臺機器dataDir目錄( /home/myname/zookeeper 目錄)下,分別生成一個myid文件,其內容分別爲1,2,3。然後分別在這三臺機器上啓動zk進程,這樣我們便將zk集羣啓動了起來。

5.3 連接

可以使用以下命令來連接一個zk集羣:

bin/zkCli.sh -server 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181
  • 1

成功連接後,可以看到如下輸出:

  1.  
    2016-06-28 19:29:18,074 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@770537e4
  2.  
    Welcome to ZooKeeper!
  3.  
    2016-06-28 19:29:18,146 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@975] - Opening socket connection to server 192.168.229.162/192.168.229.162:2181. Will not attempt to authenticate using SASL (unknown error)
  4.  
    JLine support is enabled
  5.  
    2016-06-28 19:29:18,161 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@852] - Socket connection established to 192.168.229.162/192.168.229.162:2181, initiating session
  6.  
    2016-06-28 19:29:18,199 [myid:] - INFO [main-SendThread(192.168.229.162:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server 192.168.229.162/192.168.229.162:2181, sessionid = 0x3557c39d2810029, negotiated timeout = 30000
  7.  
     
  8.  
    WATCHER::
  9.  
     
  10.  
    WatchedEvent state:SyncConnected type:None path:null
  11.  
    [zk: 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181(CONNECTED) 0]

圖2:客戶端連接zk集羣的輸出日誌

從日誌輸出可以看到,客戶端連接的是192.168.229.162:2181進程(連接上哪臺機器的zk進程是隨機的),客戶端已成功連接上zk集羣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章