Kafka高可用實現

2022-03-06 03:13:51 字數 2333 閱讀 4063

資料儲存格式

kafka的高可靠性的保障**於其健壯的副本(replication)策略。乙個topic可以分成多個partition,而乙個partition物理上由多個segment組成。

segment分2部分:索引檔案和資料檔案。索引檔案儲存元資料,記錄了訊息在資料檔案中的偏移(offset),訊息有固定物理結構,保證了正確的讀取長度。

segment檔案帶來好處:方便過期檔案清理。只需要整體刪除過期的segment。以追加的方式寫訊息,順序寫磁碟極大提高了效率。

讀取某offset訊息的步驟變為:通過二分查詢,找到offset所在segment。通過segment的索引檔案,找到offset所在資料檔案的物理偏移。讀取資料。

副本複製與同步

從外部來看partition類似乙個不斷增長,儲存訊息的陣列,每個partition有乙個類似mysql binlog的檔案用來記錄資料的寫入。有兩個新名詞,hw(highwatermark)表示當前consumer可以看到partition的offset位置,leo(logendoffset)表示當前partition最新訊息的offset,各個副本單獨維護。為了提高訊息可靠性,partition有n個副本。

n個副本中,有乙個leader,餘下n-1個follower。kafka的寫操作只在leader副本上進行。通常這種副本寫有兩種方式:

leader寫日誌檔案成功即返回成功。這樣如果follower在同步完資料前leader當機,資料丟失。這種方式帶來較高效率。

leader等待follwer寫日誌成功並收到返回的acks後,才返回成功。這樣leader當機,重新選舉的leader與當機leader資料一致,資料不丟失。但因為要等待follwer返回,效率較慢。一般採用少數服從多數的選舉方式,如果要應對f個副本當機,則至少需要2f+1個副本並使中的f+1個寫成功。

kafka沒有使用上述機制。它實現了isr(in-sync replication)的機制。

isr(in-sync replication)機制

leader維護乙個副本佇列(包含leader自己),會及時將慢響應的follwer剔除,並將追上leader資料的follower重新加入副本佇列。

這樣要保證資料高可靠所需要的副本數更少。比如應對2臺機器的當機,isr機制只需要3個副本。而上述機制2則需要2*2+1個副本。這樣有效節約了大約一半的儲存空間。

leader當機,新的leader是從isr中按順序選出。leader恢復後成為follower,刪除上乙個hw後所有資料後,從新的leader進行同步。

資料可靠性配置

以下邏輯,可以保證一定程式資料可靠。當然副本越多,min.insync.replicas越大,則越可靠,但實際情況需要根據場景在效率與資料可靠上做權衡。

副本數設定為3。副本是kafka實現ha的基礎,通過replication.factor配置

min.insync.replicas設定為2。isr副本佇列中副本最小個數。極端情況下,isr中只有乙個leader副本,若leader當機則服務不可用。因此至少配置為2個。若isr中副本小於這個數字,producer返回異常。

配置leader選舉條件unclean.leader.election.enable=false,只允許leader從isr佇列中選出。

request.required.acks=-1(等待isr中的所有follower都收到資料才返回成功),producer.type=sync(同步呼叫)

以上,保證了乙個副本所在機器當機,kafka仍提供服務,且資料正確未丟失。

資料去重

以上配置,保證了只要leader返回成功,即不存在資料丟失。但考慮一種情況,producer提交寫請求到leader後,producer到leader網路斷開,此時producer認為寫失敗。但實際,follower正常同步到了leader資料,hw更新。

此時producer因為傳送失敗,會重發訊息。此時kafka中存在重複資料。這需要在consume時業務邏輯中去重。kafka本身不保證資料不重複。

kafka高效的幾個原因

1)架構層面 

乙個topic多partition部署實現並行處理,線性擴充套件 

isr副本複製機制實現效能與可用性的平衡

2)磁碟優化 

partition中順序寫磁碟 

mmap實現記憶體批量寫磁碟,減少i/o次數

3)網路優化 

sendfile系統呼叫實現零拷貝,減少上下文切換 

producer批量傳送,減少網路i/o次數 

支援資料壓縮

kafka的高可用

在kafka 引入replication之後,同乙個partition可能會有多個replica,而這時需要在這些replication之間選出乙個leader,producer和consumer只與這個leader互動,其它replica作為follower從leader中複製資料。因為需要保證同...

kafka是如何實現高可用的

kafka面試中,經常會被問到kafka是如何實現高可用的。ha,也就是高可用,kafka 0.8版本之前是沒有ha的,如果乙個broker掛了,那麼這個分割槽也就是掛了,分區內的訊息都沒辦法繼續被消費。kafka 0.8版本之後引入了副本機制 replicas 副本機制也是分布式系統中的常用的機制...

Kafka如何保證高可用

kafka 乙個最基本的架構認識 由多個 broker 組成,每個 broker 是乙個節點 你建立乙個 topic,這個 topic 可以劃分為多個 partition,每個 partition 可以存在於不同的 broker 上,每個 partition 就放一部分資料。如果用rabbitmq來...