因為公司的業務發展,需要搭建codis叢集(一個由國内豌豆莢開發的redis叢集解決方案),但是codis叢集是依賴與zookeeper叢集的。是以這篇文章,我們主要介紹有關zookeeper叢集的搭建。
zookeeper是一個分布式的開源架構,它能很好的管理叢集,而且提供協調分布式應用的基本服務。
它向外部應用暴露一組通用服務——分布式同步(distributed synchronization)、命名服務(naming service)、叢集維護(group maintenance)等,簡化分布式應用協調及其管理的難度,提供高性能的分布式服務。
zookeeper本身可以以standalone模式(單節點狀态)安裝運作,不過它的長處在于通過分布式zookeeper叢集(一個leader,多個follower),基于一定的政策來保證zookeeper叢集的穩定性和可用性,進而實作分布式應用的可靠性。
zookeeper叢集中主要有兩個角色:leader和follower。
上司者(leader),用于負責進行投票的發起和決議,更新系統狀态。
學習者(learner),包括跟随者(follower)和觀察者(observer)。
其中follower用于接受用戶端請求并想用戶端傳回結果,在選主過程中參與投票。
而observer可以接受用戶端連接配接,将寫請求轉發給leader,但observer不參加投票過程,隻同步leader的狀态,observer的目的是為了擴充系統,提高讀取速度。
一個zookeeper叢集需要運作幾個zookeeper節點呢?
你可以運作一個zookeeper節點,但那就不是叢集了。如果要運作zookeeper叢集的話,最好部署3,5,7個zookeeper節點。本次實驗我們是以3個節點進行的。
zookeeper節點部署的越多,服務的可靠性也就越高。當然建議最好是部署奇數個,偶數個不是不可以。但是zookeeper叢集是以當機個數過半才會讓整個叢集當機的,是以奇數個叢集更佳。
你需要給每個zookeeper 1g左右的記憶體,如果可能的話,最好有獨立的磁盤,因為獨立磁盤可以確定zookeeper是高性能的。如果你的叢集負載很重,不要把zookeeper和regionserver運作在同一台機器上面,就像datanodes和tasktrackers一樣。
ps:本次實驗所使用的os有centos6、centos7和ubuntu15,如下:

為什麼本次實驗會使用到兩種三個不同的os,主要是剛好趁這個機會學習下最新的os。
zookeeper介紹完畢後,我們現在就來安裝zookeeper。而zookeeper運作需要java的支援,是以我們要首先安裝jdk。
注意:zookeeper、jdk需要在每台伺服器上都要安裝和運作。
如果是centos系統,使用如下指令安裝jdk:
yum search jdk
yum -y install java-1.6.0-openjdk
如果是ubuntu系統,使用如下指令安裝jdk:
apt-cache search jdk |grep openjdk
apt-get -y install java-1.6.0-openjdk
jdk安裝完畢後,我們來檢視下java版本,使用如下指令:
java -version
zookeeper的安裝很簡單,我們隻需要下載下傳zookeeper壓縮包,然後解壓、配置、執行就可以了。如下:
zookeeper下載下傳完畢後,我們進行如下操作:
tar -c /usr/local/ -xf zookeeper-3.4.8.tar.gz
cd /usr/local/
mv zookeeper-3.4.8 zookeeper
chown root:root -r zookeeper/
cd zookeeper
cp conf/zoo_sample.cfg conf/zoo.cfg
把zookeeper加入到環境變量,如下:
vim /etc/profile
export path=$path:/usr/local/zookeeper/bin
執行source指令使剛剛修改的環境生效,如下:
source /etc/profile
env
現在我們在其中任意一台伺服器上啟動zookeeper,使用如下指令:
bin/zkserver.sh start
檢視zookeeper端口、狀态和zookeeper日志,如下:
netstat -tunlp
bin/zkserver.sh status
cat zookeeper.out
通過上圖,我們可以很明顯的看到zookeeper監聽的是tcp的2181端口,是以standalone單機模式運作的,而且通過zookeeper日志也可以看到目前zookeeper是正常運作的。
zookeeper搭建完畢後,我們現在來配置zookeeper叢集。
注意:在搭建zookeeper叢集時,一定要停止已經啟動的zookeeper。
zookeeper叢集的搭建很簡單,我們隻需要修改每台伺服器的zoo.cfg配置檔案然後進行相關的操作即可。
先來修改zookeeper的配置檔案zoo.cfg,如下:
vim /usr/local/zookeeper/conf/zoo.cfg
ticktime=2000
initlimit=10
synclimit=5
clientport=2181
datalogdir=/usr/local/zookeeper/logs
datadir=/usr/local/zookeeper/data
server.1= 192.168.1.9:2888:3888
server.2= 192.168.1.124:2888:3888
server.3= 192.168.1.231:2888:3888
配置檔案參數說明:
ticktime這個時間是作為zookeeper伺服器之間或用戶端與伺服器之間維持心跳的時間間隔,也就是說每個ticktime時間就會發送一個心跳。
initlimit這個配置項是用來配置zookeeper接受用戶端(這裡所說的用戶端不是使用者連接配接zookeeper伺服器的用戶端,而是zookeeper伺服器叢集中連接配接到leader的follower 伺服器)初始化連接配接時最長能忍受多少個心跳時間間隔數。
當已經超過10個心跳的時間(也就是ticktime)長度後 zookeeper 伺服器還沒有收到用戶端的傳回資訊,那麼表明這個用戶端連接配接失敗。總的時間長度就是 10*2000=20秒。
synclimit這個配置項辨別leader與follower之間發送消息,請求和應答時間長度,最長不能超過多少個ticktime的時間長度,總的時間長度就是5*2000=10秒。
datadir顧名思義就是zookeeper儲存資料的目錄,預設情況下zookeeper将寫資料的日志檔案也儲存在這個目錄裡;
clientport這個端口就是用戶端連接配接zookeeper伺服器的端口,zookeeper會監聽這個端口接受用戶端的通路請求;
server.a=b:c:d中的a是一個數字,表示這個是第幾号伺服器,b是這個伺服器的ip位址,c第一個端口用來叢集成員的資訊交換,表示這個伺服器與叢集中的leader伺服器交換資訊的端口,d是在leader挂掉時專門用來進行選舉leader所用的端口。
配置檔案修改完畢後,我們來建立zookeeper資料目錄和日志目錄,使用如下指令:
mkdir -p /usr/local/zookeeper/logs
mkdir -p /usr/local/zookeeper/data
除了修改zoo.cfg配置檔案外,zookeeper叢集模式下還要配置一個myid檔案,這個檔案需要放在datadir目錄下。
這個檔案裡面有一個資料就是a的值(該a就是zoo.cfg檔案中server.a=b:c:d中的a),在zoo.cfg檔案中配置的datadir路徑中建立myid檔案。
在192.168.1.9伺服器上建立myid檔案,并設定為1,同時與zoo.cfg檔案裡面的server.1對應,如下:
echo “1” > /usr/local/zookeeper/data/myid
在192.168.1.124伺服器上建立myid檔案,并設定為2,同時與zoo.cfg檔案裡面的server.2對應,如下:
echo “2” > /usr/local/zookeeper/data/myid
在192.168.1.231伺服器上建立myid檔案,并設定為3,同時與zoo.cfg檔案裡面的server.3對應,如下:
echo “3” > /usr/local/zookeeper/data/myid
經過第三章節配置,在每台伺服器上都操作完畢後,我們現在來啟動每台伺服器上的zookeeper。如下:
cd /usr/local/zookeeper
注意:在啟動第一台zookeeper的時候可能會報錯,等三台zookeeper全部啟動完成之後就不會報錯了。
zookeeper啟動完畢後,我們來檢視各個伺服器上zookeeper的狀态。如下:
通過上述三幅圖,我們可以很明顯的看出192.168.1.9和192.168.1.124這兩台伺服器zookeeper的狀态是follow模式,192.168.1.231這台伺服器zookeeper的狀态是leader模式。
這說明zookeeper叢集已經成功搭建。
zookeeper叢集搭建完畢後,我們可以通過用戶端腳本,連接配接到zookeeper叢集上。
對于用戶端來說,zookeeper叢集是一個整體,連接配接到zookeeper叢集實際上感覺在獨享整個叢集的服務,是以,你可以在任何一個結點上建立到服務叢集的連接配接,例如:
bin/zkcli.sh -server 192.168.1.9:2181
通過上圖,我們可以很明顯的看出在192.168.1.124這台機器上連接配接192.168.1.9伺服器上的zookeeper是正常的,而且目前根路徑為/zookeeper。
到此有關zookeeper叢集搭建就完全結束。