面試官:Kafka和ES選主有什么區別?
Kafka 和 ES 都是用來處理大數據的中間件,一個是消息中間件的代表(Kafka),另一個是大數據搜索引擎的代表(ES)。它們在 Java 領域的使用非常廣泛,在大數據方面就更不用說了,但它們的選主(選擇主節點)有什么關聯與區別呢?接下來,我們一起來看。
1.基礎概念
(1)什么是Kafka?
Kafka 是一個分布式流處理平臺,由 LinkedIn 公司開發和維護,之后成為 Apache 軟件基金會的一部分。它主要是為處理實時數據而設計的,是一個高吞吐量的分布式發布訂閱消息系統。
Kafka 集群組成如下:
“說明:每個 Broker 就是一個 Kafka 實例(其中的 Broker 1 為 Controller,也就是主 Broker),一個 Broker 中有多個 Topic,一個 Topic 中有多個分區,分區分為兩類:Leader 分區和 Follower 分區。
(2)什么是ES?
ES 全稱 Elasticsearch,是一個開源的高擴展的分布式全文檢索引擎。它可以近乎實時地存儲、檢索數據,并且具有出色的擴展性,可以擴展到上百臺服務器,處理 PB 級別的數據。Elasticsearch 使用 Java 開發,并使用 Apache Lucene 作為其核心來實現所有索引和搜索的功能,但它通過簡單的 RESTful API 來隱藏 Lucene 的復雜性,使得全文搜索變得簡單。
ES 集群組成如下:
“說明:一個 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),這三者身份的轉換如下:
leader -> follower:倘若 leader 發現當前系統中出現了更大的任期,則會進行“禪讓”,主動退位成 follower。這里 leader 發現更大任期的方式包括:
- 向 follower 提交日志同步請求時,從 follower 的響應參數中獲得。
- 收到了來自新任 leader 的心跳或者同步日志請求。
- 收到了任期更大的 candidate 的拉票請求。
follower -> candidate:leader 需要定期向 follower 發送心跳,告知自己仍健在的消息。倘若 follower 超過一定時長沒收到 leader 心跳時,會將狀態切換為 candidate,在當前任期的基礎上加 1 作為競選任期,發起競選嘗試補位。
candidate -> follower:candidate 參與競選過程中,出現以下兩種情形時會退回 follower:
多數派投了反對票。
競選期間,收到了任期大于等于自身競選任期的 leader 傳來的請求。
candidate -> leader:candidate 競選時,倘若多數派投了贊同票,則切換為 leader。
candidate -> candidate:candidate 的競選流程有一個時間閾值. 倘若超時仍未形成有效結論(多數派贊同或拒絕),則會維持 candidate 身份,將競選任期加1,發起新一輪競選。
4.Raft選舉流程
Raft 算法的選舉流程如下圖所示:
它的投票流程有三種:
競選者投票給原 leader:
- 倘若該任期小于自身,拒絕,并回復自己的最新任期。
- 倘若該任期大于自身,退位為 follower,按照 follower 的模式處理該請求。
競選者投票給 follower:
倘若任期落后于自己,拒絕請求,并回復自己所在的任期。
倘若任期大于自己,判斷最后的同步日志是否夠新,如果比自己新就把這一票投給競選者,如果沒有自己新則拒絕。
競選者投票給 candidate:
倘若 leader 任期大于等于自己,同意此次投票,并退回 follower,按照 follower 模式處理請求。
如果 leader 任期小于自己,拒絕,并回復自己的最新任期。
每個競選者根據以上投票來決定新的 leader,如果有一個投票過半,那么它就升級為新的 leader,并把這個消息同步給其他節點。否則會開啟新的一輪投票,為了防止一直投票,會在開啟新一輪投票時,設置的隨機等待時間,和一定次數投票失敗后棄權的機制,來保證投票順利完成。