通過 VMware ,我們安裝了三臺虛擬機,用來搭建 zookeeper 集群,虛擬機網(wǎng)絡(luò)地址如下:
hostname ipaddress subnet mask geteway
1、 master 192.168.146.200 255.255.255.0 192.168.146.2
2、 slave1 192.168.146.201 255.255.255.0 192.168.146.2
3、 slave2 192.168.146.202 255.255.255.0 192.168.146.2
在搭建 zookeeper 集群之前,我們首先要明白為什么要選擇三臺機器搭建,2臺不可以嗎?4臺不可以嗎?
zookeeper 集群通常是用來對用戶的分布式應(yīng)用程序提供協(xié)調(diào)服務(wù)的,為了保證數(shù)據(jù)的一致性,對 zookeeper 集群進行了這樣三種角色劃分:leader、follower、observer分別對應(yīng)著總統(tǒng)、議員和觀察者。
總統(tǒng)(leader):負責(zé)進行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)。
議員(follower):用于接收客戶端請求并向客戶端返回結(jié)果以及在選舉過程中參與投票。
觀察者(observer):也可以接收客戶端連接,將寫請求轉(zhuǎn)發(fā)給leader節(jié)點,但是不參與投票過程,只同步leader的狀態(tài)。通常對查詢操作做負載。
1、為什么zookeeper節(jié)點是奇數(shù)?
我們知道,在每臺機器數(shù)據(jù)保持一致的情況下,zookeeper集群可以保證,客戶端發(fā)起的每次查詢操作,集群節(jié)點都能返回同樣的結(jié)果。
但是對于客戶端發(fā)起的修改、刪除等能改變數(shù)據(jù)的操作呢?集群中那么多臺機器,你修改你的,我修改我的,最后返回集群中哪臺機器的數(shù)據(jù)呢?
這就是一盤散沙,需要一個領(lǐng)導(dǎo),于是在zookeeper集群中,leader的作用就體現(xiàn)出來了,只有l(wèi)eader節(jié)點才有權(quán)利發(fā)起修改數(shù)據(jù)的操作,而follower節(jié)點即使接收到了客戶端發(fā)起的修改操作,也要將其轉(zhuǎn)交給leader來處理,leader接收到修改數(shù)據(jù)的請求后,會向所有follower廣播一條消息,讓他們執(zhí)行某項操作,follower 執(zhí)行完后,便會向 leader 回復(fù)執(zhí)行完畢。當(dāng) leader 收到半數(shù)以上的 follower 的確認消息,便會判定該操作執(zhí)行完畢,然后向所有 follower 廣播該操作已經(jīng)生效。
所以zookeeper集群中l(wèi)eader是不可缺少的,但是 leader 節(jié)點是怎么產(chǎn)生的呢?其實就是由所有follower 節(jié)點選舉產(chǎn)生的,講究民主嘛,而且leader節(jié)點只能有一個,畢竟一個國家不能有多個總統(tǒng)。
這個時候回到我們的小標(biāo)題,為什么 zookeeper 節(jié)點數(shù)是奇數(shù),我們下面來一一來說明:
①、容錯率
首先從容錯率來說明:(需要保證集群能夠有半數(shù)進行投票)
2臺服務(wù)器,至少2臺正常運行才行(2的半數(shù)為1,半數(shù)以上最少為2),正常運行1臺服務(wù)器都不允許掛掉,但是相對于 單節(jié)點服務(wù)器,2臺服務(wù)器還有兩個單點故障,所以直接排除了。
3臺服務(wù)器,至少2臺正常運行才行(3的半數(shù)為1.5,半數(shù)以上最少為2),正常運行可以允許1臺服務(wù)器掛掉
4臺服務(wù)器,至少3臺正常運行才行(4的半數(shù)為2,半數(shù)以上最少為3),正常運行可以允許1臺服務(wù)器掛掉
5臺服務(wù)器,至少3臺正常運行才行(5的半數(shù)為2.5,半數(shù)以上最少為3),正常運行可以允許2臺服務(wù)器掛掉
②、防腦裂
腦裂集群的腦裂通常是發(fā)生在節(jié)點之間通信不可達的情況下,集群會分裂成不同的小集群,小集群各自選出自己的leader節(jié)點,導(dǎo)致原有的集群出現(xiàn)多個leader節(jié)點的情況,這就是腦裂。
3臺服務(wù)器,投票選舉半數(shù)為1.5,一臺服務(wù)裂開,和另外兩臺服務(wù)器無法通行,這時候2臺服務(wù)器的集群(2票大于半數(shù)1.5票),所以可以選舉出leader,而 1 臺服務(wù)器的集群無法選舉。
4臺服務(wù)器,投票選舉半數(shù)為2,可以分成 1,3兩個集群或者2,2兩個集群,對于 1,3集群,3集群可以選舉;對于2,2集群,則不能選擇,造成沒有l(wèi)eader節(jié)點。
5臺服務(wù)器,投票選舉半數(shù)為2.5,可以分成1,4兩個集群,或者2,3兩集群,這兩個集群分別都只能選舉一個集群,滿足zookeeper集群搭建數(shù)目。
以上分析,我們從容錯率以及防止腦裂兩方面說明了3臺服務(wù)器是搭建集群的最少數(shù)目,4臺發(fā)生腦裂時會造成沒有l(wèi)eader節(jié)點的錯誤。
2、下載 zookeeper
官網(wǎng)下載地址:http://mirror.bit.edu.cn/apache/zookeeper/
3、安裝JDK
由于zookeeper集群的運行需要Java運行環(huán)境,所以需要首先安裝 JDK
4、解壓 zookeeper
在 /usr/local 目錄下新建 software 目錄,然后將 zookeeper 壓縮文件上傳到該目錄中,然后通過如下命令解壓。
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">tar -zxvf zookeeper-3.3.6.tar.gz</pre>
6、修改配置文件 zoo.cfg
將zookeeper壓縮文件解壓后,我們進入到 conf 目錄:

將 zoo_sample.cfg 文件復(fù)制并重命名為 zoo.cfg 文件。
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">cp zoo_sample.cfg zoo.cfg</pre>
然后通過 vim zoo.cfg 命令對該文件進行修改:

上面紅色框住的內(nèi)容即是我們修改的內(nèi)容:
①、tickTime:基本事件單元,這個時間是作為Zookeeper服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時間間隔,每隔tickTime時間就會發(fā)送一個心跳;最小 的session過期時間為2倍tickTime
②、dataDir:存儲內(nèi)存中數(shù)據(jù)庫快照的位置,除非另有說明,否則指向數(shù)據(jù)庫更新的事務(wù)日志。注意:應(yīng)該謹慎的選擇日志存放的位置,使用專用的日志存儲設(shè)備能夠大大提高系統(tǒng)的性能,如果將日志存儲在比較繁忙的存儲設(shè)備上,那么將會很大程度上影像系統(tǒng)性能。
③、client:監(jiān)聽客戶端連接的端口。
④、initLimit:允許follower連接并同步到Leader的初始化連接時間,以tickTime為單位。當(dāng)初始化連接時間超過該值,則表示連接失敗。
⑤、syncLimit:表示Leader與Follower之間發(fā)送消息時,請求和應(yīng)答時間長度。如果follower在設(shè)置時間內(nèi)不能與leader通信,那么此follower將會被丟棄。
⑥、server.A=B:C:D
A:其中 A 是一個數(shù)字,表示這個是服務(wù)器的編號;
B:是這個服務(wù)器的 ip 地址;
C:Leader選舉的端口;
D:Zookeeper服務(wù)器之間的通信端口。
我們需要修改的第一個是 dataDir ,在指定的位置處創(chuàng)建好目錄。
第二個需要新增的是 server.A=B:C:D 配置,其中 A 對應(yīng)下面我們即將介紹的myid 文件。B是集群的各個IP地址,C:D 是端口配置。
7、創(chuàng)建 myid 文件
在 上一步 dataDir 指定的目錄下,創(chuàng)建 myid 文件。

然后在該文件添加上一步 server 配置的對應(yīng) A 數(shù)字。
比如我們上面的配置:
dataDir=/usr/local/software/zookeeper-3.3.6/data
然后下面配置是:
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">server.0=192.168.146.200:2888:3888 server.1=192.168.146.201:2888:3888 server.2=192.168.146.202:2888:3888</pre>
那么就必須在 192.168.146.200 機器的的 /usr/local/software/zookeeper-3.3.6/data 目錄下創(chuàng)建 myid 文件,然后在該文件中寫上 0 即可。

后面的機器依次在相應(yīng)目錄創(chuàng)建myid文件,寫上相應(yīng)配置數(shù)字即可。
8、配置環(huán)境變量
為了能夠在任意目錄啟動zookeeper集群,我們需要配置環(huán)境變量。
ps:你也可以不配,這不是搭建集群的必要操作,只不過如果你不配置環(huán)境變量,那么每次啟動zookeeper需要到安裝文件的 bin 目錄下去啟動。
首先進入到 /etc/profile 目錄,添加相應(yīng)的配置信息:
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">#set zookeeper environment
export ZK_HOME=/usr/local/software/zookeeper-3.3.6 export PATH=ZK_HOME/bin</pre>
然后通過如下命令使得環(huán)境變量生效:
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">source /etc/profle</pre>
9、啟動zookeeper服務(wù)
啟動命令:
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">zkServer.sh start</pre>
停止命令:
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">zkServer.sh stop</pre>
重啟命令:
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">zkServer.sh restart</pre>
查看集群節(jié)點狀態(tài):
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">zkServer.sh status</pre>
我們分別對集群三臺機器執(zhí)行啟動命令。執(zhí)行完畢后,分別查看集群節(jié)點狀態(tài):
出現(xiàn)如下即是集群搭建成功:

三臺機器,slave1 成功的通過了選舉稱為了leader,而剩下的兩臺成為了 follower。這時候,如果你將slave1關(guān)掉,會發(fā)現(xiàn)剩下兩臺又會有一臺變成了 leader節(jié)點。
10、搭建問題
如果沒有出現(xiàn)上面的狀態(tài),說明搭建過程出了問題,那么解決問題的首先就是查看日志文件:
zookeeper 日志文件目錄在:
dataDir 配置的目錄下,文件名稱為:zookeeper.out。通過查看日志來解決相應(yīng)的問題。下面是兩種常見的問題:
①、防火墻為關(guān)閉
查看防火墻狀態(tài):
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">service iptables status</pre>
關(guān)閉防火墻:
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">chkconfig iptables off</pre>
②、dataDir 配置的目錄沒有創(chuàng)建
在 zoo.cfg 文件中,會有對 dataDir 的一項配置,需要創(chuàng)建該目錄,并且注意要在該目錄下創(chuàng)建 myid 文件,里面的配置和 zoo.cfg 的server.x 配置保持一致。
作者:YSOcean
出處:http://www.cnblogs.com/ysocean/