Kafka複製原理

2021-08-18 21:33:44 字數 2904 閱讀 2698

每個主題都有多個分割槽

每個分割槽都會有自己的多個副本

每個分割槽與自己的副本之間都會有乙個leader

同一主題下的不同分割槽包含的訊息不同(同一條訊息不會出現在多個分割槽中)

由於訊息是以可追加的log日誌儲存到分割槽中的,多個分割槽順序寫磁碟的總效率要比隨機寫記憶體還要高

訊息被追加到分割槽日誌檔案時候都會分配乙個特定的偏移量(也就是訊息在區域中的位置offset,相當於坐(下)標)

offset是訊息在分割槽中的唯一標識,kafka通過offset來保證訊息在分割槽中的順序性

生產者與消費者只與leader副本互動, follower副本只負責同步leader訊息

分割槽中的所有副本統稱ar(assignedreplicas)

與leader副本同步pull訊息的副本組成isr(in-sync-replicas)

與leader副本同步期間有一定範圍許可的滯後的follower副本組成osr(out-sync-replicas)

ar=isr+osr

當所有的follower副本都與leader副本保持同步就是ar=isr,osr集合為空

leader副本負責維護和跟蹤isr集合中所有follower副本的滯後狀態

當follower副本落後太多或失效時,leader副本會把它從isr集合中剔除

如果osr集合中有follower副本同步追上leader副本,leader副本會把它從osr集合轉移至isr集合

預設下當leader副本發生故障後,只有isr集合內的副本有資格被選舉為新的leader

leader與hw(highwatermark)和leo(logendoffset)

leo是分割槽裡的最後一條訊息的下標+1,也就是指標指的是下乙個待寫入的訊息

hw是分割槽裡副本訊息同步數量最少的那個follower副本的最後一條訊息的下標

若某乙個分割槽的所有副本中,其中乙個的follower只同步了部分訊息,則hw會以follower副本裡訊息最少的那個下標為值

消費者只能消費hw以及之前的訊息(下標是從0開始,所以實際取的最後一條是hw-1的訊息)

所以kafka的複製機制不是真正意義上的同步複製,也不是單純的非同步複製。事實上,

同步複製要求所有能工作的follower副本都複製完,這條訊息才會被確認為已經提交成功,

這種複製方式極大地影響了效能

2.而在非同步複製方式下,follower副本非同步地從leader副本中複製資料,

資料只有被leader副本寫入就被認為已經成功提交,這種情況下,如果follower副本

都還沒有複製完而落後於leader副本,突然leader副本宕機,則會造成資料丟失。

kafka使用的這種isr方式則有效的權衡了資料可靠性和效能之間的關係

1.acks=-1或acks=all是時,生產者需要等待isr中所有的副本都成功寫入訊息後才能收到來自服務端的成功響應;這

種設定可達到最強的可靠性,要想獲得更高可靠性需要配合min.insync.replicas引數的聯動+

kafka的每個消費者都有乙個對應的消費組(邏輯概念),當訊息發布到主題後,只會被投遞給訂閱它的每個消費組的中乙個消費者。

kafka預設設定是每個消費組的消費者會平均分配訂閱主題的分割槽數,每個消費組只能消費分配到的分區內的訊息,也就是

說乙個分割槽只能被乙個同乙個消費組內的乙個消費者消費(分割槽是和消費者去直接對應,不和消費組關聯)。

eg1:主題a有4個分割槽,現在有兩個參與訂閱a的消費組x和y;x內有4個消費者,y內有2個消費者

-x和y訂閱a後,x的每個消費者只消費a的四個分割槽裡面的其中乙個分割槽,y內的2個消費者每個只負責消費a的兩個分割槽。

而每個消費者只能消費所分分配到的分區內的訊息。

eg2: 主題a有7個分割槽,現在只有乙個消費組x訂閱了a,而此時x內只有乙個消費者

-此時x訂閱後,只有乙個消費者消費a的7個分割槽

-接著,x消費組又加入了乙個消費者,則x組內共有兩個消費者,現在兩個消費者乙個消費4個分割槽,乙個消費3個分割槽。

-又接著乙個消費者加入了x消費組,則現在3個消費者共同消費7個分割槽

...當加入的消費者數量大於分割槽數的時候,也就是當第八個消費者加入x消費組的時候是無法消費任何分割槽訊息的,因為7個分割槽已經被其他7個消費者消費了。

(以上分配邏輯是預設的分割槽分配策略進行分析的)

當消費者個數大於分割槽個數就會有消費者分配不到任何分割槽而無法消費任何訊息。

訊息中介軟體,一般有兩種訊息投遞模式: 點對點(p2p)模式和發布-訂閱模式。

點對點模式是基於佇列的,訊息生產者傳送訊息到佇列,訊息消費者從佇列中接收訊息。發布-訂閱模式在訊息的一對多廣播時採用。

kafka同時支援兩種訊息投遞模式。

訊息的消費一般有兩種模式:push和pull。push模式是服務端主動將訊息推送給消費者,而pull模式是消費者

主動向服務端發起請求來拉取訊息。kafka的消費是基於pull模式的。本質是通過poll()方**詢拉取訊息

在每次呼叫poll()方法時,它返回的是還沒有被消費過的訊息集,要做到這一點就需要offset這個消費位移/偏移量

的記錄。而且這個位移必須做持久化儲存不單單是儲存在記憶體中,否則消費者重啟之後就無法知曉之前的消費位移,

在舊消費者客戶端中,offset是儲存在zk中的,而新客戶端中是儲存在kafka內部的主題_consumer_offsets中的。這裡

將offset持久化的動作也叫"提交",消費者在消費完訊息之後需要執行消費位移的提交。

q:分區內訊息的狀態分為已被消費者消費過的訊息和從未被消費過的訊息?

1.1 如果訊息有狀態的資訊是如何儲存的,狀態的區分是在訊息位移提交之前還是之後?

如果已被消費過的訊息 是不會被新的消費組消費麼(不會,新的消費組已經無法分配到更多的分割槽所以是多餘的)

消費組都是拉取這個分區內從未被消費過的所有訊息麼

分割槽一旦在第一次分給消費組之後便不會再次分配了麼?

KAFKA原理簡介

每條訊息在檔案中的位置成為offset 偏移量 offset為long型數字。過後無論是否被消費,都會被清楚。consumer儲存消費資訊的offset。kafka通過partition將日誌內容分散到多個server上,每個partition都會被 當前server儲存,kafka可以配置part...

kafka 原理分析

partition是以檔案的形式儲存在檔案系統中,比如建立乙個名為firsttopic的topic,其中有3個 partition,那麼在kafka的資料目錄 tmp kafka log 中就有3個目錄,firsttopic 0 3,命名規則是 sh kafka topics.sh create z...

Kafka架構原理

kafka是乙個分布式流式處理平台,具有三大主要功能 1 發布和訂閱訊息 2 高度容錯機制,訊息持久化儲存 3 實時訊息處理 kafka具有非常高的吞吐量,通常廣泛應用於兩大場景 1 做為系統或應用程式間的資料通道,進行資料傳輸 2 做為應用程式來進行實時資料處理 kafka提供了四大核心api 1...