為了防止log檔案過大,把log切分成很多個日誌檔案,每個日誌檔案對應乙個logsegment,在logsegment中封裝乙個filemessageset和offsetindex物件。
class logsegment(val log: filemessageset,//操作對應日誌檔案filemessageset物件
val index: offsetindex,//操作索引檔案的offsetindex物件
val baseoffset: long,//第一條訊息的offset值
val indexintervalbytes: int,//索引項之間間隔的最下位元組數
val rolljitterms: long,
time: time) extends logging
if (messages.sizeinbytes > 0)
// 寫日誌檔案,更新bytessincelastindexentry
this.bytessincelastindexentry += messages.sizeinbytes
}} read方法讀取訊息,有四個引數
// startoffset指定讀取的起始訊息的offset
// maxoffset 讀取結束的offset,可以為空
// maxsize 指定讀取的最大位元組數
// maxposition 指定讀取的最大實體地址
def read(startoffset: long, maxoffset: option[long], maxsize: int, maxposition: long = size): fetchdatainfo =
//返回訊息
fetchdatainfo(offsetmetadata, log.read(startposition.position, length))
}
logsegment的recover方法根據日誌檔案重新索引檔案。
def recover(maxmessagesize: int): int =
//新增索引項
lastindexentry = validbytes
}//累加validbytes
validbytes += messageset.entrysize(entry.message)
}} catch
//對日誌檔案進行截斷,拋棄後面驗證失敗的message
val truncated = log.sizeinbytes - validbytes
log.truncateto(validbytes)
index.trimtovalidsize()
truncated
}
Kafka 日誌儲存原理
segment 檔案命名規則 partition 全域性的第乙個 segment從 0 開始,後續每個 segment 檔名為上乙個 segment檔案最後一條訊息的 offset 值進行遞增。數值最大為 64 位long 大小,20 位數字字元長度,沒有數字用 0 填充。如 第乙個 log 檔案的...
Kafka 日誌訊息儲存時間
分段策略屬性 屬性名含義 預設值log.roll.日誌滾動的週期時間,到達指定週期時間時,強制生成乙個新的segment 168 7day log.segment.bytes 每個segment的最大容量。到達指定容量時,將強制生成乙個新的segment 1g 1為不限制 log.retention...
Kafka日誌儲存解析(二)日誌索引
每個日誌分段檔案對應了兩個索引檔案,主要用來提高查詢訊息的效率。如上圖 kafka中的索引檔案屬於稀疏索引,不是所有的訊息都有對應的索引項。每當寫入一定量 由broker端引數log.index.interval.bytes指定,預設是4kb 的訊息時,偏移量索引檔案和時間戳索引檔案分別增加乙個偏移...