kafka深入理解

2021-10-03 01:27:50 字數 2571 閱讀 8983

對於傳統的message queue而言,一般會刪除已經被消費的訊息,而kafka集群會保留所有的訊息,無論其被消費與否。當然,因為磁碟限制,不可能永久保留所有資料(實際上也沒必要),因此kafka提供兩種策略去刪除舊資料。一是基於時間,二是基於partition檔案大小。可以通過配置$kafka_home/config/server.properties實現

kafka中每乙個分割槽partition都對應乙個日誌檔案,而日誌檔案又可以分為多個日誌分段檔案,這樣也便於日誌的清理操作。

kafka提供了兩種日誌清除策略:

(1)日誌刪除(log deletion)按照一定的保留策略來直接刪除不符合條件的日誌分段。

(2)日誌壓縮(log compaction)針對每個訊息的key進行整合,對於有相同key的不同value值,只保留最後乙個版本。

log.cleanup.policy來設定日誌的清除策略,預設策略為delete,即採用日誌刪除的清除的策略。如果要採用日誌壓縮的清除策略,設定為compact,並且還需要將log.cleaner.enable(預設值為true)設定為true。

在server.properity檔案中設定

//topic的分割槽是以一堆segment檔案儲存的,這個控制每個segment的大小

log.segment.bytes=1073741824

//啟用刪除策略,直接刪除,刪除後的訊息不可恢復

log.cleanup.policy=delete

//1、清理超過指定時間清理

log.retention.hours=16

//2、超過指定大小後,刪除舊的訊息

log.retention.bytes=1073741824

log.retention.hours=168 //7d,再刪除之前儲存乙個log segment 小時數,既,對所有topic預設資料儲存時間。
每個segment的大小為1gb,每5分鐘檢查一次是否有segment已經查過了7d,如果有將其標記為deleted。

標記為deleted的segment缺省會保留1天,清理執行緒會每隔15秒檢查一次,是否有標記為deleted的segment的保留時間超過一天了,如果有將其從檔案系統刪除。

大家注意,kafka清理時是不管該segment中的訊息是否被消費過,它清理的依據為是否超過了指定的保留時間,僅此而已。

log.retention.bytes=1048576 // 1m
你可以同時指定log.retention.bytes和log.retention.hours來混合指定保留規則。log.retention.minutes和log.retention.bytes任意乙個達到要求,都會執行刪除。一旦日誌的大小超過了log.retention.bytes就清除老的segment,一旦某個segment的保留時間超過了規定的值同樣將其清除。

參考:

kafka通過分割槽策略,將不同的分割槽分配在乙個集群中的broker上,一般會分散在不同的broker上,當只有乙個broker時,所有的分割槽就只分配到該broker上。

訊息會通過負載均衡發布到不同的分割槽上,消費者會監測偏移量來獲取哪個分割槽有新資料,從而從該分割槽上拉取訊息資料。

分割槽數越多,在一定程度上會提公升訊息處理的吞吐量,因為kafka是基於檔案進行讀寫,因此也需要開啟更多的檔案控制代碼,也會增加一定的效能開銷。

如果分割槽過多,那麼日誌分段也會很多,寫的時候由於是批量寫,其實就會變成隨機寫了,隨機 i/o 這個時候對效能影響很大。所以一般來說 kafka 不能有太多的 partition。

調整準則:

此引數決定的是records複製的數目,建議至少 設定為2,一般是3,最高設定為4。更高的replication factor(假設數目為n)意味著:

系統更穩定(允許n-1個broker宕機)

更多的副本(如果acks=all,則會造成較高的延時)

系統磁碟的使用率會更高(一般若是rf為3,則相對於rf為2時,會佔據更多50% 的磁碟空間)

調整準則:

partition 數目與replication factor是在建立乙個topic時非常重要的兩個引數,這兩個引數的取值會直接影響到系統的效能與穩定性。

盡量在第一次建立乙個topic時就指定這兩個引數,因為

如果partition 數目在之後再次做調整,則會打亂key的順序保證(同樣的key會分布到不同的partition上)

如果replication factor在之後再次增加,則會給集群帶來更大的壓力,可能會導致效能下降

參考:

segment file由2大部分組成,分別為index file(字尾」.index」)和data file字尾(「.log」),此2個檔案一一對應,成對出現,分別表示為segment索引檔案、資料檔案。

索引檔案的命名規則就是根據offset。partion全域性的第乙個segment從0開始,後續每個segment檔名為上乙個segment檔案最後一條訊息的offset值。

資料檔案就是用來儲存訊息的。

參考:

Kafka系列3 深入理解Kafka消費者

上面兩篇聊了kafka概況和kafka生產者,包含了kafka的基本概念 設計原理 設計核心以及生產者的核心原理。本篇單獨聊聊kafka的消費者,包括如下內容 概念kafka消費者物件訂閱主題並接收kafka的訊息,然後驗證訊息並儲存結果。kafka消費者是消費者組的一部分。乙個消費者組裡的消費者訂...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...