一 為什麼要搭建叢集
大部分分布式應用需要一個主要、協調器或者控制器來管理實體分布的子程序。目前,大多數都要開發私有的協調程式,缺乏一個通用機制,協調程式的反複編寫浪費,且難以形成通用、伸縮性好的協調器,zookeeper提供通用的分布式鎖服務,用以協調分布式應用。是以說zookeeper是分布式應用的協作服務。zookeeper作為注冊中心,伺服器和用戶端都要通路,如果有大量的并發,肯定會有等待。是以可以通過zookeeper叢集解決。
二 Leader選舉
Zookeeper的啟動過程中leader選舉是非常重要而且最複雜的一個環節。那麼什麼是leader選舉呢?zookeeper為什麼需要leader選舉呢?zookeeper的leader選舉的過程又是什麼樣子的?首先我們來看看什麼是leader選舉。其實這個很好了解,leader選舉就像總統選舉一樣,每人一票,獲得多數票的人就當選為總統了。在zookeeper叢集中也是一樣,每個節點都會投票,如果某個節點獲得超過半數以上的節點的投票,則該節點就是leader節點了。以一個簡單的例子來說明整個選舉的過程.
假設有五台伺服器組成的zookeeper叢集,它們的id從1-5,同時它們都是最新啟動的,也就是沒有曆史資料,在存放資料量這一點上,都是一樣的.假設這些伺服器依序啟動,來看看會發生什麼 。
1) 伺服器1啟動,此時隻有它一台伺服器啟動了,它發出去的報沒有任何響應,是以它的選舉狀态一直是LOOKING狀态
2) 伺服器2啟動,它與最開始啟動的伺服器1進行通信,互相交換自己的選舉結果,由于兩者都沒有曆史資料,是以id值較大的伺服器2勝出,但是由于沒有達到超過半數以上的伺服器都同意
選舉它(這個例子中的半數以上是3),是以伺服器1,2還是繼續保持LOOKING狀态.
3) 伺服器3啟動,根據前面的理論分析,伺服器3成為伺服器1,2,3中的老大,而與上面不同的是,此時有三台伺服器選舉了它,是以它成為了這次選舉的leader.
4) 伺服器4啟動,根據前面的分析,理論上伺服器4應該是伺服器1,2,3,4中最大的,但是由于前面已經有半數以上的伺服器選舉了伺服器3,是以它隻能接收當小弟的命了.
5) 伺服器5啟動,同4一樣,當小弟
三 搭建Zookeeper叢集
1 搭建要求
真實的叢集是需要部署在不同的伺服器上的,但是在我們測試時同時啟動十幾個虛拟機記憶體會吃不消,是以我們通常會搭建僞叢集,也就是把所有的服務都搭建在一台虛拟機上,用端口 進行區分。我們這裡要求搭建一個三個節點的Zookeeper叢集(僞叢集)。
2 準備工作
重新部署一台虛拟機作為我們搭建叢集的測試伺服器。
(1)安裝JDK 【此步驟省略】。
(2)Zookeeper壓縮包上傳到伺服器
(3)将Zookeeper解壓 ,建立data目錄 ,将 conf下zoo_sample.cfg 檔案改名為 zoo.cfg
(4)建立/usr/local/zookeeper-cluster目錄,将解壓後的Zookeeper複制到以下三個目錄
/usr/local/zookeeper-cluster/zookeeper-1
/usr/local/zookeeper-cluster/zookeeper-2
/usr/local/zookeeper-cluster/zookeeper-3
[root@localhost ~]# mkdir /usr/local/zookeeper-cluster
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-1
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-2
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/zookeeper-cluster/zookeeper-3
(5)配置每一個Zookeeper 的dataDir(zoo.cfg) clientPort 分别為2181 2182 2183
修改/usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
clientPort=2181
dataDir=/usr/local/zookeeper-cluster/zookeeper-1/data
修改/usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
clientPort=2182
dataDir=/usr/local/zookeeper-cluster/zookeeper-2/data
修改/usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg
clientPort=2183
dataDir=/usr/local/zookeeper-cluster/zookeeper-3/data
3 配置叢集
(1)在每個zookeeper的 data 目錄下建立一個 myid 檔案,内容分别是1、2、3 。這個檔案就是記錄每個伺服器的ID
(2)在每一個zookeeper 的 zoo.cfg配置用戶端通路端口(clientPort)和叢集伺服器IP清單。
叢集伺服器IP清單如下
server.1=192.168.25.140:2881:3881
server.2=192.168.25.140:2882:3882
server.3=192.168.25.140:2883:3883
更多免費技術資料可關注:annalin1203