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

Zookeeper和Fafka叢集

Zookeeper概述:

定義:

Zookeeper是一個開源的分散式的,為分散式框架提供協調服務的Apache專案。

工作機制:

Zookeeper從設計模式角度來理解:是一個基於觀察者模式設計的分散式服務管理框架,它負責儲存和管理大家都關心的資料,然後接收觀察者的註冊,一旦這些資料的狀態發生變化,Zookeeper就將負責通知已經在Zookeeper上註冊的那些觀察者做出相應的反應。也就是說Zookeeper = 檔案系統 + 通知機制。

特點:

  1. Zookeeper:一個領導者(Leader),多個跟隨者(Follower)組成的叢集
  2. Zookeeper叢集中只要有半數以上節點存活,Zookeeper叢集就能正常服務。所以Zookeeper適合安裝奇數臺伺服器
  3. 全域性資料一致:每個Server儲存一份相同的資料副本,Client無論連線到哪個Server,資料都是一致的
  4. 更新請求順序執行,來自同一個Client的更新請求按其傳送順序一次執行,即先進先出
  5. 資料更新原子性,一次資料更新要麼成功,要麼失敗
  6. 實時性,在一定時間範圍內,Client能讀到最新的資料

資料結構:

Zookeeper資料模型的結構與Linux檔案系統很類似,整體上可以看做是一棵樹,每個節點稱作一個ZNode。每個ZNode預設能夠儲存1MB的資料,每個ZNode都可以通過其路徑唯一標識。

應用場景:

統一命名服務:

在分散式環境下,經常需要對應用/服務進行統一命名,便於識別。例如: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已經不是LOOKING狀態,不會更改選票資訊。交換選票資訊結果:伺服器3位3票,伺服器4為1票。此時伺服器4服從多數,更改選票資訊為伺服器3,並更改狀態FOLLOWING

(5)伺服器5啟動,同4一樣當小弟

非第一次啟動選舉機制

(1)當Zookeeper叢集中的一臺伺服器出現以下兩種情況之一時,就會開始進入Leader選舉:

①伺服器初始化啟動

②伺服器執行期間無法和Leader保持連線

(2)而當一臺機器進入Leader選舉流程時,當前叢集也可能會處於以下兩種狀態

①叢集中本來就已經存在一個Leader

對於已經存在Leader的情況下,機器試圖去選舉Leader時,會被告知當前伺服器的Leader資訊,對於該機器來說,僅僅需要和Leader機器建立連線,並進行狀態同步即可

②叢集中確實不存在Leader

假設Zookeeper由5臺伺服器組成,SID分別是1、2、3、4、5,ZXID分別是8、8、7、7,並且此時SID為3的伺服器是Leader。某一時刻,3和5伺服器出現故障,因此開始進行Leader選舉。

選舉Leader規則:

  1. EPOCH大的直接勝出
  2. EPOCH相同,事務id大的勝出
  3. 事務id相同,伺服器id大的勝出

注:


  • SID:伺服器id,用來唯一標識一臺Zookeeper叢集中的機器,每臺機器不能重複,和mydi一致
  • ZXID:事務ID,ZXID是一個事務ID,用來標識一次伺服器狀態的變更。在某一時刻,叢集中的每臺機器的ZXID值不一定完全一致,這和ZooKeeper伺服器對於客戶端“更新請求”的處理邏輯速度有關。
  • Epoch:每個Leader任期的代號。沒有Leader時同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個資料就會增加。

部署Zookeeper叢集

1、安裝前

2、安裝包

在每個節點的dataDir指定的目錄下建立一個myid的檔案