ZooKeeper的安裝與部署

ZooKeeper的安裝與部署html

1         系統要求

ZooKeeper支持的運行平臺java

 

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

系統apache

開發環境vim

生產環境服務器

Linux網絡

支持session

支持app

Solarissocket

支持

支持

FreeBSD

支持

支持

Windows

支持

不支持

MacOS

支持

不支持

   

 

 

 

 

 

 

 

 

 

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

 

2         安裝包下載及軟件目錄

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

[root@xuegod42 ~]# tar xf zookeeper-3.4.8.tar.gz -C /usr/local/src/

下載並解壓ZooKeeper軟件壓縮包後,能夠看到zk包含如下的文件和目錄

[root@xuegod42 ~]# ls /usr/local/src/zookeeper-3.4.8/

bin          contrib          ivy.xml      README_packaging.txt  zookeeper-3.4.8.jar

build.xml    dist-maven       lib          README.txt            zookeeper-3.4.8.jar.asc

CHANGES.txt  docs             LICENSE.txt  recipes               zookeeper-3.4.8.jar.md5

conf         ivysettings.xml  NOTICE.txt   src                   zookeeper-3.4.8.jar.sha1

 

bin目錄 : zk的可執行腳本目錄,包括zk服務進程,zk客戶端,等腳本。其中,.sh是Linux環境下的腳本,.cmd是Windows環境下的腳本。

conf目錄 : 配置文件目錄。zoo_sample.cfg爲樣例配置文件,須要修改成本身的名稱,通常爲zoo.cfg。log4j.properties爲日誌配置文件。

lib :zk依賴的包。

contrib目錄 : 一些用於操做zk的工具包。

recipes目錄 : zk某些用法的代碼示例

 

3         單機模式

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

單機模式較簡單,是指只部署一個zk進程,客戶端直接與該zk進程進行通訊。 
在開發測試環境下,經過來講沒有較多的物理資源,所以咱們常使用單機模式。固然在單臺物理機上也能夠部署集羣模式,但這會增長單臺物理機的資源消耗。故在開發環境中,咱們通常使用單機模式。 
可是要注意,生產環境下不可用單機模式,這是因爲不管從系統可靠性仍是讀寫性能,單機模式都不能知足生產的需求。

 

3.1     安裝jdk

[root@xuegod42 ~]# rpm -ivh jdk-8u60-linux-x64.rpm

配置環境變量

[root@xuegod42 ~]# vim /etc/profile      #添加以下配置

export JAVA_HOME=/usr/java/jdk1.8.0_60

export JAVA_BIN=/usr/java/jdk1.8.0_60/bin

export PATH=${JAVA_HOME}bin:$PATH

export CLASSPATH=.:${JAVA_HOME}/lib.dt.jar:${JAVA_HOME}/lib/tools.jar

[root@xuegod42 ~]# source /etc/profile

[root@xuegod42 ~]# java -version

java version "1.8.0_60"

Java(TM) SE Runtime Environment (build 1.8.0_60-b27)

Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

[root@xuegod42 ~]# scp /etc/profile root@192.168.10.43:/etc/

3.2     運行配置

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

[root@xuegod42 conf]# ls

configuration.xsl  log4j.properties  zoo_sample.cfg

[root@xuegod42 conf]# mv zoo_sample.cfg zoo.cfg

[root@xuegod42 conf]# vim zoo.cfg

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

# do not use /tmp for storage, /tmp here is just

# example sakes.

dataDir=/tmp/zookeeper

# the port at which the clients will connect

clientPort=2181

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

dataDir=/usr/local/zookeeper/data

dataLogDir=/usr/local/zookeeper/logs

3.3     運行

[root@xuegod42 ~]# mv /usr/local/src/zookeeper-3.4.8/ /usr/local/

[root@xuegod42 ~]# mv /usr/local/zookeeper-3.4.8/ /usr/local/zookeeper

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

[root@xuegod42 bin]# ./zkServer.sh start

這個命令使得zk服務進程在後臺進行。

若是想在前臺中運行以便查看服務器進程的輸出日誌,能夠經過如下命令運行:

./zkServer.sh start-foreground

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

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

3.4     鏈接

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

[root@xuegod42 zookeeper]# ./bin/zkCli.sh  -server 127.0.0.1:2181

 

4         集羣模式

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

注意: 
在集羣模式下,建議至少部署3個zk進程,或者部署奇數個zk進程。若是隻部署2個zk進程,當其中一個zk進程掛掉後,剩下的一個進程並不能構成一個quorum的大多數。所以,部署2個進程甚至比單機模式更不可靠,由於2個進程其中一個不可用的可能性比一個進程不可用的可能性還大。

4.1     運行配置

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

tickTime=2000

dataDir=/usr/local/zookeeper/data

dataLogDir=/usr/local/zookeeper/logs

clientPort=2181

initLimit=5

syncLimit=2

server.1=192.168.10.42:2888:3888

server.2=192.168.10.43:2888:3888

server.3=192.168.10.44: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進程部署不一樣的物理機器上面。

4.2     啓動

假如咱們打算在三臺不一樣的機器 192.168.229.160,192.168.229.161,192.168.229.162上各部署一個zk進程,以構成一個zk集羣。 

三個zk進程均使用相同的 zoo.cfg 配置:

tickTime=2000

dataDir=/usr/local/zookeeper/data

dataLogDir=/usr/local/zookeeper/logs

clientPort=2181

initLimit=5

syncLimit=2

server.1=192.168.10.42:2888:3888

server.2=192.168.10.43:2888:3888

server.3=192.168.10.44:2888:3888

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

[root@xuegod42 data]# cat myid

1

[root@xuegod43 data]# cat myid

2

[root@xuegod44 data]# cat myid

3

4.3     鏈接

可使用如下命令來鏈接一個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集羣。

 

5         僞集羣模式

所謂僞集羣, 是指在單臺機器中啓動多個zookeeper進程, 並組成一個集羣. 以啓動3個zookeeper進程爲例.

將zookeeper的目錄拷貝2份:

Bash代碼  

  1. |--zookeeper0  
  2. |--zookeeper1  
  3. |--zookeeper2  

 更改zookeeper0/conf/zoo.cfg文件爲:

Bash代碼  

  1. tickTime=2000    
  2. initLimit=5    
  3. syncLimit=2    
  4. dataDir=/Users/apple/zookeeper0/data    
  5. dataLogDir=/Users/apple/zookeeper0/logs    
  6. clientPort=4180  
  7. server.0=127.0.0.1:8880:7770    
  8. server.1=127.0.0.1:8881:7771    
  9. server.2=127.0.0.1:8882:7772  

新增了幾個參數, 其含義以下:

  • initLimit: zookeeper集羣中的包含多臺server, 其中一臺爲leader, 集羣中其他的server爲follower. initLimit參數配置初始化鏈接時, follower和leader之間的最長心跳時間. 此時該參數設置爲5, 說明時間限制爲5倍tickTime, 即5*2000=10000ms=10s.
  • syncLimit: 該參數配置leader和follower之間發送消息, 請求和應答的最大時間長度. 此時該參數設置爲2, 說明時間限制爲2倍tickTime, 即4000ms.
  • server.X=A:B:C 其中X是一個數字, 表示這是第幾號server. A是該server所在的IP地址. B配置該server和集羣中的leader交換消息所使用的端口. C配置選舉leader時所使用的端口. 因爲配置的是僞集羣模式, 因此各個server的B, C參數必須不一樣.

參照zookeeper0/conf/zoo.cfg, 配置zookeeper1/conf/zoo.cfg, 和zookeeper2/conf/zoo.cfg文件. 只需更改dataDir, dataLogDir, clientPort參數便可.

在以前設置的dataDir中新建myid文件, 寫入一個數字, 該數字表示這是第幾號server. 該數字必須和zoo.cfg文件中的server.X中的X一一對應.
/Users/apple/zookeeper0/data/myid文件中寫入0, /Users/apple/zookeeper1/data/myid文件中寫入1, /Users/apple/zookeeper2/data/myid文件中寫入2.

分別進入/Users/apple/zookeeper0/bin, /Users/apple/zookeeper1/bin, /Users/apple/zookeeper2/bin三個目錄, 啓動server.
任意選擇一個server目錄, 啓動客戶端:

Bash代碼  

  1. bin/zkCli.sh -server localhost:4180  

 

參考資料:

1.http://blog.csdn.net/lihao21/article/details/51778255

2.http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html

3.http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html

4.《ZooKeeper分佈式系統開發實戰》課程,主講人:璽感

5.《ZooKeeper分佈式過程協同技術詳解》,Flavio Junqueira等著,謝超等譯

6.百度百科有關quorum的解釋,http://baike.baidu.com/link?url=pqWrzgH-_VhMLnscR1iRTpPjovfyhxG-8Qs9HxGutiGi5bhnA_lX_pmabLQ-3MiDeigcHRFMYSbFg90RAYVAta

7.《Zookeeper 安裝和配置》,http://coolxing.iteye.com/blog/1871009

相關文章
相關標籤/搜索