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

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資料模型以Znode路徑結構進行儲存。每一個ZNode預設能夠儲存1MB的資料,每個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