目錄
-
- 一. 環境準備
-
- 1. 配置JDK
- 2. 配置Zookeeper
- 二. Zookeeper 叢集搭建
-
- 1. 建立myid檔案
- 2. 配置叢集節點資訊
- 3. 啟動Zookeeper
- 4. 檢視各節點狀态
- 三. 驗證叢集是否正常運作
-
- 模拟場景1: 下線一個從節點, 主節點和另一個從節點正常存活
- 模拟場景2: 下線主節點,其他從節點正常存活
- 模拟場景3: 下線兩個節點
- 四. 總結
在實際的生産環境中,叢集是部署在不同機器上的, 本着簡單明了的原則, 本次介紹的叢集是搭建在同一台虛拟機器上,建立三個Zookeeper的節點,用端口号進行區分,搭建一個
僞叢集
一. 環境準備
1. 配置JDK
Zookeeper的運作需要JDK為基礎,是以需要先在虛拟機上配置好JDK
JDK1.8 工具包
提取碼: qwer
- 先将JDK工具包上傳到虛拟機上(一般上傳到目錄/usr/local目錄下)
- 解壓工具包
tar -zxvf jdk-8u341-linux-x64.tar.gz
- 配置JDK環境變量
vim /etc/profile
先按
i鍵
進入編輯模式, 在末尾添加下面兩句, 再按
Esc鍵
退出編輯模式,最後按
Shift + Q鍵
, 進入
Ex模式
, 輸入
wq!
儲存退出
export JAVA_HOME=/usr/local/jdk1.8.0_341/
export PATH=$PATH:$JAVA_HOME/bin
- 重新重新整理下配置,否則可能不生效
source /etc/profile
- 最後驗證下JDK是否配置成功
java -version
出現下面情況,說明JDK配置成功
2. 配置Zookeeper
Zookeeper 工具包
提取碼: qwer
- 将Zookeeper工具包上傳到虛拟機上(一般上傳到目錄/usr/local目錄下),并解壓
tar -zxvf zookeeper-3.5.8.tar.gz
- 為了後續配置檔案好配,這裡我單獨建立一個zookeeper目錄
mkdir /usr/local/zookeeper
- 将解壓後的apache-zookeeper-3.5.8-bin目錄中的内容複制至zookeeper目錄
cp -r apache-zookeeper-3.5.8-bin/. /usr/local/zookeeper
- 建立data目錄,并在此目錄下建立三個子目錄
mkdir /usr/local/zookeeper/data
mkdir /usr/local/zookeeper/data/node-1
mkdir /usr/local/zookeeper/data/node-2
mkdir /usr/local/zookeeper/data/node-3
- 為了不破壞zookeeper原始的配置檔案,搭錯了還能重來, 将zoo_sample.cfg配置檔案複制三份
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo-1.cfg
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo-2.cfg
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo-3.cfg
- 修改三份zoo.cfg中的clientPort和dataDir配置資訊
vim /usr/local/zookeeper/conf/zoo-1.cfg
## node-1節點 - zoo-1.cfg
clientPort=2181 ## 預設就是2181,不用改
dataDir=/usr/local/zookeeper/data/node-1
vim /usr/local/zookeeper/conf/zoo-2.cfg
## node-2節點 - zoo-2.cfg
clientPort=2182
dataDir=/usr/local/zookeeper/data/node-2
vim /usr/local/zookeeper/conf/zoo-3.cfg
## node-3節點 - zoo-3.cfg
clientPort=2183
dataDir=/usr/local/zookeeper/data/node-3
至此,搭建叢集的前期準備工作就算完成了,接下來就是叢集搭建了
二. Zookeeper 叢集搭建
1. 建立myid檔案
在每個節點中的data目錄下, 建立下myid檔案,并且寫入辨別值
myid的值是zoo.cfg檔案裡定義的server.A項A的值,Zookeeper 啟動時會讀取這個檔案,拿到裡面的資料與 zoo.cfg 裡面的配置資訊比較進而判斷到底是那個server,隻是一個辨別作用。
echo 1 >/usr/local/zookeeper/data/node-1/myid
echo 2 >/usr/local/zookeeper/data/node-2/myid
echo 3 >/usr/local/zookeeper/data/node-3/myid
2. 配置叢集節點資訊
在每個節點的zoo.cfg檔案中都配置叢集節點資訊, 其中server後面的值就是對應myid檔案中的值,
2881為組成zookeeper伺服器之間的通信端
3881為用來選舉leader的端口
server.1=10.15.122.88:2881:3881
server.2=10.15.122.88:2882:3882
server.3=10.15.122.88:2883:3883
3. 啟動Zookeeper
啟動三個zoo.cfg配置檔案,代表三個zookeeper節點
sh ./bin/zkServer.sh start ./conf/zoo-1.cfg
sh ./bin/zkServer.sh start ./conf/zoo-2.cfg
sh ./bin/zkServer.sh start ./conf/zoo-3.cfg
4. 檢視各節點狀态
sh ./bin/zkServer.sh status ./conf/zoo-1.cfg
sh ./bin/zkServer.sh status ./conf/zoo-2.cfg
sh ./bin/zkServer.sh status ./conf/zoo-3.cfg
從上述三個節點的狀态看, 節點2成為了主節點, 節點1和節點3成為了從節點
至此, 簡易的Zookeeper叢集搭建完成
三. 驗證叢集是否正常運作
檢視三個節點運作的程序号
ps -ef | grep .cfg
以下每個場景都是模拟一主二從, 現在node-1和node-3是從節點,node-2是主節點
下線節點使用下面指令,直接殺死程序
kill -9 程序号
模拟場景1: 下線一個從節點, 主節點和另一個從節點正常存活
将從節點node1下線, 從節點node3和主節點node2存活
此時再來檢視程序運作情況
可以看到從節點node-1已經成功下線
再看下叢集情況
此時,node-1節點已經下線,不影響叢集的正常運作且其他節點的身份也沒變化, node-2依舊是主節點,node-3還是從節點
模拟場景2: 下線主節點,其他從節點正常存活
前提要先把上一場景的node-1重新啟起來.node-1會以從節點的身份重新加入到叢集中
将主節點node-2下線, 從節點node-1和主節點node-3正常存活
此時再來檢視程序運作情況
可以看到主節點node-2已經成功下線
再看下叢集情況
sh ./bin/zkServer.sh status ./conf/zoo-1.cfg
sh ./bin/zkServer.sh status ./conf/zoo-2.cfg
sh ./bin/zkServer.sh status ./conf/zoo-3.cfg
此時,node-2下線後, node-1依舊是從節點, node-3由從節點變成主節點了
這是因為叢集必須要有一個主節點, 當主節點下線之後,會在其他從節點當中重新選舉出一個主節點來保證叢集的正常運作
模拟場景3: 下線兩個節點
前提要先把上一場景的node-2重新啟起來,node-2會以從節點的身份重新加入到叢集中
将節點node-1和node-3下線, 節點node-2正常存活
kill -9 9299
kill -9 9632
此時再來檢視程序運作情況
此時就一個node-3節點程序在運作
再看下叢集情況
sh ./bin/zkServer.sh status ./conf/zoo-1.cfg
sh ./bin/zkServer.sh status ./conf/zoo-2.cfg
sh ./bin/zkServer.sh status ./conf/zoo-3.cfg
可以看出叢集已經停止運作,因為隻有一個節點存活, 小于叢集的最小存活節點數的規則
最小存活節點數 = (節點總數)/2 + 1
由此計算規則可知, 要想叢集正常運作,必須要有兩個節點存活才行
驗證下: 之前是節點node-2存活, 重新啟動節點node-1
重新啟動節點node-1,發現叢集又恢複正常了,原本節點node-2是從節點, 此時有兩個節點,滿足叢集的最小節點數, 叢集正常運作,并重新選舉出一個主節點
注意: 如果之前下線的2個節點都是從節點, 主節點存活, 那麼此時就不會重新選舉
四. 總結
- 叢集必須要有一個主節點
- 叢集中,如果主節點下線, 會在剩下的從節點中重新選舉一個主節點
- 叢集中,如果現有存活的節點數小于叢集最小存活節點數時, 叢集停止工作, 變成單機 ; 當有節點重新啟用時, 滿足叢集最小存活節點數條件, 叢集恢複正常