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號伺服器的領導地位。
由此我們得出結論,當領導者產生後,再次有新伺服器加入叢集,不會影響到現任領導者。