面試官:Kafka和ES選主有什么區(qū)別?
Kafka 和 ES 都是用來處理大數(shù)據(jù)的中間件,一個是消息中間件的代表(Kafka),另一個是大數(shù)據(jù)搜索引擎的代表(ES)。它們在 Java 領(lǐng)域的使用非常廣泛,在大數(shù)據(jù)方面就更不用說了,但它們的選主(選擇主節(jié)點(diǎn))有什么關(guān)聯(lián)與區(qū)別呢?接下來,我們一起來看。
1.基礎(chǔ)概念
(1)什么是Kafka?
Kafka 是一個分布式流處理平臺,由 LinkedIn 公司開發(fā)和維護(hù),之后成為 Apache 軟件基金會的一部分。它主要是為處理實(shí)時數(shù)據(jù)而設(shè)計(jì)的,是一個高吞吐量的分布式發(fā)布訂閱消息系統(tǒng)。
Kafka 集群組成如下:
“說明:每個 Broker 就是一個 Kafka 實(shí)例(其中的 Broker 1 為 Controller,也就是主 Broker),一個 Broker 中有多個 Topic,一個 Topic 中有多個分區(qū),分區(qū)分為兩類:Leader 分區(qū)和 Follower 分區(qū)。
(2)什么是ES?
ES 全稱 Elasticsearch,是一個開源的高擴(kuò)展的分布式全文檢索引擎。它可以近乎實(shí)時地存儲、檢索數(shù)據(jù),并且具有出色的擴(kuò)展性,可以擴(kuò)展到上百臺服務(wù)器,處理 PB 級別的數(shù)據(jù)。Elasticsearch 使用 Java 開發(fā),并使用 Apache Lucene 作為其核心來實(shí)現(xiàn)所有索引和搜索的功能,但它通過簡單的 RESTful API 來隱藏 Lucene 的復(fù)雜性,使得全文搜索變得簡單。
ES 集群組成如下:
“說明:一個 ES 集群中只有一個 Master(主節(jié)點(diǎn))節(jié)點(diǎn),其他的為數(shù)據(jù)節(jié)點(diǎn)(還有其他節(jié)點(diǎn)類型,這里忽略),主節(jié)點(diǎn)協(xié)調(diào)整個集群的工作,數(shù)據(jù)節(jié)點(diǎn)中存儲了多個分片,每個分片分為兩種類型:主分片和副本分片(類似 Kafka 中分區(qū)的概念)。
2.Kafka和ES選主
Kafka 選主指的是選 Broker 中的 Controller,而 ES 選主指的是選取集群中的 Master,它們兩個的關(guān)聯(lián)是 Kafka 新版本(2.8 之后)和 ES 新版本(7.0 之后),它們的選主策略都是基于 Raft 算法實(shí)現(xiàn)的。
“PS:當(dāng)然,Kafka 中叫做 KRaft,ES 也是在 Raft 算法的基礎(chǔ)上擴(kuò)充了二階段選舉,但它們基于的底層算法都是 Raft 算法。
3.什么是Raft算法?
Raft 算法是一種分布式一致性算法,主要用于在分布式系統(tǒng)中實(shí)現(xiàn)數(shù)據(jù)副本的一致性。該算法是 Paxos 算法的工程實(shí)現(xiàn),其主要特點(diǎn)是通過較為簡單的算法實(shí)現(xiàn)分布式系統(tǒng)的數(shù)據(jù)一致性和高可用。
“Raft 算法的核心是通過選舉投票,少數(shù)人服從多數(shù)人的原則(投票過半原則),如果有一半以上的人投票給某個節(jié)點(diǎn)作為 Leader,那么它就是新的 Leader。
在 Raft 算法中,分布式系統(tǒng)中的所有節(jié)點(diǎn)被劃分為三種角色:領(lǐng)導(dǎo)者(Leader)、追隨者(Follower)和候選人(Candidate),這三者身份的轉(zhuǎn)換如下:
leader -> follower:倘若 leader 發(fā)現(xiàn)當(dāng)前系統(tǒng)中出現(xiàn)了更大的任期,則會進(jìn)行“禪讓”,主動退位成 follower。這里 leader 發(fā)現(xiàn)更大任期的方式包括:
- 向 follower 提交日志同步請求時,從 follower 的響應(yīng)參數(shù)中獲得。
- 收到了來自新任 leader 的心跳或者同步日志請求。
- 收到了任期更大的 candidate 的拉票請求。
follower -> candidate:leader 需要定期向 follower 發(fā)送心跳,告知自己仍健在的消息。倘若 follower 超過一定時長沒收到 leader 心跳時,會將狀態(tài)切換為 candidate,在當(dāng)前任期的基礎(chǔ)上加 1 作為競選任期,發(fā)起競選嘗試補(bǔ)位。
candidate -> follower:candidate 參與競選過程中,出現(xiàn)以下兩種情形時會退回 follower:
多數(shù)派投了反對票。
競選期間,收到了任期大于等于自身競選任期的 leader 傳來的請求。
candidate -> leader:candidate 競選時,倘若多數(shù)派投了贊同票,則切換為 leader。
candidate -> candidate:candidate 的競選流程有一個時間閾值. 倘若超時仍未形成有效結(jié)論(多數(shù)派贊同或拒絕),則會維持 candidate 身份,將競選任期加1,發(fā)起新一輪競選。
4.Raft選舉流程
Raft 算法的選舉流程如下圖所示:
它的投票流程有三種:
競選者投票給原 leader:
- 倘若該任期小于自身,拒絕,并回復(fù)自己的最新任期。
- 倘若該任期大于自身,退位為 follower,按照 follower 的模式處理該請求。
競選者投票給 follower:
倘若任期落后于自己,拒絕請求,并回復(fù)自己所在的任期。
倘若任期大于自己,判斷最后的同步日志是否夠新,如果比自己新就把這一票投給競選者,如果沒有自己新則拒絕。
競選者投票給 candidate:
倘若 leader 任期大于等于自己,同意此次投票,并退回 follower,按照 follower 模式處理請求。
如果 leader 任期小于自己,拒絕,并回復(fù)自己的最新任期。
每個競選者根據(jù)以上投票來決定新的 leader,如果有一個投票過半,那么它就升級為新的 leader,并把這個消息同步給其他節(jié)點(diǎn)。否則會開啟新的一輪投票,為了防止一直投票,會在開啟新一輪投票時,設(shè)置的隨機(jī)等待時間,和一定次數(shù)投票失敗后棄權(quán)的機(jī)制,來保證投票順利完成。