Kafka-分區日志文件的清理原理


Kafka-分區日志文件的清理原理

清理

一般情況下,kafka會根據設置的時間保留數據,把熬過時效的舊數據刪除掉。

早於保留時間的舊事件會被刪除,為每個鍵保留最新的值,從而達到清理的效果。只有當應用程序生成的事件里包含了鍵值對時,為這些主題設置compact策略才有意義。如果主題包含null鍵,清理就有失敗。

清理的工作原理

每個日志片段可以分為以下兩個部分

干凈的部分:這些消息之前被清理過,每個鍵只有一個對應的值,這個值是上一次清理時保留下來的。

污濁的部分:這些消息時上一次清理之后寫入的。

 

 

 

如果kafka啟動時啟用了清理功能(log.cleaner.enabled參數),每個broker會啟動一個清理管理器線程和多個清理線程,它們負責執行清理任務。這些線程會選擇污濁率(污濁消息占分區總大小的比例)較高的分區進行清理。

為了清理分區,清理線程會讀取分區的污濁部分,並在內存里創建一個mapmap里的每個元素包含了消息鍵的散列值和消息的偏移量,鍵的散列值是16B,加上偏移量總共是24B。如果要清理一個1GB的日志片段,並假設每個消息的大小為1KB,那么這個片段就包含一百萬個消息,而我們只需要24MBmap就可以清理這個片段。如果有重復的鍵,可以重用散列項,從而使用更少的內存。這是非常高效的。

kafka配置中可以對map使用的內存大小進行配置。每個線程都有自己的map,而這個參數指的是所有線程可使用的內存總大小。如果為map分配了1GB內存,並使用了5個清理線程,那么每個線程可以使用200MB內存來創建自己的mapkafka並不要求分區的整個污濁部分來適應這個map的大小,但要求至少有一個完整的片段必須符合。如果不符合,那么kafka就會報錯,要么配置分配更多的內存,要么減少清理線程數量,讓每個線程可用內存變大。如果只有少部分片段可以完全符合,kafka將從最舊的片段開始清理,等待下一次清理剩余的部分。

清理線程在創建好偏移量map后,開始從干凈的片段處讀取消息,從最舊的消息開始,把它們的內容與map里的內容進行比對。它會檢查消息的鍵是否存在於map中,如果不存在,那么說明消息的值是最新的,就把消息復制到替換片段上。如果鍵已存在,消息會被忽略,因為在分區的后部已經有一個具有相同鍵的消息存在。在復制完所有消息之后,我們就將替換片段與原始片段進行交換,然后開始清理下一個片段。完成整個清理過程之后,每個鍵對應一個不同的消息,這些消息的值都是最新的。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM