天天看點

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

zk承受節點故障是(n-1)/2

.安裝zookeeper叢集

1.在s100上面上傳zk壓縮包

>cp /mnt/hgfs/BigData/第九天/zookeeper-3.4.10.tar.gz /data/

解壓

>cd /data

>tar -xzvf zookeeper-3.4.10.tar.gz

2.發送到其他節點

>xsync /data/zookeeper-3.4.10

3.配置環境

[/etc/environment]

ZOOKEEPER_HOME=/data/zookeeper-3.4.10

Path=”$Path:/data/zookeeper-3.4.10/bin”

4.重新開機

>sudo reboot

5.測試

>zk

6.      修改配置檔案

>cd /data/zookeeper-3.4.10/conf

>cp zoo_sample.cfg zoo.cfg

>sudo nano zoo.cfg

dataDir=/home/neworigin/zookeeper

                           server.1=s100:2888:3888

                       server.2=s101:2888:3888

                       server.3=s102:2888:3888

server.X=host:port1:port2 的意思, X 表示目前 host 所運作的服務的 zookeeper 服務的 id(在接下來填寫 myid 時需要用到), port1 表示

zookeeper 中的 follower 連接配接到 leader 的端口号, port2 表示 leadership 時所用的端口号。

7.發送配置檔案

>xsync zoo.cfg

8.      建立檔案夾

>xcall mkdir -p/home/neworigin/zookeeper

>cd /home/neworigin/zookeeper

[s100]

>echo 1 > myid

[s101]

echo 2 > myid

[s102]

echo 3 > myid

檔案内容為 zoo.cfg 中 master 所對應的 server.X。

9.      啟動叢集(s100、s101、s102一起啟動zk,盡量避免啟動時間差距大)

>zkServer.sh start

>xcall jps檢視程序

------------s100-----------------

3862 QuorumPeerMain

4351 Jps

------------s101-----------------

3650 QuorumPeerMain

3980 Jps

------------s102-----------------

3961 Jps

3791 QuorumPeerMain

------------s103-----------------

3883 Jps

[檢視狀态 leader or follower]

                    >zkServer.shstatus

[暫停]

>zkServer.sh stop

~~~~~~~~~~~~~~~

zoo_sample.cfg:

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料
ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

s100連接配接s101:

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料
ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

其實不用那麼麻煩,上面還可用下述方法:

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

-----

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

-------------

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料
ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

zk.getData();注冊觀察者,監聽zk節點資料的改變。

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料
ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

zk周遊所有子節點樹:

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料
ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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包含以下的檔案和目錄:

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:           
  • 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:,:,:           
  • 1

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

-- ::, [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=.:,.:,.: sessionTimeout= watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@770537e4
Welcome to ZooKeeper!
-- ::, [myid:] - INFO  [main-SendThread(.:):ClientCnxn$SendThread@975] - Opening socket connection to server ./.:. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
-- ::, [myid:] - INFO  [main-SendThread(.:):ClientCnxn$SendThread@852] - Socket connection established to ./.:, initiating session
-- ::, [myid:] - INFO  [main-SendThread(.:):ClientCnxn$SendThread@1235] - Session establishment complete on server ./.:, sessionid = , negotiated timeout = 

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: .:,.:,.:(CONNECTED) ]            
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

圖2:用戶端連接配接zk叢集的輸出日志

從日志輸出可以看到,用戶端連接配接的是192.168.229.162:2181程序(連接配接上哪台機器的zk程序是随機的),用戶端已成功連接配接上zk叢集。

參考資料

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

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Zookeeper安裝

  zookeeper的安裝分為三種模式:單機模式、叢集模式和僞叢集模式。

  • 單機模式

    首先,從Apache官網下載下傳一個Zookeeper穩定版本,本次教程采用的是zookeeper-3.4.9版本。

http:

//apache.fayea.com/zookeeper/zookeeper-3.4.9/

     然後解壓zookeeper-3.4.9.tar.gz檔案到安裝目錄下:

tar -zxvf zookeepre-3.4.9.tar.gz      

  zookeeper要求Java運作環境,并且需要jdk版本1.6以上。為了以後的操作友善,可以對zookeeper的環境變量進行配置(該步驟可忽略)。方法如下,在/etc/profile檔案中加入以下内容:

#Set Zookeeper Environment

export ZOOKEEPER_HOME=/root/zookeeper-3.4.9

export PATH=$ZOOKEEPER_HOME/bin;$ZOOKEEPER_HOME/conf      

   Zookeeper伺服器包含在單個jar檔案中(本環境下為 zookeeper-3.4.9.jar),安裝此服務需要使用者自己建立一個配置檔案。預設配置檔案路徑為 Zookeeper-3.4.9/conf/目錄下,檔案名為zoo.cfg。進入conf/目錄下可以看到一個zoo_sample.cfg檔案,可供參考。通過以下代碼在conf目錄下建立zoo.cfg檔案:

gedit zoo.cfg       

 在檔案中輸入以下内容并儲存

tickTime=2000dataDir=/home/jxwch/hadoop/data/zookeeper

dataLogDir=/home/jxwch/hadoop/dataLog/zookeeper

clientPort=2181       

  在這個檔案中,各個語句的含義:

    tickTime : 伺服器與用戶端之間互動的基本時間單元(ms)

    dataDir : 儲存zookeeper資料路徑

    dataLogDir : 儲存zookeeper日志路徑,當此配置不存在時預設路徑與dataDir一緻

    clientPort : 用戶端通路zookeeper時經過伺服器端時的端口号

  使用單機模式時需要注意,在這種配置方式下,如果zookeeper伺服器出現故障,zookeeper服務将會停止。

  • 叢集模式

    zookeeper最主要的應用場景是叢集,下面介紹如何在一個叢集上部署一個zookeeper。隻要叢集上的大多數zookeeper服務啟動了,那麼總的zookeeper服務便是可用的。另外,最好使用奇數台伺服器。如歌zookeeper擁有5台伺服器,那麼在最多2台伺服器出現故障後,整個服務還可以正常使用。

    之後的操作和單機模式的安裝類似,我們同樣需要Java環境,下載下傳最新版的zookeeper并配置相應的環境變量。不同之處在于每台機器上的conf/zoo.cfg配置檔案的參數設定不同,使用者可以參考下面的配置:

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料
tickTime=2000

initLimit=10

syncLimit=5

dataDir=/home/jxwch/server1/data

dataLogDir=/home/jxwch/server1/dataLog

clientPort=2181

server.1=zoo1:2888:3888

server.2=zoo2:2888:3888

server.3=zoo3:2888:3888

maxClientCnxns=60      
ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

    在這個配置檔案中,新出現的語句的含義:

      initLimit : 此配置表示允許follower連接配接并同步到leader的初始化時間,它以tickTime的倍數來表示。當超過設定倍數的tickTime時間,則連接配接失敗。

      syncLimit : Leader伺服器與follower伺服器之間資訊同步允許的最大時間間隔,如果超過次間隔,預設follower伺服器與leader伺服器之間斷開連結。

      maxClientCnxns : 限制連接配接到zookeeper伺服器用戶端的數量

      server.id=host:port:port : 表示了不同的zookeeper伺服器的自身辨別,作為叢集的一部分,每一台伺服器應該知道其他伺服器的資訊。使用者可以從“server.id=host:port:port” 中讀取到相關資訊。在伺服器的data(dataDir參數所指定的目錄)下建立一個檔案名為myid的檔案,這個檔案的内容隻有一行,指定的是自身的id值。比如,伺服器“1”應該在myid檔案中寫入“1”。這個id必須在叢集環境中伺服器辨別中是唯一的,且大小在1~255之間。這一樣配置中,zoo1代表第一台伺服器的IP位址。第一個端口号(port)是從follower連接配接到leader機器的端口,第二個端口是用來進行leader選舉時所用的端口。是以,在叢集配置過程中有三個非常重要的端口:clientPort:2181、port:2888、port:3888。

  • 僞叢集模式

    僞叢集模式就是在單機環境下模拟叢集的Zookeeper服務。

    在zookeeper叢集配置檔案中,clientPort參數用來設定用戶端連接配接zookeeper伺服器的端口。server.1=IP1:2888:3888中,IP1指的是組成Zookeeper伺服器的IP位址,2888為組成zookeeper伺服器之間的通信端口,3888為用來選舉leader的端口。由于僞叢集模式中,我們使用的是同一台伺服器,也就是說,需要在單台機器上運作多個zookeeper執行個體,是以我們必須要保證多個zookeeper執行個體的配置檔案的client端口不能沖突。

    下面簡單介紹一下如何在單台機器上建立僞叢集模式。首先将zookeeper-3.4.9.tar.gz分别解壓到server1,server2,server3目錄下:

tar -zxvf zookeeper-

3.4

.

9

.tar.gz  /home/jxwch/server1

tar -zxvf zookeeper-

3.4

.

9

.tar.gz /home/jxwch/server2

tar -zxvf zookeeper-

3.4

.

9

.tar.gz /home/jxwch/server3

    然後在server1/data/目錄下建立檔案myid檔案并寫入“1”,同樣在server2/data/,目錄下建立檔案myid并寫入“2”,server3進行同樣的操作。

    下面分别展示在server1/conf/、server2/conf/、server3/conf/目錄下的zoo.cfg檔案:

    server1/conf/zoo.cfg檔案

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料
# Server 1
# The number of milliseconds of each tick
# 伺服器與用戶端之間互動的基本時間單元(ms)
tickTime=2000

# The number of ticks that the initial 
# synchronization phase can take
# 此配置表示允許follower連接配接并同步到leader的初始化時間,它以tickTime的倍數來表示。當超過設定倍數的tickTime時間,則連接配接失敗。
initLimit=10

# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
# Leader伺服器與follower伺服器之間資訊同步允許的最大時間間隔,如果超過次間隔,預設follower伺服器與leader伺服器之間斷開連結
syncLimit=5

# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
# 儲存zookeeper資料,日志路徑
dataDir=/home/jxwch/server1/data
dataLogDir=/home/jxwch/server1/dataLog

# the port at which the clients will connect
# 用戶端與zookeeper互相互動的端口
clientPort=2181
server.1= 127.0.0.1:2888:3888
server.2= 127.0.0.1:2889:3889
server.3= 127.0.0.1:2890:3890

#server.A=B:C:D  其中A是一個數字,代表這是第幾号伺服器;B是伺服器的IP位址;C表示伺服器與群集中的“上司者”交換資訊的端口;當上司者失效後,D表示用來執行選舉時伺服器互相通信的端口。

# the maximum number of client connections.
# increase this if you need to handle more clients
# 限制連接配接到zookeeper伺服器用戶端的數量
maxClientCnxns=60

#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1      
ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

    server2/conf/zoo.cfg檔案

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料
# Server 2
# The number of milliseconds of each tick
# 伺服器與用戶端之間互動的基本時間單元(ms)
tickTime=2000

# The number of ticks that the initial 
# synchronization phase can take
# zookeeper所能接受的用戶端數量
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.
# 儲存zookeeper資料,日志路徑
dataDir=/home/jxwch/server2/data
dataLogDir=/home/jxwch/server2/dataLog

# the port at which the clients will connect
# 用戶端與zookeeper互相互動的端口
clientPort=2182
server.1= 127.0.0.1:2888:3888
server.2= 127.0.0.1:2889:3889
server.3= 127.0.0.1:2890:3890

#server.A=B:C:D  其中A是一個數字,代表這是第幾号伺服器;B是伺服器的IP位址;C表示伺服器與群集中的“上司者”交換資訊的端口;當上司者失效後,D表示用來執行選舉時伺服器互相通信的端口。

# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1      
ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

    server3/conf/zoo.cfg檔案

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料
# Server 3
# The number of milliseconds of each tick
# 伺服器與用戶端之間互動的基本時間單元(ms)
tickTime=2000

# The number of ticks that the initial 
# synchronization phase can take
# zookeeper所能接受的用戶端數量
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.
# 儲存zookeeper資料,日志路徑
dataDir=/home/jxwch/server3/data
dataLogDir=/home/jxwch/server3/dataLog

# the port at which the clients will connect
# 用戶端與zookeeper互相互動的端口
clientPort=2183
server.1= 127.0.0.1:2888:3888
server.2= 127.0.0.1:2889:3889
server.3= 127.0.0.1:2890:3890

#server.A=B:C:D  其中A是一個數字,代表這是第幾号伺服器;B是伺服器的IP位址;C表示伺服器與群集中的“上司者”交換資訊的端口;當上司者失效後,D表示用來執行選舉時伺服器互相通信的端口。

# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1      
ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

  從上述三個代碼清單可以發現,除了clientPort不同之外,dataDir和dataLogDir也不同。另外,不要忘記dataDir所對應的目錄中建立的myid檔案來指定對應的zookeeper伺服器執行個體。

Zookeeper僞叢集模式運作

  當上述僞叢集環境安裝成功後就可以測試是否安裝成功啦,我們可以嘗嘗鮮:

  首先啟動server1伺服器:

cd server1/bin

bash zkServer.sh start      

  此時出現以下提示資訊,表示啟動成功:

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

  打開zookeeper.out檔案:

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料
2017-02-23 16:17:46,419 [myid:] - INFO  [main:[email protected]] - Reading configuration from: /home/jxwch/server1/bin/../conf/zoo.cfg
2017-02-23 16:17:46,496 [myid:] - INFO  [main:[email protected]] - Resolved hostname: 127.0.0.1 to address: /127.0.0.1
2017-02-23 16:17:46,496 [myid:] - INFO  [main:[email protected]] - Resolved hostname: 127.0.0.1 to address: /127.0.0.1
2017-02-23 16:17:46,497 [myid:] - INFO  [main:[email protected]] - Resolved hostname: 127.0.0.1 to address: /127.0.0.1
2017-02-23 16:17:46,497 [myid:] - INFO  [main:[email protected]] - Defaulting to majority quorums
2017-02-23 16:17:46,511 [myid:1] - INFO  [main:[email protected]] - autopurge.snapRetainCount set to 3
2017-02-23 16:17:46,511 [myid:1] - INFO  [main:[email protected]] - autopurge.purgeInterval set to 0
2017-02-23 16:17:46,511 [myid:1] - INFO  [main:[email protected]] - Purge task is not scheduled.
2017-02-23 16:17:46,525 [myid:1] - INFO  [main:[email protected]] - Starting quorum peer
2017-02-23 16:17:46,631 [myid:1] - INFO  [main:[email protected]] - binding to port 0.0.0.0/0.0.0.0:2181
2017-02-23 16:17:46,664 [myid:1] - INFO  [main:[email protected]] - tickTime set to 2000
2017-02-23 16:17:46,664 [myid:1] - INFO  [main:[email protected]] - minSessionTimeout set to -1
2017-02-23 16:17:46,664 [myid:1] - INFO  [main:[email protected]] - maxSessionTimeout set to -1
2017-02-23 16:17:46,665 [myid:1] - INFO  [main:[email protected]] - initLimit set to 10
2017-02-23 16:17:46,771 [myid:1] - INFO  [main:[email protected]] - Reading snapshot /home/jxwch/server1/data/version-2/snapshot.400000015
2017-02-23 16:17:46,897 [myid:1] - INFO  [ListenerThread:[email protected]] - My election bind port: /127.0.0.1:3888
2017-02-23 16:17:46,913 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:[email protected]] - LOOKING
2017-02-23 16:17:46,915 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:[email protected]] - New election. My id =  1, proposed zxid=0x500000026
2017-02-23 16:17:46,922 [myid:1] - INFO  [WorkerReceiver[myid=1]:[email protected]] - Notification: 1 (message format version), 1 (n.leader), 0x500000026 (n.zxid), 0x1 (n.round), LOOKING (n.state), 1 (n.sid), 0x5 (n.peerEpoch) LOOKING (my state)
2017-02-23 16:17:46,940 [myid:1] - WARN  [WorkerSender[myid=1]:[email protected]] - Cannot open channel to 2 at election address /127.0.0.1:3889
java.net.ConnectException: 拒絕連接配接
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:381)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:354)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:452)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:433)
    at java.lang.Thread.run(Thread.java:745)
2017-02-23 16:17:46,943 [myid:1] - INFO  [WorkerSender[myid=1]:[email protected]] - Resolved hostname: 127.0.0.1 to address: /127.0.0.1
2017-02-23 16:17:46,944 [myid:1] - WARN  [WorkerSender[myid=1]:[email protected]] - Cannot open channel to 3 at election address /127.0.0.1:3890
java.net.ConnectException: 拒絕連接配接
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:381)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:354)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:452)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:433)
    at java.lang.Thread.run(Thread.java:745)
2017-02-23 16:17:46,944 [myid:1] - INFO  [WorkerSender[myid=1]:[email protected]] - Resolved hostname: 127.0.0.1 to address: /127.0.0.1      
ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

    産生上述兩條Waring資訊是因為zookeeper服務的每個執行個體都擁有全局的配置資訊,他們在啟動的時候需要随時随地的進行leader選舉,此時server1就需要和其他兩個zookeeper執行個體進行通信,但是,另外兩個zookeeper執行個體還沒有啟動起來,是以将會産生上述所示的提示資訊。當我們用同樣的方式啟動server2和server3後就不會再有這樣的警告資訊了。

    當三台伺服器均成功啟動後切換至server1/bin/目錄下執行以下指令:

bash zkServer.sh status      

    終端出現以下提示資訊:

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

    說明server1伺服器此時處于follower模式,同樣切換至server2/bin目錄下執行相同的指令,傳回如下結果:

ZooKeeper的安裝與部署 zk周遊所有子節點樹 二、下載下傳 三、目錄 四、單機模式 五、叢集模式 參考資料

    說明server2被選舉為leader。

參考資料

  • Zookeeper系列之三:zookeeper的安裝
  • Zookeeper系列之五:zookeeper的運作

繼續閱讀