1 Topic数据存储机制
Topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是Producer生产的数据。Producer生产的数据会被不断 追加到该log文件末端,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,将每个partition分为多个segment。每个segment包括:“.index”文件、“.log”文件和.timeindex等文件。这些文件位于一个文件夹下,该文件夹的命名规则为:topic名称+分区序号,例如:hello_world_topic-0。
index和log文件以当前segment的第一条消息的offset命名 。
[root@localhost hello_world_topic-0]# /usr/local/kafka/kafka1/bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index
Dumping ./00000000000000000000.index
offset: 0 position: 0
Mismatches in :/usr/local/kafka/logs1/hello_world_topic-0/./00000000000000000000.index
Index offset: 0, log offset: 2
[root@localhost hello_world_topic-0]# /usr/local/kafka/kafka1/bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.log
Dumping ./00000000000000000000.log
Starting offset: 0
baseOffset: 0 lastOffset: 2 count: 3 baseSequence: 0 lastSequence: 2 producerId: 1000 producerEpoch: 1 partitionLeaderEpoch: 3 isTransactional: true isControl: false deleteHorizonMs: OptionalLong.empty position: 0 CreateTime: 1663903326163 size: 144 magic: 2 compresscodec: snappy crc: 1233721335 isvalid: true
baseOffset: 3 lastOffset: 3 count: 1 baseSequence: -1 lastSequence: -1 producerId: 1000 producerEpoch: 1 partitionLeaderEpoch: 3 isTransactional: true isControl: true deleteHorizonMs: OptionalLong.empty position: 144 CreateTime: 1663903326172 size: 78 magic: 2 compresscodec: none crc: 1260434274 isvalid: true
index文件:index为稀疏索引,大约每往log文件写入4KB数据,会往index文件写入一条索引,参数log.index.interval.bytes默认4kb。 index文件中保存的offset为相对offset,这样确保offset的值所占的空间不会过大。
example:在如下Segement段文件中找到offset=600的Record。
1 522<offset=600<1005 定位到segement=1的索引文件。
2 定位offset, 587(65+522 ) <offset=600< 639(117+522),定位 6410<position <13795
3 在日志文件中找 position,6410开始找,找offset=600的文件。
2 文件清除策略
Kafka 中默认的日志保存时间为 7 天,可以通过调整如下参数修改保存时间。log.retention.hours 最低优先级小时默认 7天。
那么日志一旦超过了设置的时间,怎么处理呢?Kafka 中提供的日志清理策略有 delete 和 compact两种。
删除策略:
log.cleanup.policy = delete
(1)基于时间:默认打开。以 segment 中所有记录中的最大时间戳作为该文件时间戳。
(2)基于大小:默认关闭。超过设置的所有日志总大小,删除最早的 segment。 log.retention.bytes,默认等于-1,表示无穷大。
压缩策略:
compact日志压缩:对于相同key的不同value值,只保留最后一个版本。