面試官:Kafka和ES選主有什麼區別?

Kafka 和 ES 都是用來處理大數據的中間件,一個是消息中間件的代表(Kafka),另一個是大數據搜索引擎的代表(ES)。它們在 Java 領域的使用非常廣泛,在大數據方面就更不用說了,但它們的選主(選擇主節點)有什麼關聯與區別呢?接下來,我們一起來看。

1.基礎概念

1.1 什麼是Kafka?

Kafka 是一個分佈式流處理平臺,由 LinkedIn 公司開發和維護,之後成爲 Apache 軟件基金會的一部分。它主要是爲處理實時數據而設計的,是一個高吞吐量的分佈式發佈訂閱消息系統。

Kafka 集羣組成如下:
image.png

說明:每個 Broker 就是一個 Kafka 實例(其中的 Broker 1 爲 Controller,也就是主 Broker),一個 Broker 中有多個 Topic,一個 Topic 中有多個分區,分區分爲兩類:Leader 分區和 Follower 分區。

1.2 什麼是ES?

ES 全稱 Elasticsearch,是一個開源的高擴展的分佈式全文檢索引擎。它可以近乎實時地存儲、檢索數據,並且具有出色的擴展性,可以擴展到上百臺服務器,處理 PB 級別的數據。Elasticsearch 使用 Java 開發,並使用 Apache Lucene 作爲其核心來實現所有索引和搜索的功能,但它通過簡單的 RESTful API 來隱藏 Lucene 的複雜性,使得全文搜索變得簡單。

ES 集羣組成如下:
image.png

說明:一個 ES 集羣中只有一個 Master(主節點)節點,其他的爲數據節點(還有其他節點類型,這裏忽略),主節點協調整個集羣的工作,數據節點中存儲了多個分片,每個分片分爲兩種類型:主分片和副本分片(類似 Kafka 中分區的概念)。

2.Kafka和ES選主

Kafka 選主指的是選 Broker 中的 Controller,而 ES 選主指的是選取集羣中的 Master,它們兩個的關聯是 Kafka 新版本(2.8 之後)和 ES 新版本(7.0 之後),它們的選主策略都是基於 Raft 算法實現的

PS:當然,Kafka 中叫做 KRaft,ES 也是在 Raft 算法的基礎上擴充了二階段選舉,但它們基於的底層算法都是 Raft 算法。

3.什麼是Raft算法?

Raft 算法是一種分佈式一致性算法,主要用於在分佈式系統中實現數據副本的一致性。該算法是 Paxos 算法的工程實現,其主要特點是通過較爲簡單的算法實現分佈式系統的數據一致性和高可用。

Raft 算法的核心是通過選舉投票,少數人服從多數人的原則(投票過半原則),如果有一半以上的人投票給某個節點作爲 Leader,那麼它就是新的 Leader。

在 Raft 算法中,分佈式系統中的所有節點被劃分爲三種角色:領導者(Leader)、追隨者(Follower)和候選人(Candidate),這三者身份的轉換如下:

  1. leader -> follower:倘若 leader 發現當前系統中出現了更大的任期,則會進行“禪讓”,主動退位成 follower。這裏 leader 發現更大任期的方式包括:
    1. 向 follower 提交日誌同步請求時,從 follower 的響應參數中獲得。
    2. 收到了來自新任 leader 的心跳或者同步日誌請求。
    3. 收到了任期更大的 candidate 的拉票請求。
  2. follower -> candidate:leader 需要定期向 follower 發送心跳,告知自己仍健在的消息。倘若 follower 超過一定時長沒收到 leader 心跳時,會將狀態切換爲 candidate,在當前任期的基礎上加 1 作爲競選任期,發起競選嘗試補位。
  3. candidate -> follower:candidate 參與競選過程中,出現以下兩種情形時會退回 follower:
    1. 多數派投了反對票。
    2. 競選期間,收到了任期大於等於自身競選任期的 leader 傳來的請求。
  4. candidate -> leader:candidate 競選時,倘若多數派投了贊同票,則切換爲 leader。
  5. candidate -> candidate:candidate 的競選流程有一個時間閾值. 倘若超時仍未形成有效結論(多數派贊同或拒絕),則會維持 candidate 身份,將競選任期加1,發起新一輪競選。

4.Raft選舉流程

Raft 算法的選舉流程如下圖所示:
image.png
它的投票流程有三種:

  1. 競選者投票給原 leader
    1. 倘若該任期小於自身,拒絕,並回復自己的最新任期。
    2. 倘若該任期大於自身,退位爲 follower,按照 follower 的模式處理該請求。
  2. 競選者投票給 follower
    1. 倘若任期落後於自己,拒絕請求,並回復自己所在的任期。
    2. 倘若任期大於自己,判斷最後的同步日誌是否夠新,如果比自己新就把這一票投給競選者,如果沒有自己新則拒絕。
  3. 競選者投票給 candidate
    1. 倘若 leader 任期大於等於自己,同意此次投票,並退回 follower,按照 follower 模式處理請求。
    2. 如果 leader 任期小於自己,拒絕,並回復自己的最新任期。

每個競選者根據以上投票來決定新的 leader,如果有一個投票過半,那麼它就升級爲新的 leader,並把這個消息同步給其他節點。否則會開啓新的一輪投票,爲了防止一直投票,會在開啓新一輪投票時,設置的隨機等待時間,和一定次數投票失敗後棄權的機制,來保證投票順利完成。

課後思考

Kafka 針對 Raft 算法做了哪些調整和升級?ES 針對 Raft 算法又做了哪些調整和升級?

參考 & 鳴謝

《小徐先生》

本文已收錄到我的面試小站 www.javacn.site,其中包含的內容有:Redis、JVM、併發、併發、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、消息隊列等模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章