1. 程式人生 > 其它 >Zookeeper 叢集 + Kafka 叢集

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 啟動指令碼(每個節點啟動)