1. 程式人生 > >kafka消息的可靠性

kafka消息的可靠性

分享 網易雲 csdn lin kafka 繼續 讀寫 cati str

本文來自網易雲社區

作者:田宏增


Kafka的高可靠性的保障來源於其健壯的副本(replication)策略。通過調節其副本相關參數,可以使得Kafka在性能和可靠性之間運轉的遊刃有余。Kafka從0.8.x版本開始提供partition級別的復制,replication的數量可以在$KAFKA_HOME/config/server.properties中配置。

Kafka中消息是以topic進行分類的,生產者通過topic向Kafka broker發送消息,消費者通過topic讀取數據。然而topic在物理層面又能以partition為分組,一個topic可以分成若幹個partition。Kafka中的消息以順序的方式存儲在文件中。

Kafka中的topic的partition有N個副本(replicas)。N個replicas中,其中一個replica為leader,其他都為follower, leader處理partition的所有讀寫請求,follower定期地去復制leader上的數據。

如果leader發生故障或掛掉,一個新leader被選舉並被接受客戶端的消息成功寫入。Kafka確保從同步副本列表中選舉一個副本為leader,或者說follower追趕leader數據。


Kafka的ack機制。

當producer向leader發送數據時,可以通過request.required.acks參數來設置數據可靠性的級別:

1(默認):這意味著producer在ISR中的leader已成功收到的數據並得到確認後發送下一條message。如果leader宕機了,則會丟失數據。

0:這意味著producer無需等待來自broker的確認而繼續發送下一批消息。這種情況下數據傳輸效率最高,但是數據可靠性確是最低的。

-1:producer需要等待ISR中的所有follower都確認接收到數據後才算一次發送完成,可靠性最高。但是這樣也不能保證數據不丟失,比如當ISR中只有leader時,這樣就變成了acks=1的情況。

Kafka中的消息以一下方式存儲到文件中。

技術分享圖片

HW是HighWatermark的縮寫,俗稱高水位,取一個partition對應的ISR中最小的LEO作為HW,consumer最多只能消費到HW所在的位置。另外每個replica都有HW,leader和follower各自負責更新自己的HW的狀態。對於leader新寫入的消息,consumer不能立刻消費,leader會等待該消息被所有ISR中的replicas同步後更新HW,此時消息才能被consumer消費。這樣就保證了如果leader所在的broker失效,該消息仍然可以從新選舉的leader中獲取。對於來自內部broKer的讀取請求,沒有HW的限制。

LEO:LogEndOffset的縮寫,表示每個partition的log最後一條Message的位置。

技術分享圖片


當leader掛了之後,現在B成為了leader,A重新恢復之後需要進行消息的同步,如果使用追加的方式那麽就會有冗余消息,所以A將自己的消息截取到HW的位置在進行同步。


網易雲免費體驗館,0成本體驗20+款雲產品!

更多網易研發、產品、運營經驗分享請訪問網易雲社區


相關文章:
【推薦】 Apache流框架Flink,SparkStreaming,Storm對比分析(一)
【推薦】 一行代碼搞定Dubbo接口調用

kafka消息的可靠性