通過 VMware ,我們安裝了三臺虛擬機,用來搭建 zookeeper 集羣,虛擬機網絡地址如下:
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 集羣通常是用來對用戶的分佈式應用程序提供協調服務的,爲了保證數據的一致性,對 zookeeper 集羣進行了這樣三種角色劃分:leader、follower、observer分別對應着總統、議員和觀察者。
總統(leader):負責進行投票的發起和決議,更新系統狀態。
議員(follower):用於接收客戶端請求並向客戶端返回結果以及在選舉過程中參與投票。
觀察者(observer):也可以接收客戶端連接,將寫請求轉發給leader節點,但是不參與投票過程,只同步leader的狀態。通常對查詢操作做負載。
1、爲什麼zookeeper節點是奇數?
我們知道,在每臺機器數據保持一致的情況下,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節點的錯誤。
2、下載 zookeeper
官網下載地址:http://mirror.bit.edu.cn/apache/zookeeper/
3、安裝JDK
由於zookeeper集羣的運行需要Java運行環境,所以需要首先安裝 JDK,關於安裝步驟,我在前面博客介紹過:https://www.cnblogs.com/ysocean/p/6952166.html
4、解壓 zookeeper
在 /usr/local 目錄下新建 software 目錄,然後將 zookeeper 壓縮文件上傳到該目錄中,然後通過如下命令解壓。
tar -zxvf zookeeper-3.3.6.tar.gz
6、修改配置文件 zoo.cfg
將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 是端口配置。
7、創建 myid 文件
在 上一步 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文件,寫上相應配置數字即可。
8、配置環境變量
爲了能夠在任意目錄啓動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
9、啓動zookeeper服務
啓動命令:
zkServer.sh start
停止命令:
zkServer.sh stop
重啓命令:
zkServer.sh restart
查看集羣節點狀態:
zkServer.sh status
我們分別對集羣三臺機器執行啓動命令。執行完畢後,分別查看集羣節點狀態:
出現如下即是集羣搭建成功:
三臺機器,slave1 成功的通過了選舉稱爲了leader,而剩下的兩臺成爲了 follower。這時候,如果你將slave1關掉,會發現剩下兩臺又會有一臺變成了 leader節點。
10、搭建問題
如果沒有出現上面的狀態,說明搭建過程出了問題,那麼解決問題的首先就是查看日誌文件:
zookeeper 日誌文件目錄在:
dataDir 配置的目錄下,文件名稱爲:zookeeper.out。通過查看日誌來解決相應的問題。下面是兩種常見的問題:
①、防火牆爲關閉
查看防火牆狀態:
service iptables status
關閉防火牆:
chkconfig iptables off
②、dataDir 配置的目錄沒有創建
在 zoo.cfg 文件中,會有對 dataDir 的一項配置,需要創建該目錄,並且注意要在該目錄下創建 myid 文件,裏面的配置和 zoo.cfg 的server.x 配置保持一致。