大部分分佈式應用須要一個主控、協調器或者控制器來管理物理分佈的子進程。目前,大多數都要開發私有的協調程序,缺少一個通用機制,協調程序的反覆編寫浪費,且難以造成通用、伸縮性好的協調器,zookeeper提供通用的分佈式鎖服務,用以協調分佈式應用。因此說zookeeper是分佈式應用的協做服務。php
zookeeper做爲註冊中心,服務器和客戶端都要訪問,若是有大量的併發,確定會有等待。因此能夠經過zookeeper集羣解決。服務器
下面是zookeeper集羣部署結構圖:併發
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同樣,當小弟spa
真實的集羣是須要部署在不一樣的服務器上的,可是在咱們測試時同時啓動十幾個虛擬機內存會吃不消,因此咱們一般會搭建僞集羣,也就是把全部的服務都搭建在一臺虛擬機上,用端口進行區分。code
咱們這裏要求搭建一個三個節點的Zookeeper集羣(僞集羣)。server
從新部署一臺虛擬機做爲咱們搭建集羣的測試服務器。blog
(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
爲每個zookeeper建立data文件夾,並將zookeeper的配置文件重命名。
mkdir /usr/local/zookeeper-cluster/zookeeper-1/data mkdir /usr/local/zookeeper-cluster/zookeeper-2/data mkdir /usr/local/zookeeper-cluster/zookeeper-3/data
mv /user/local/zookeeper-cluster/zookeeper-1/conf/zoo_sample.cfg /user/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
修改/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
(1)在每一個zookeeper的 data 目錄下建立一個 myid 文件,內容分別是一、二、3 。這個文件就是記錄每一個服務器的ID
(2)在每個zookeeper 的 zoo.cfg配置客戶端訪問端口(clientPort)和集羣服務器IP列表。
集羣服務器IP列表以下
server.1=192.168.25.101:2881:3881
server.2=192.168.25.101:2882:3882
server.3=192.168.25.101:2883:3883
解釋:server.服務器ID=服務器IP地址:服務器之間通訊端口:服務器之間投票選舉端口
啓動集羣就是分別啓動每一個實例。
啓動後咱們查詢一下每一個實例的運行狀態
先查詢第一個服務
Mode爲follower表示是跟隨者(從)
再查詢第二個服務Mod 爲leader表示是領導者(主)
查詢第三個爲跟隨者(從)