kafka的存儲(chǔ)層主要包含 分區(qū),副本,日志,日志分段這些概念,以問(wèn)答的形式來(lái)描述
1.為什么kafka的每一個(gè)主題會(huì)有多個(gè)分區(qū)?
如果一個(gè)分區(qū),會(huì)造成日志文件集中在一個(gè)節(jié)點(diǎn)上,需要解決文件切分的問(wèn)題,多分區(qū)可以從源頭上保證日志文件分散在各分區(qū)節(jié)點(diǎn)上;而且,多分區(qū)情況下,生產(chǎn)者可以將一批消息寫(xiě)入不同分區(qū)節(jié)點(diǎn),不分區(qū)的話,寫(xiě)操作只能串行。讀操作同理,總結(jié)就是可以提高讀寫(xiě)性能。
2.為什么分區(qū)需要副本?
可用性的保證,主副本掛掉,備份副本可以頂上
3.消息寫(xiě)入最終是寫(xiě)到哪里?
寫(xiě)入到日志文件, 為防止隨著追加,日志文件不斷增大,采用日志分段的形式。每一個(gè)日志分段包含一個(gè)索引文件和一個(gè)數(shù)據(jù)文件
正常情況下,kafka的讀寫(xiě)都是順序讀寫(xiě),性能很高。如果需要讀取指定offset的消息。那么索引文件就可以起到作用了。
4.索引文件的特點(diǎn)?
1)稀疏索引,不會(huì)為每一條消息都建立索引
2)索引存儲(chǔ)的是相對(duì)偏移量和物理位置
3)偏移量是有序的,可以使用2分查找快速定位
4)索引可以通過(guò)內(nèi)存映射的方式放入內(nèi)存,加快查詢。
5.消息什么時(shí)候?qū)懭氲饺罩疚募?br> 日志管理器會(huì)定時(shí)調(diào)度f(wàn)lushDirtyLogs()方法將page cache中的消息真正刷寫(xiě)到磁盤(pán)日志文件上。刷寫(xiě)日志有兩種策略:時(shí)間策略與大小策略。
6.kafka的日志清除策略
1)刪除策略:直接刪除日志分段,確保磁盤(pán)空間不會(huì)一直膨脹
2)壓縮策略:只刪除相同的鍵但是偏移量比較舊的消息,保留最新的消息