Zookeeper叢集 + Fafka叢集
Zookeeper 概述
Zookeeper 定義
Zookeeper是一個開源的分散式的,為分散式框架提供協調服務的Apache專案,儲存著一些分散式叢集的元資料。
Zookeeper 工作機制
Zookeeper從設計模式角度來理解∶是一個基於觀察者模式設計的分散式服務管理框架,它負責儲存和管理群集的狀態資訊及元資料,然後接受觀察者的註冊,一旦這些資料的狀態發生變化,Zookeeper就將負責通知已經在Zookeeper上註冊的那些觀察者某些主機發生宕機或其他狀況,從而提醒觀察者做出相應的反應。
也就是說Zookeeper = 檔案系統 + 通知機制
Zookeeper 特點
(1)Zookeeper∶一個領導者(Leader),多個跟隨者(Follower)組成的叢集。
(2)Zookeepe叢集中只要有半數以上節點存活,Zookeeper叢集就能正常服務。所以Zookeeper適合安裝奇數臺伺服器。
(3)全域性資料一致∶每個Server儲存一份相同的資料副本,Client無論連線到哪個Server,資料都是一致的。
(4)更新請求順序執行,來自同一個Client的更新請求按其傳送順序依次執行,即先進先出。
(5)資料更新原子性,一次資料更新要麼成功,要麼失敗。
(6)實時性,在一定時間範圍內,Client能讀到最新資料。
Zookeeper 資料結構
ZooKeeper資料模型的結構與Linux檔案系統很類似,整體上可以看作是一棵樹,每個節點稱做一個ZNode
Zookeeper應用場景
提供的服務包括∶統一命名服務、統一配置管理、統一叢集管理、伺服器節點動態上下線、軟負載均衡等。
●統一命名服務
在分散式環境下,經常需要對應用/服務進行統一命名,便於識別。例如∶IP不容易記住,而域名容易記住。
●統一配置管理
(1)分散式環境下,配置檔案同步非常常見。一般要求一個叢集中,所有節點的西置資訊是一致的,比如Kafka叢集。對西置檔案修改後,希望能夠快速同步到各個節點上。
(2)配置管理可交由ZooKeeper實現。可將配置資訊寫入ZooKeeper上的一個Znode。各個客戶端伺服器監聽這個Znode。一旦Znode中的資料被修改,ZooKeeper將通知各個客戶端伺服器。
●統一叢集管理
(1)分散式環境中, 實時掌握每個節點的狀態是必要的。可根據節點實時狀態做出一些調整。
(2)ZooKeeper可以實現實時監控節點狀態變化。可將節點資訊寫入ZooKeeper上的一個ZNode。監聽這個ZNode可獲取它的實時狀態變化。
●伺服器動態上下線
客戶端能實時洞察到伺服器上下線的變化。
●軟負載均衡
在Zookeeper中記錄每臺伺服器的訪問數,讓訪問數最少的伺服器去處理最新的客戶端請求。
Zookeeper 選舉機制
●第一次啟動選舉機制
(1)伺服器1啟動,發起一次選舉。伺服器1投自己一票。此時伺服器1票數一票,不夠半數以上(3票),選舉無法完成,伺服器1狀態保持為LOOKING;
(2)伺服器2啟動,再發起一次選舉。伺服器1和2分別投自己一票並交換選票資訊∶此時伺服器1發現伺服器2的myid(預先設定的值)比自己目前投票推舉的(伺服器1)大,更改選票為推舉伺服器2。此時伺服器1票數0票,伺服器2票數2票,沒有半數以上結果,選舉無法完成,伺服器1,2狀態保持LOOKING
(3)伺服器3啟動,發起一次選舉。此時伺服器1和2都會更改選票為伺服器3。此次投票結果,伺服器1為0票,伺服器2為0票,伺服器3為3 票。此時伺服器3的票數已經超過半數,伺服器3當選Leader。伺服器1,2更改狀態為FOLLOWING,伺服器3更改狀態為LEADING;
(4)伺服器4啟動,發起一次選舉。此時伺服器1,2,3已經不是T0OKTNG狀態,不會更改選票資訊。交換選票資訊結果∶伺服器3為3票,伺服器4為1票。此時伺服器4服從多數,更改選票資訊為伺服器3,並更改狀態為FOLLOWING
(5)伺服器5啟動,同4一樣當小弟。
●非第一次啟動選舉機制
(1)當ZooKeeper叢集中的一臺伺服器出現以下兩種情況之一時,就會開始進入Leader選舉
1)伺服器初始化啟動。
2)伺服器執行期間無法和Leader保持連線。
(2)而當一臺機器進入Leader選舉流程時,當前叢集也可能會處於以下兩種狀態
1)叢集中本來就已經存在一個Leader。
對於已經存在Leader的情況,機器試圖去選舉Leader時,會被告知當前伺服器的Leader資訊,對於該機器來說,僅僅需要和Leader機器建立連線,並進行狀態同步即可。
2)叢集中確實不存在Leader
假設ZooKeeper由5臺伺服器組成,SID分別為1、2、3、4、5,ZXID分別為8、8、8、7、7,並且此時SID為3的伺服器是Leader。某一時刻,3和5伺服器出現故障,因此開始進行Leader選舉。
選舉新Leader規則∶
1.EPOCH大的直接勝出
2.EPOCH相同,事務id大的勝出
3.事務id相同,伺服器主d大的勝出
SID∶伺服器ID。用來唯一標識一臺ZooKeeper叢集中的機器,每臺機器不能重複,和myid一致。
ZXID∶事務ID。ZXID是一個事務ID,用來標識一次伺服器狀態的變更。在某一時刻,叢集中的每臺機器的ZXID值不一定完全一致,這和ZooKeeper伺服器對於客戶端"更新請求"的處理邏輯速度有關,相當於相同時間內伺服器處理事務的數量對比,與伺服器的效能有關。
Epoch∶每個Leader任期的代號。沒有Leader時同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個資料就會增加,簡單來參加選舉的Follower伺服器經歷過多少次的選舉,經歷選舉次數多的,資歷老的伺服器直接當選新的Leader
部署 Zookeeper叢集
準備 3 臺伺服器做 Zookeeper 叢集
192.168.150.5
192.168.150.10
192.168.150.15
1.安裝前準備
#關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
java -version
#如果沒有JDK手動安裝
yum install -yjava-1.8.0-openjdk java-1.8.0-openjdk-devel
#下載安裝包
官方下載地址:https://archive.apache.org/dist/zookeeper/
cd /opt
wget https://larchive.apache.org/distlzookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz
2.在每個節點安裝 Zookeeper
cd /opt
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz
mv apache-zookeeper-3.5.7-bin /usr/local/zookeeper-3.5.7
#修改配置檔案
cd /usr/local/zookeeper-3.5.7/conf/
cp zoo_sample.cfg zoo.cfg #根據模板複製一個配置檔案
vim zoo.cfg
tickTime=2000 #通訊心跳時間,Zookeeper伺服器與客戶端心跳時間,單位毫秒
initLimit=10 #Leader和Follower初始連線時能容忍的最多心跳數(tickTime的數量),這裡表示為10*2s
syncLimit=5 #Leader和Follower之間同步通訊的超時時間,這裡表示如果超過5*2s,Leader認為Follwer死掉,並從伺服器列表中刪除Follwer
dataDir=/usr/local/zookeeper-3.5.7/data #修改,指定儲存Zookeeper中的資料的目錄,目錄需要單獨建立
dataLogDir=/usr/local/zookeeper-3.5.7/logs #新增,指定存放日誌的目錄,目錄需要單獨建立
clientPort=2181 #客戶端連線埠
#在末行新增叢集資訊
server.1=192.168.150.5:3188:3288
server.2=192.168.150.10:3188:3288
server.3=192.168.150.15:3188:3288
--- 解析 ---
server.A=B:C:D
●A是一個數字,表示這個是第幾號伺服器。叢集模式下需要在zoo.cfg中dataDir指定的目錄下建立一個檔案myid,這個檔案甲面有一一個數據就是A的值,Zookeeper啟動時讀取此檔案,拿到裡面的資料與zoo.cfg裡面的配置資訊比較從而判斷到底是哪個server。
●B是這個伺服器的地址。
●C是這個伺服器Follower與叢集中的Leader伺服器交換資訊的埠,第一次選舉的埠。
●D是萬一叢集中的Leader伺服器掛了,需要一個埠來重新進行選舉,選出一個新的Leader,而這個埠就是用來執行選舉時伺服器相互通訊的埠,非第一次選舉的埠。
3. 在每個節點上建立資料目錄和日誌目錄
mkdir /usr/local/zookeeper-3.5.7/data
mkdir /usr/local/zookeeper-3.5.7/logs
4. 可以直接將配置好Zookeeper資料檔案直接傳送到其他機器上
scp-r /usr/local/zookeeper-3.5.7/conf/zoo.cfg 192.168.150.10:/usr/local/zookeeper-3.5.7/conf/zoo.cfg
scp -r /usr/local/zookeeper-3.5.7/conf/zoo.cfg 192.168.150.15:/usr/local/zookeeper-3.5.7/conf/zoo.cfg
5. 各節點分別建立myid的檔案
#192.168.150.5主機
echo 1 > /usr/local/zookeeper-3.5.7/data/myid
#192.168.150.10主機
echo 2 > /usr/local/zookeeper-3.5.7/data/myid
#192.168.150.15主機
echo 3 > /usr/local/zookeeper-3.5.7/data/myid
6. 啟動zookeeper或者編寫一個啟動指令碼加入系統管理
#使用自帶命令管理zookeeper
/usr/local/zookeeper-3.5.7/bin/zkServer.sh start #啟動zookeeper服務
/usr/local/zookeeper-3.5.7/bin/zkServer.sh status #檢視伺服器狀態,如果三臺,啟動第二臺則會顯示
#/usr/local/zookeeper-3.5.7/bin/zkServer.sh start-foreground#如果報錯該命令可以檢視報錯日誌
#編寫一個shell指令碼加入系統管理
vim /etc/init.d/zookeeper
#!/bin/bash
#chkconfig:2345 20 90
#description: Zookeeper Service Control Script
ZK_HOME='/usr/local/zookeeper-3.5.7'
case $1 in
start)
echo "-----zookeeper啟動-----"
$ZK_HOME/bin/zkServer.sh start
;;
stop)
echo "----zookeeper停止-------"
$ZK_HOME/bin/zkServer.sh stop
;;
restart)
echo "----zookeeper重啟-------"
$ZK_HOME/bin/zkServer.sh restart
;;
status)
echo "-----zookeeper狀態------"
$ZK_HOME/bin/zkServer.sh status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
#加入系統使用service命令管理
chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper
service zookeeper start