1. 程式人生 > >zookeeper 叢集搭建

zookeeper 叢集搭建

  通過 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

3、安裝JDK

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 配置保持一致。