kafka日誌儲存(五) LogSegment

2021-09-24 16:48:15 字數 1387 閱讀 7241

為了防止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 的訊息時,偏移量索引檔案和時間戳索引檔案分別增加乙個偏移...