ZooKeeper能夠運行在多種系統平臺上面,表1展現了zk支持的系統平臺,以及在該平臺上是否支持開發環境或者生產環境。html
表1:ZooKeeper支持的運行平臺java
系統 | 開發環境 | 生產環境 |
---|---|---|
Linux | 支持 | 支持 |
Solaris | 支持 | 支持 |
FreeBSD | 支持 | 支持 |
Windows | 支持 | 不支持 |
MacOS | 支持 | 不支持 |
ZooKeeper是用Java編寫的,運行在Java環境上,所以,在部署zk的機器上須要安裝Java運行環境。爲了正常運行zk,咱們須要JRE1.6或者以上的版本。
對於集羣模式下的ZooKeeper部署,3個ZooKeeper服務進程是建議的最小進程數量,並且不一樣的服務進程建議部署在不一樣的物理機器上面,以減小機器宕機帶來的風險,以實現ZooKeeper集羣的高可用。
ZooKeeper對於機器的硬件配置沒有太大的要求。例如,在Yahoo!內部,ZooKeeper部署的機器其配置一般以下:雙核處理器,2GB內存,80GB硬盤。linux
能夠從 https://zookeeper.apache.org/releases.html 下載ZooKeeper,目前最新的穩定版本爲 3.4.8 版本,用戶能夠自行選擇一個速度較快的鏡像來下載便可。apache
下載並解壓ZooKeeper軟件壓縮包後,能夠看到zk包含如下的文件和目錄:服務器
圖1:ZooKeeper軟件的文件和目錄網絡
ZooKeeper的安裝包括單機模式安裝,以及集羣模式安裝。session
單機模式較簡單,是指只部署一個zk進程,客戶端直接與該zk進程進行通訊。
在開發測試環境下,經過來講沒有較多的物理資源,所以咱們常使用單機模式。固然在單臺物理機上也能夠部署集羣模式,但這會增長單臺物理機的資源消耗。故在開發環境中,咱們通常使用單機模式。
可是要注意,生產環境下不可用單機模式,這是因爲不管從系統可靠性仍是讀寫性能,單機模式都不能知足生產的需求。socket
上面提到,conf目錄下提供了配置的樣例zoo_sample.cfg,要將zk運行起來,須要將其名稱修改成zoo.cfg。
打開zoo.cfg,能夠看到默認的一些配置。編輯器
在Windows環境下,直接雙擊zkServer.cmd便可。在Linux環境下,進入bin目錄,執行命令分佈式
./zkServer.sh start
這個命令使得zk服務進程在後臺進行。若是想在前臺中運行以便查看服務器進程的輸出日誌,能夠經過如下命令運行:
./zkServer.sh start-foreground
執行此命令,能夠看到大量詳細信息的輸出,以便容許查看服務器發生了什麼。
使用文本編輯器打開zkServer.cmd或者zkServer.sh文件,能夠看到其會調用zkEnv.cmd或者zkEnv.sh腳本。zkEnv腳本的做用是設置zk運行的一些環境變量,例如配置文件的位置和名稱等。
若是是鏈接同一臺主機上的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
單機模式的zk進程雖然便於開發與測試,但並不適合在生產環境使用。在生產環境下,咱們須要使用集羣模式來對zk進行部署。
注意
在集羣模式下,建議至少部署3個zk進程,或者部署奇數個zk進程。若是隻部署2個zk進程,當其中一個zk進程掛掉後,剩下的一個進程並不能構成一個quorum的大多數。所以,部署2個進程甚至比單機模式更不可靠,由於2個進程其中一個不可用的可能性比一個進程不可用的可能性還大。
在集羣模式下,全部的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
注意
若是僅爲了測試部署集羣模式而在同一臺機器上部署zk進程,server.id=host:port1:port2配置中的port參數必須不一樣。可是,爲了減小機器宕機的風險,強烈建議在部署集羣模式時,將zk進程部署不一樣的物理機器上面。
假如咱們打算在三臺不一樣的機器 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
在三臺機器dataDir目錄( /home/myname/zookeeper 目錄)下,分別生成一個myid文件,其內容分別爲1,2,3。而後分別在這三臺機器上啓動zk進程,這樣咱們便將zk集羣啓動了起來。
可使用如下命令來鏈接一個zk集羣:
bin/zkCli.sh -server 192.168.229.160:2181,192.168.229.161:2181,192.168.229.162:2181
成功鏈接後,能夠看到以下輸出:
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 Welcome to ZooKeeper! 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) JLine support is enabled 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 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 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]
圖2:客戶端鏈接zk集羣的輸出日誌
從日誌輸出能夠看到,客戶端鏈接的是192.168.229.162:2181進程(鏈接上哪臺機器的zk進程是隨機的),客戶端已成功鏈接上zk集羣。