我的 Kafka 旅程 - 文件存储机制

时间:2022-09-28 18:08:02

存储机制

Topic 在每个 Broker 下存储所属的 Partition,Partition下由 Index、Log 两类文件组成。

写入

Log 由多个Segment文件组成,接收到的新消息永远是以追加的方式于Segment文件中,每个Segment文件容量最多为1GB,Segment的文件个数随着数据量的累积而增加,每个消息有自增编号,这种只追加不修改的方式避免了变更前的查询消耗。

查询

Index 文件仅记录固定消息量的索引编号范围,Kafka在查询时,先从Index中定位到小范围的索引编号区间,再去Log中在小范围的数据块中查询具体数据,此索引区间的查询方式称为 - 稀疏索引。

高效读写

  • 分布式、多分区、各线程并行处理
  • 稀疏索引 - 小范围快速定位要消费的数据
  • 数据文件,只追加不修改的顺序写方式(利用了物理磁盘的优势)
  • 缓存技术 - 大量减少IO(由系统层面负责IO动作)
  • 零拷贝技术 - 解放CPU,大量减少数据块的Copy,数据直接从磁盘到网卡送出(利用了操作系统的技术)

文件清理

过期时长

# 数据文件过期时长配置项,三选一
log.retention.hours			# 小时,默认7天
log.retention.minutes			# 分钟
log.retention.ms			# 毫秒
# 删除的容量警戒值,默认-1无穷大
log.retention.bytes
# 检查过期间隔,默认5分钟
log.retention.check.interval.ms

清理方式

log.cleanup.policy = delect | compact

delect
1、以Segment文件最后一条消息的时间为删除依据,删除已过期的Segment整个文件。
2、以Log文件总大小为准,超过 log.retention.bytes 配置的警戒值,删除最早的Segment文件。

compact
对于相同的key,仅保留最后一次的value,所有数据启用压缩策略(offset的id就不会连续,后续说明)。