天天看點

zookeeper叢集搭建一、Zookeeper原理簡介二、Zookeeper安裝三、Zookeeper叢集配置四、Zookeeper叢集檢視五、Zookeeper叢集連接配接

由于公司緩存方案改進,準備采用codis叢集作為主要的緩存解決方案(codis:國内豌豆莢開發的redis叢集解決方案,已開源,github位址:https://github.com/CodisLabs/codis),codis叢集依賴于zookeeper叢集,本文介紹zookeeper叢集的實作。

zookeeper叢集搭建一、Zookeeper原理簡介二、Zookeeper安裝三、Zookeeper叢集配置四、Zookeeper叢集檢視五、Zookeeper叢集連接配接

一、Zookeeper原理簡介

ZooKeeper是一個開放源碼的分布式應用程式協調服務,它包含一個簡單的原語集,分布式應用程式可以基于它實作同步服務,配置維護和命名服務等。

Zookeeper設計目的

  • 最終一緻性:client不論連接配接到那個Server,展示給它的都是同一個視圖。
  • 可靠性:具有簡單、健壯、良好的性能、如果消息m被到一台伺服器接收,那麼消息m将被所有伺服器接收。
  • 實時性:Zookeeper保證用戶端将在一個時間間隔範圍内獲得伺服器的更新資訊,或者伺服器失效的資訊。但由于網絡延時等原因,Zookeeper不能保證兩個用戶端能同時得到剛更新的資料,如果需要最新資料,應該在讀資料之前調用sync()接口。
  • 等待無關(wait-free):慢的或者失效的client不得幹預快速的client的請求,使得每個client都能有效的等待。
  • 原子性:更新隻能成功或者失敗,沒有中間狀态。
  • 順序性:包括全局有序和偏序兩種:全局有序是指如果在一台伺服器上消息a在消息b前釋出,則在所有Server上消息a都将在消息b前被釋出;偏序是指如果一個消息b在消息a後被同一個發送者釋出,a必将排在b前面。

Zookeeper工作原理

1、在zookeeper的叢集中,各個節點共有下面3種角色和4種狀态:

角色:leader,follower,observer

狀态:leading,following,observing,looking

Zookeeper的核心是原子廣播,這個機制保證了各個Server之間的同步。實作這個機制的協定叫做Zab協定(ZooKeeper Atomic Broadcast protocol)。Zab協定有兩種模式,它們分别是恢複模式(Recovery選主)和廣播模式(Broadcast同步)。當服務啟動或者在上司者崩潰後,Zab就進入了恢複模式,當上司者被選舉出來,且大多數Server完成了和leader的狀态同步以後,恢複模式就結束了。狀态同步保證了leader和Server具有相同的系統狀态。

為了保證事務的順序一緻性,zookeeper采用了遞增的事務id号(zxid)來辨別事務。所有的提議(proposal)都在被提出的時候加上了zxid。實作中zxid是一個64位的數字,它高32位是epoch用來辨別leader關系是否改變,每次一個leader被選出來,它都會有一個新的epoch,辨別目前屬于那個leader的統治時期。低32位用于遞增計數。

每個Server在工作過程中有4種狀态:

LOOKING:目前Server不知道leader是誰,正在搜尋。

LEADING:目前Server即為選舉出來的leader。

FOLLOWING:leader已經選舉出來,目前Server與之同步。

OBSERVING:observer的行為在大多數情況下與follower完全一緻,但是他們不參加選舉和投票,而僅僅接受(observing)選舉和投票的結果。

Zookeeper叢集節點

  • Zookeeper節點部署越多,服務的可靠性越高,建議部署奇數個節點,因為zookeeper叢集是以當機個數過半才會讓整個叢集當機的。
  • 需要給每個zookeeper 1G左右的記憶體,如果可能的話,最好有獨立的磁盤,因為獨立磁盤可以確定zookeeper是高性能的。如果你的叢集負載很重,不要把zookeeper和RegionServer運作在同一台機器上面,就像DataNodes和TaskTrackers一樣。

實驗環境

主機名 系統 IP位址
linux-node1 CentOS release 6.8 192.168.1.148
linux-node2 CentOS release 6.8 192.168.1.149
linux-node2 CentOS release 6.8 192.168.1.150

二、Zookeeper安裝

Zookeeper運作需要java環境,需要安裝jdk,注:每台伺服器上面都需要安裝zookeeper、jdk,建議本地下載下傳好需要的安裝包然後上傳到伺服器上面,伺服器上面下載下傳速度太慢。

2.1、JDK安裝

JDK下載下傳位址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

rpm -ivh jdk-8u101-linux-x64.rpm      
zookeeper叢集搭建一、Zookeeper原理簡介二、Zookeeper安裝三、Zookeeper叢集配置四、Zookeeper叢集檢視五、Zookeeper叢集連接配接

2.2、Zookeeper安裝

Zookeeper連結:http://zookeeper.apache.org/

wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz -P /usr/local/src/
tar zxvf zookeeper-3.4.8.tar.gz -C /opt
cd /opt && mv zookeeper-3.4.8 zookeeper
cd zookeeper
cp conf/zoo_sample.cfg conf/zoo.cfg      

#把zookeeper加入到環境變量

echo -e "# append zk_env\nexport PATH=$PATH:/opt/zookeeper/bin" >> /etc/profile      

三、Zookeeper叢集配置

注意:搭建zookeeper叢集時,一定要先停止已經啟動的zookeeper節點。

3.1、Zookeeper配置檔案修改

#修改過後的配置檔案zoo.cfg,如下:

egrep -v "^#|^$" zoo.cfg      
tickTime=2000
initLimit=10
syncLimit=5
dataLogDir=/opt/zookeeper/logs
dataDir=/opt/zookeeper/data
clientPort=2181
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
server.1= 192.168.1.148:2888:3888
server.2= 192.168.1.149:2888:3888
server.3= 192.168.1.150:2888:3888      

#建立相關目錄,三台節點都需要

mkdir -p /opt/zookeeper/{logs,data}      

#其餘zookeeper節點安裝完成之後,同步配置檔案zoo.cfg。

3.2、配置參數說明

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所用的端口。

3.3、建立ServerID辨別

除了修改zoo.cfg配置檔案外,zookeeper叢集模式下還要配置一個myid檔案,這個檔案需要放在dataDir目錄下。

這個檔案裡面有一個資料就是A的值(該A就是zoo.cfg檔案中server.A=B:C:D中的A),在zoo.cfg檔案中配置的dataDir路徑中建立myid檔案。

#在192.168.1.148伺服器上面建立myid檔案,并設定值為1,同時與zoo.cfg檔案裡面的server.1保持一緻,如下

echo "1" > /opt/zookeeper/data/myid      
zookeeper叢集搭建一、Zookeeper原理簡介二、Zookeeper安裝三、Zookeeper叢集配置四、Zookeeper叢集檢視五、Zookeeper叢集連接配接

#在192.168.1.149伺服器上面建立myid檔案,并設定值為1,同時與zoo.cfg檔案裡面的server.2保持一緻,如下

echo "2" > /opt/zookeeper/data/myid      
zookeeper叢集搭建一、Zookeeper原理簡介二、Zookeeper安裝三、Zookeeper叢集配置四、Zookeeper叢集檢視五、Zookeeper叢集連接配接

#在192.168.1.150伺服器上面建立myid檔案,并設定值為1,同時與zoo.cfg檔案裡面的server.3保持一緻,如下

echo "3" > /opt/zookeeper/data/myid      
zookeeper叢集搭建一、Zookeeper原理簡介二、Zookeeper安裝三、Zookeeper叢集配置四、Zookeeper叢集檢視五、Zookeeper叢集連接配接

到此,相關配置已完成

四、Zookeeper叢集檢視

1、啟動每個伺服器上面的zookeeper節點:

#linux-node1、linux-node2、linux-node3

/opt/zookeeper/bin/zkServer.sh start      

注意:報錯排查

zookeeper叢集搭建一、Zookeeper原理簡介二、Zookeeper安裝三、Zookeeper叢集配置四、Zookeeper叢集檢視五、Zookeeper叢集連接配接

Zookeeper節點啟動不了可能原因:zoo.cfg配置檔案有誤、iptables沒關。

2、啟動完成之後檢視每個節點的狀态

#linux-node1

zookeeper叢集搭建一、Zookeeper原理簡介二、Zookeeper安裝三、Zookeeper叢集配置四、Zookeeper叢集檢視五、Zookeeper叢集連接配接

#linux-node2

zookeeper叢集搭建一、Zookeeper原理簡介二、Zookeeper安裝三、Zookeeper叢集配置四、Zookeeper叢集檢視五、Zookeeper叢集連接配接

#linux-node3

zookeeper叢集搭建一、Zookeeper原理簡介二、Zookeeper安裝三、Zookeeper叢集配置四、Zookeeper叢集檢視五、Zookeeper叢集連接配接

#從上面可以看出,linux-node1,linux-node3兩台伺服器zookeeper的狀态是follow模式,linux-node2這台伺服器zookeeper的狀态是leader模式。

五、Zookeeper叢集連接配接

Zookeeper叢集搭建完畢之後,可以通過用戶端腳本連接配接到zookeeper叢集上面,對用戶端來說,zookeeper叢集是一個整體,連接配接到zookeeper叢集實際上感覺在獨享整個叢集的服務。

#在linux-node1測試

zookeeper叢集搭建一、Zookeeper原理簡介二、Zookeeper安裝三、Zookeeper叢集配置四、Zookeeper叢集檢視五、Zookeeper叢集連接配接

通過上圖可以看出整個zookeeper叢集已經搭建并測試完成。

#Zookeeper原理:

http://blog.csdn.net/wuliu_forever/article/details/52053557

http://www.cnblogs.com/luxiaoxun/p/4887452.html