Kafka 索引查找、文件存储、清除策略

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=600Record1  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值,只保留最后一个版本。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

响彻天堂丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值