1. 程式人生 > 實用技巧 >Zookeeper - 4 叢集搭建

Zookeeper - 4 叢集搭建

搭建Zookeeper叢集

1.1 搭建要求

真實的叢集是需要部署在不同的伺服器上的,但是在我們測試時同時啟動很多個虛擬機器記憶體會吃不消,所以我們通常會搭建偽叢集,也就是把所有的服務都搭建在一臺虛擬機器上,用埠進行區分。

我們這裡要求搭建一個三個節點的Zookeeper叢集(偽叢集)。

1.2 準備工作

重新部署一臺虛擬機器作為我們搭建叢集的測試伺服器。

(1)安裝JDK 【此步驟省略】。

(2)Zookeeper壓縮包上傳到伺服器
(3)將Zookeeper解壓 ,建立/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  apache-zookeeper-3.5.6-bin /usr/local/zookeeper-cluster/zookeeper-1
[root@localhost ~]# cp -r  apache-zookeeper-3.5.6-bin /usr/local/zookeeper-cluster/zookeeper-2
[root@localhost ~]# cp -r  apache-zookeeper-3.5.6-bin /usr/local/zookeeper-cluster/zookeeper-3

(4)建立data目錄 ,並且將 conf下zoo_sample.cfg 檔案改名為 zoo.cfg

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  /usr/local/zookeeper-cluster/zookeeper-1/conf/zoo_sample.cfg  /usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
mv  /usr/local/zookeeper-cluster/zookeeper-2/conf/zoo_sample.cfg  /usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
mv  /usr/local/zookeeper-cluster/zookeeper-3/conf/zoo_sample.cfg  /usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg

(5) 配置每一個Zookeeper 的dataDir 和 clientPort 分別為2181 2182 2183

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

vim /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

vim /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

vim /usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg

clientPort=2183
dataDir=/usr/local/zookeeper-cluster/zookeeper-3/data

1.3 配置叢集

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

echo 1 >/usr/local/zookeeper-cluster/zookeeper-1/data/myid
echo 2 >/usr/local/zookeeper-cluster/zookeeper-2/data/myid
echo 3 >/usr/local/zookeeper-cluster/zookeeper-3/data/myid

(2)在每一個zookeeper 的 zoo.cfg配置客戶端訪問埠(clientPort)和叢集伺服器IP列表。

叢集伺服器IP列表如下

vim /usr/local/zookeeper-cluster/zookeeper-1/conf/zoo.cfg
vim /usr/local/zookeeper-cluster/zookeeper-2/conf/zoo.cfg
vim /usr/local/zookeeper-cluster/zookeeper-3/conf/zoo.cfg

server.1=192.168.149.135:2881:3881
server.2=192.168.149.135:2882:3882
server.3=192.168.149.135:2883:3883

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

1.4 啟動叢集

啟動叢集就是分別啟動每個例項。

/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh start

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

/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh status
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh status
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh status

先查詢第一個服務

Mode為follower表示是跟隨者(從)

再查詢第二個服務Mod 為leader表示是領導者(主)

查詢第三個為跟隨者(從)

1.5 模擬叢集異常

(1)首先我們先測試如果是從伺服器掛掉,會怎麼樣

把3號伺服器停掉,觀察1號和2號,發現狀態並沒有變化

/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh stop

/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh status
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh status

由此得出結論,3個節點的叢集,從伺服器掛掉,叢集正常

(2)我們再把1號伺服器(從伺服器)也停掉,檢視2號(主伺服器)的狀態,發現已經停止運行了。

/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh stop

/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh status

由此得出結論,3個節點的叢集,2個從伺服器都掛掉,主伺服器也無法執行。因為可執行的機器沒有超過叢集總數量的半數。

(3)我們再次把1號伺服器啟動起來,發現2號伺服器又開始正常工作了。而且依然是領導者。

/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh start

/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh status

(4)我們把3號伺服器也啟動起來,把2號伺服器停掉,停掉後觀察1號和3號的狀態。

/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh start
/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh stop

/usr/local/zookeeper-cluster/zookeeper-1/bin/zkServer.sh status
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh status

發現新的leader產生了~

由此我們得出結論,當叢集中的主伺服器掛了,叢集中的其他伺服器會自動進行選舉狀態,然後產生新得leader

(5)我們再次測試,當我們把2號伺服器重新啟動起來啟動後,會發生什麼?2號伺服器會再次成為新的領導嗎?我們看結果

/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh start

/usr/local/zookeeper-cluster/zookeeper-2/bin/zkServer.sh status
/usr/local/zookeeper-cluster/zookeeper-3/bin/zkServer.sh status

我們會發現,2號伺服器啟動後依然是跟隨者(從伺服器),3號伺服器依然是領導者(主伺服器),沒有撼動3號伺服器的領導地位。

由此我們得出結論,當領導者產生後,再次有新伺服器加入叢集,不會影響到現任領導者。