經過 VMware ,咱們安裝了三臺虛擬機,用來搭建 zookeeper 集羣,虛擬機網絡地址以下:html
hostname ipaddress subnet mask geteway 數據庫
一、 master 192.168.146.200 255.255.255.0 192.168.146.2apache
二、 slave1 192.168.146.201 255.255.255.0 192.168.146.2vim
三、 slave2 192.168.146.202 255.255.255.0 192.168.146.2服務器
在搭建 zookeeper 集羣以前,咱們首先要明白爲何要選擇三臺機器搭建,2臺不能夠嗎?4臺不能夠嗎?網絡
zookeeper 集羣一般是用來對用戶的分佈式應用程序提供協調服務的,爲了保證數據的一致性,對 zookeeper 集羣進行了這樣三種角色劃分:leader、follower、observer分別對應着總統、議員和觀察者。session
總統(leader):負責進行投票的發起和決議,更新系統狀態。分佈式
議員(follower):用於接收客戶端請求並向客戶端返回結果以及在選舉過程當中參與投票。性能
觀察者(observer):也能夠接收客戶端鏈接,將寫請求轉發給leader節點,可是不參與投票過程,只同步leader的狀態。一般對查詢操做作負載。spa
咱們知道,在每臺機器數據保持一致的狀況下,zookeeper集羣能夠保證,客戶端發起的每次查詢操做,集羣節點都能返回一樣的結果。
可是對於客戶端發起的修改、刪除等能改變數據的操做呢?集羣中那麼多臺機器,你修改你的,我修改個人,最後返回集羣中哪臺機器的數據呢?
這就是人心渙散,須要一個領導,因而在zookeeper集羣中,leader的做用就體現出來了,只有leader節點纔有權利發起修改數據的操做,而follower節點即便接收到了客戶端發起的修改操做,也要將其轉交給leader來處理,leader接收到修改數據的請求後,會向全部follower廣播一條消息,讓他們執行某項操做,follower 執行完後,便會向 leader 回覆執行完畢。當 leader 收到半數以上的 follower 的確認消息,便會斷定該操做執行完畢,而後向全部 follower 廣播該操做已經生效。
因此zookeeper集羣中leader是不可缺乏的,可是 leader 節點是怎麼產生的呢?其實就是由全部follower 節點選舉產生的,講究民主嘛,並且leader節點只能有一個,畢竟一個國家不能有多個總統。
這個時候回到咱們的小標題,爲何 zookeeper 節點數是奇數,咱們下面來一一來講明:
①、容錯率
首先從容錯率來講明:(須要保證集羣可以有半數進行投票)
2臺服務器,至少2臺正常運行才行(2的半數爲1,半數以上最少爲2),正常運行1臺服務器都不容許掛掉,可是相對於 單節點服務器,2臺服務器還有兩個單點故障,因此直接排除了。
3臺服務器,至少2臺正常運行才行(3的半數爲1.5,半數以上最少爲2),正常運行能夠容許1臺服務器掛掉
4臺服務器,至少3臺正常運行才行(4的半數爲2,半數以上最少爲3),正常運行能夠容許1臺服務器掛掉
5臺服務器,至少3臺正常運行才行(5的半數爲2.5,半數以上最少爲3),正常運行能夠容許2臺服務器掛掉
②、防腦裂
腦裂集羣的腦裂一般是發生在節點之間通訊不可達的狀況下,集羣會分裂成不一樣的小集羣,小集羣各自選出本身的leader節點,致使原有的集羣出現多個leader節點的狀況,這就是腦裂。
3臺服務器,投票選舉半數爲1.5,一臺服務裂開,和另外兩臺服務器沒法通行,這時候2臺服務器的集羣(2票大於半數1.5票),因此能夠選舉出leader,而 1 臺服務器的集羣沒法選舉。
4臺服務器,投票選舉半數爲2,能夠分紅 1,3兩個集羣或者2,2兩個集羣,對於 1,3集羣,3集羣能夠選舉;對於2,2集羣,則不能選擇,形成沒有leader節點。
5臺服務器,投票選舉半數爲2.5,能夠分紅1,4兩個集羣,或者2,3兩集羣,這兩個集羣分別都只能選舉一個集羣,知足zookeeper集羣搭建數目。
以上分析,咱們從容錯率以及防止腦裂兩方面說明了3臺服務器是搭建集羣的最少數目,4臺發生腦裂時會形成沒有leader節點的錯誤。
官網下載地址:http://mirror.bit.edu.cn/apache/zookeeper/
因爲zookeeper集羣的運行須要Java運行環境,因此須要首先安裝 JDK,關於安裝步驟,我在前面博客介紹過:http://www.javashuo.com/article/p-kweccecc-bu.html
在 /usr/local 目錄下新建 software 目錄,而後將 zookeeper 壓縮文件上傳到該目錄中,而後經過以下命令解壓。
tar -zxvf zookeeper-3.3.6.tar.gz
將zookeeper壓縮文件解壓後,咱們進入到 conf 目錄:
將 zoo_sample.cfg 文件複製並重命名爲 zoo.cfg 文件。
cp zoo_sample.cfg zoo.cfg
而後經過 vim zoo.cfg 命令對該文件進行修改:
上面紅色框住的內容便是咱們修改的內容:
①、tickTime:基本事件單元,這個時間是做爲Zookeeper服務器之間或客戶端與服務器之間維持心跳的時間間隔,每隔tickTime時間就會發送一個心跳;最小 的session過時時間爲2倍tickTime
②、dataDir:存儲內存中數據庫快照的位置,除非另有說明,不然指向數據庫更新的事務日誌。注意:應該謹慎的選擇日誌存放的位置,使用專用的日誌存儲設備可以大大提升系統的性能,若是將日誌存儲在比較繁忙的存儲設備上,那麼將會很大程度上影像系統性能。
③、client:監聽客戶端鏈接的端口。
④、initLimit:容許follower鏈接並同步到Leader的初始化鏈接時間,以tickTime爲單位。當初始化鏈接時間超過該值,則表示鏈接失敗。
⑤、syncLimit:表示Leader與Follower之間發送消息時,請求和應答時間長度。若是follower在設置時間內不能與leader通訊,那麼此follower將會被丟棄。
⑥、server.A=B:C:D
A:其中 A 是一個數字,表示這個是服務器的編號;
B:是這個服務器的 ip 地址;
C:Leader選舉的端口;
D:Zookeeper服務器之間的通訊端口。
咱們須要修改的第一個是 dataDir ,在指定的位置處建立好目錄。
第二個須要新增的是 server.A=B:C:D 配置,其中 A 對應下面咱們即將介紹的myid 文件。B是集羣的各個IP地址,C:D 是端口配置。
在 上一步 dataDir 指定的目錄下,建立 myid 文件。
而後在該文件添加上一步 server 配置的對應 A 數字。
好比咱們上面的配置:
dataDir=/usr/local/software/zookeeper-3.3.6/data
而後下面配置是:
server.0=192.168.146.200:2888:3888 server.1=192.168.146.201:2888:3888 server.2=192.168.146.202:2888:3888
那麼就必須在 192.168.146.200 機器的的 /usr/local/software/zookeeper-3.3.6/data 目錄下建立 myid 文件,而後在該文件中寫上 0 便可。
後面的機器依次在相應目錄建立myid文件,寫上相應配置數字便可。
爲了可以在任意目錄啓動zookeeper集羣,咱們須要配置環境變量。
ps:你也能夠不配,這不是搭建集羣的必要操做,只不過若是你不配置環境變量,那麼每次啓動zookeeper須要到安裝文件的 bin 目錄下去啓動。
首先進入到 /etc/profile 目錄,添加相應的配置信息:
#set zookeeper environment export ZK_HOME=/usr/local/software/zookeeper-3.3.6 export PATH=$PATH:$ZK_HOME/bin
而後經過以下命令使得環境變量生效:
source /etc/profle
啓動命令:
zkServer.sh start
中止命令:
zkServer.sh stop
重啓命令:
zkServer.sh restart
查看集羣節點狀態:
zkServer.sh status
咱們分別對集羣三臺機器執行啓動命令。執行完畢後,分別查看集羣節點狀態:
出現以下便是集羣搭建成功:
三臺機器,slave1 成功的經過了選舉稱爲了leader,而剩下的兩臺成爲了 follower。這時候,若是你將slave1關掉,會發現剩下兩臺又會有一臺變成了 leader節點。
若是沒有出現上面的狀態,說明搭建過程出了問題,那麼解決問題的首先就是查看日誌文件:
zookeeper 日誌文件目錄在:
dataDir 配置的目錄下,文件名稱爲:zookeeper.out。經過查看日誌來解決相應的問題。下面是兩種常見的問題:
①、防火牆爲關閉
查看防火牆狀態:
service iptables status
關閉防火牆:
chkconfig iptables off
②、dataDir 配置的目錄沒有建立
在 zoo.cfg 文件中,會有對 dataDir 的一項配置,須要建立該目錄,而且注意要在該目錄下建立 myid 文件,裏面的配置和 zoo.cfg 的server.x 配置保持一致。