1. 程式人生 > >Zookeeper 叢集

Zookeeper 叢集

Zookeeper 叢集簡介

1、為什麼搭建 Zookeeper 叢集

大部分分散式應用需要一個主控、協調器或者控制器來管理物理分佈的子程序。目前,
大多數都要開發私有的協調程式,缺乏一個通用機制,協調程式的反覆編寫浪費,且難以形
成通用、伸縮性好的協調器,zookeeper 提供通用的分散式鎖服務,用以協調分散式應用。
所以說 zookeeper 是分散式應用的協作服務。
zookeeper 作為註冊中心,伺服器和客戶端都要訪問,如果有大量的併發,肯定會有等
待。所以可以通過 zookeeper 叢集解決。

2、瞭解 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 一樣,當小弟

3、搭建 Zookeeper

真實的叢集是需要部署在不同的伺服器上的,但是在我們測試時同時啟動十幾個虛擬機器
記憶體會吃不消,所以我們通常會搭建 偽叢集,也就是把所有的服務都搭建在一臺虛擬機器上,
用埠進行區分。
我們這裡要求搭建一個三個節點的 Zookeeper 叢集(偽叢集)。
部署一臺虛擬機器作為我們搭建叢集的測試伺服器。
(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
(5) 配置每一個 Zookeeper 的 dataDir(zoo.cfg) clientPort 分別為 2181 2182 2183
修改/usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg

[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

修改/usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg

clientPort=2181
dataDir=/usr/local/zookeeper-cluster/zookeeper-1/data

(2、3同上)

4、配置叢集

在每個 zookeeper 的 data 目錄下建立一個 myid 檔案,內容分別是 1、2、3 。這個
檔案就是記錄每個伺服器的 ID

——- 知識點小貼士——
如果你要建立的文字檔案內容比較簡單,我們可以通過 echo 命令快速建立檔案
格式為:
echo 內容 >檔名

在每一個 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

解釋:server.伺服器 ID=伺服器 IP 地址:伺服器之間通訊埠:伺服器之間投票選舉埠

啟動叢集

啟動叢集就是分別啟動每個例項。
zkServer.sh start

啟動後我們查詢一下每個例項的執行狀態
zkServer.sh status

模擬叢集異常

(1)首先我們先測試如果是從伺服器掛掉,會怎麼樣
把 3 號伺服器停掉,觀察 1 號和 2 號,發現狀態並沒有變化
由此得出結論,3 個節點的叢集,從伺服器掛掉,叢集正常
(2)我們再把 1 號伺服器(從伺服器)也停掉,檢視 2 號(主伺服器)的狀態,發現已經停止運行了。
由此得出結論,3 個節點的叢集,2 個從伺服器都掛掉,主伺服器也無法執行。因為可執行的機器沒有超過叢集總數量的半數。
(3)我們再次把 1 號伺服器啟動起來,發現 2 號伺服器又開始正常工作了。而且依然是領導者。
(4)我們把 3 號伺服器也啟動起來,把 2 號伺服器停掉(汗幹嘛?領導了?)停掉後觀察 1 號和 3 號的狀態。
發現新的 leader 產生了~
由此我們得出結論,當叢集中的主伺服器掛了,叢集中的其他伺服器會自動進行舉狀態,然後產生新得 leader
(5)我們再次測試,當我們把 2 號伺服器重新啟動起來(汗
這是詐屍啊!)啟動後,會發生什麼?2 號伺服器會再次成為新的領導嗎?我們看結果我們會發現,2 號伺服器啟動後依然是跟隨者(從伺服器),3 號伺服器依然是領導者(主伺服器),沒有撼動 3 號伺服器的領導地位。哎~退休了就是退休了,說了不算了,哈哈。
由此我們得出結論,當領導者產生後,再次有新伺服器加入叢集,不會影響到現任領導者。

Dubbox 連線 zookeeper 叢集

修改服務提供者和服務呼叫者的 spring 配置檔案

<!-- 指定註冊中心地址 -->
<dubbo:registry
protocol="zookeeper"
address="192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183">
</dubbo:registry>