1. 程式人生 > >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程序部署在不同的機器上面),例如如下配置:

tickTime=2000 dataDir=/home/myname/zookeeper clientPort=2181 initLimit=5 syncLimit=2 server.1=192.168.229.160:2888:3888 server.2=192.168.229.161:2888:3888 server.3=192.168.229.162:2888:3888 1 2 3 4 5 6 7 8 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 配置:

tickTime=2000 dataDir=/home/myname/zookeeper clientPort=2181 initLimit=5 syncLimit=2 server.1=192.168.229.160:2888:3888 server.2=192.168.229.161:2888:3888 server.3=192.168.229.162:2888:3888 1 2 3 4 5 6 7 8 在三臺機器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 成功連線後,可以看到如下輸出:

2016-06-28 19:29:18,074 [myid:] - INFO  [main:[email protected]] - Initiating client connection, connectString=192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181 sessionTimeout=30000 [email protected] Welcome to ZooKeeper! 2016-06-28 19:29:18,146 [myid:] - INFO  [main-SendThread(192.168.229.162:2181):[email protected]] - Opening socket connection to server 192.168.229.162/192.168.229.162:2181. Will not attempt to authenticate using SASL (unknown error) JLine support is enabled 2016-06-28 19:29:18,161 [myid:] - INFO  [main-SendThread(192.168.229.162:2181):[email protected]] - Socket connection established to 192.168.229.162/192.168.229.162:2181, initiating session 2016-06-28 19:29:18,199 [myid:] - INFO  [main-SendThread(192.168.229.162:2181):[email protected]] - Session establishment complete on server 192.168.229.162/192.168.229.162:2181, sessionid = 0x3557c39d2810029, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null [zk: 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181(CONNECTED) 0]  1 2 3 4 5 6 7 8 9 10 11 圖2:客戶端連線zk叢集的輸出日誌

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

參考資料

http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html 《ZooKeeper分散式系統開發實戰》課程,主講人:璽感 《ZooKeeper分散式過程協同技術詳解》,Flavio Junqueira等著,謝超等譯 百度百科有關quorum的解釋,http://baike.baidu.com/link?url=pqWrzgH-_VhMLnscR1iRTpPjovfyhxG-8Qs9HxGutiGi5bhnA_lX_pmabLQ-3MiDeigcHRFMYSbFg90RAYVAta 《Zookeeper 安裝和配置》,http://coolxing.iteye.com/blog/1871009

文章來源:https://blog.csdn.net/lihao21/article/details/51778255