Zookeeper 叢集 + Kafka 叢集
一、Zookeeper 概述
1、Zookeeper 定義
Zookeeper是一個開源的分散式的,為分散式框架提供協調服務的Apache專案。
2、Zookeeper 工作機制
Zookeeper = 檔案系統 + 通知機制
Zookeeper從設計模式角度來理解:是一個基於觀察者模式設計的分散式服務管理框架,它負責儲存和管理大家都關心的資料,然後接受觀察者的註冊,一旦這些資料的狀態發生變化,Zookeeper就將負責通知已經在Zookeeper上註冊的那些觀察者做出相應的反應。
3、Zookeeper 特點
(1)Zookeeper:一個領導者(Leader),多個跟隨者(Follower)組成的叢集。
(2)Zookeepe叢集中只要有半數以上節點存活,Zookeeper叢集就能正常服務。所以Zookeeper適合安裝奇數臺伺服器。
(3)全域性資料一致:每個Server儲存一份相同的資料副本,Client無論連線到哪個Server,資料都是一致的。
(4)更新請求順序執行,來自同一個Client的更新請求按其傳送順序依次執行,即先進先出。
(5)資料更新原子性,一次資料更新要麼成功,要麼失敗。
(6)實時性,在一定時間範圍內,Client能讀到最新資料。
4、Zookeeper 資料結構
ZooKeeper資料模型的結構與Linux檔案系統很類似,整體上可以看作是一棵樹,每個節點稱做一個ZNode。每一個ZNode預設能夠儲存1MB的資料,每個ZNode都可以通過其路徑唯一標識。
5、Zookeeper 應用場景
提供的服務包括:統一命名服務、統一配置管理、統一叢集管理、伺服器節點動態上下線、軟負載均衡等。
●統一命名服務
在分散式環境下,經常需要對應用/服務進行統一命名,便於識別。例如:IP不容易記住,而域名容易記住。
●統一配置管理
(1)分散式環境下,配置檔案同步非常常見。一般要求一個叢集中,所有節點的配置資訊是一致的,比如Kafka叢集。對配置檔案修改後,希望能夠快速同步到各個節點上。
(2)配置管理可交由ZooKeeper實現。可將配置資訊寫入ZooKeeper上的一個Znode。各個客戶端伺服器監聽這個Znode。一旦 Znode中的資料被修改,ZooKeeper將通知各個客戶端伺服器。
●統一叢集管理
(1)分散式環境中,實時掌握每個節點的狀態是必要的。可根據節點實時狀態做出一些調整。
(2)ZooKeeper可以實現實時監控節點狀態變化。可將節點資訊寫入ZooKeeper上的一個ZNode。監聽這個ZNode可獲取它的實時狀態變化。
●伺服器動態上下線
客戶端能實時洞察到伺服器上下線的變化。
●軟負載均衡
在Zookeeper中記錄每臺伺服器的訪問數,讓訪問數最少的伺服器去處理最新的客戶端請求。
6、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已經不是LOOKING狀態,不會更改選票資訊。交換選票資訊結果:伺服器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(ZXID)相同,伺服器id大的勝出
SID | 伺服器ID | 用來唯一標識一臺ZooKeeper叢集中的機器,每臺機器不能重複,和myid一致 |
ZXID | 事務ID | ZXID是一個事務ID,用來標識一次伺服器狀態的變更。在某一時刻,叢集中的每臺機器的ZXID值不一定完全一致,這和ZooKeeper伺服器對於客戶端“更新請求”的處理邏輯速度有關 |
Epoch | 每個Leader任期的代號 | 每個Leader任期的代號。沒有Leader時同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個資料就會增加 |
二、部署 Zookeeper 叢集
準備 3 臺伺服器做 Zookeeper 叢集
20.0.0.7
20.0.0.8
20.0.0.9
1、安裝前準備
關閉防火牆
systemctl stop firewalld systemctl disable firewalld setenforce 0
安裝 JDK
java -version #系統預設已安裝 openjdk version "1.8.0_131" OpenJDK Runtime Environment (build 1.8.0_131-b12) OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode) #未安裝的話 執行 yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel 安裝
//下載安裝包
官方下載地址:https://archive.apache.org/dist/zookeeper/
cd /opt
wget https://archive.apache.org/dist/zookeeper/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=20.0.0.7:3188:3288 server.2=20.0.0.8:3188:3288 server.3=20.0.0.9:3188:3288 ------------------------------------------------------------------------------------- server.A=B:C:D ●A是一個數字,表示這個是第幾號伺服器。叢集模式下需要在zoo.cfg中dataDir指定的目錄下建立一個檔案myid,這個檔案裡面有一個數據就是A的值,
Zookeeper啟動時讀取此檔案,拿到裡面的資料與zoo.cfg裡面的配置資訊比較從而判斷到底是哪個server。 ●B是這個伺服器的地址。 ●C是這個伺服器Follower與叢集中的Leader伺服器交換資訊的埠。 ●D是萬一叢集中的Leader伺服器掛了,需要一個埠來重新進行選舉,選出一個新的Leader,而這個埠就是用來執行選舉時伺服器相互通訊的埠。
在每個節點上建立資料目錄和日誌目錄
mkdir /usr/local/zookeeper-3.5.7/data mkdir /usr/local/zookeeper-3.5.7/logs
在每個節點的dataDir指定的目錄下建立一個 myid 的檔案
#(20.0.0.7) echo 1 > /usr/local/zookeeper-3.5.7/data/myid #(20.0.0.8) echo 2 > /usr/local/zookeeper-3.5.7/data/myid #(20.0.0.9) echo 3 > /usr/local/zookeeper-3.5.7/data/myid
拷貝配置好的 Zookeeper 配置檔案到其他機器上
scp /usr/local/zookeeper-3.5.7/conf/zoo.cfg 192.168.80.11:/usr/local/zookeeper-3.5.7/conf/ scp /usr/local/zookeeper-3.5.7/conf/zoo.cfg 192.168.80.12:/usr/local/zookeeper-3.5.7/conf/
配置 Zookeeper 啟動指令碼(每個節點啟動)