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:

s100連接配接s101:
其實不用那麼麻煩,上面還可用下述方法:
-----
-------------
zk.getData();注冊觀察者,監聽zk節點資料的改變。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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包含以下的檔案和目錄:
圖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叢集。
參考資料
- 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
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Zookeeper安裝
zookeeper的安裝分為三種模式:單機模式、叢集模式和僞叢集模式。
- 單機模式
首先,從Apache官網下載下傳一個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配置檔案的參數設定不同,使用者可以參考下面的配置:
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
在這個配置檔案中,新出現的語句的含義:
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目錄下:
|
然後在server1/data/目錄下建立檔案myid檔案并寫入“1”,同樣在server2/data/,目錄下建立檔案myid并寫入“2”,server3進行同樣的操作。
下面分别展示在server1/conf/、server2/conf/、server3/conf/目錄下的zoo.cfg檔案:
server1/conf/zoo.cfg檔案
# 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
server2/conf/zoo.cfg檔案
# 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
server3/conf/zoo.cfg檔案
# 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
從上述三個代碼清單可以發現,除了clientPort不同之外,dataDir和dataLogDir也不同。另外,不要忘記dataDir所對應的目錄中建立的myid檔案來指定對應的zookeeper伺服器執行個體。
Zookeeper僞叢集模式運作
當上述僞叢集環境安裝成功後就可以測試是否安裝成功啦,我們可以嘗嘗鮮:
首先啟動server1伺服器:
cd server1/bin
bash zkServer.sh start
此時出現以下提示資訊,表示啟動成功:
打開zookeeper.out檔案:
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
産生上述兩條Waring資訊是因為zookeeper服務的每個執行個體都擁有全局的配置資訊,他們在啟動的時候需要随時随地的進行leader選舉,此時server1就需要和其他兩個zookeeper執行個體進行通信,但是,另外兩個zookeeper執行個體還沒有啟動起來,是以将會産生上述所示的提示資訊。當我們用同樣的方式啟動server2和server3後就不會再有這樣的警告資訊了。
當三台伺服器均成功啟動後切換至server1/bin/目錄下執行以下指令:
bash zkServer.sh status
終端出現以下提示資訊:
說明server1伺服器此時處于follower模式,同樣切換至server2/bin目錄下執行相同的指令,傳回如下結果:
說明server2被選舉為leader。
參考資料
- Zookeeper系列之三:zookeeper的安裝
- Zookeeper系列之五:zookeeper的運作