Kafka是一个分布式流处理平台,它使用发布-订阅模型来处理消息流。Kafka的数据存储机制主要涉及到以下几个关键组件:Topics(主题)、Partitions(分区)和Segments(段)。
Topic(主题):
Partitions(分区):
Segments(段):
Kafka的数据存储机制的关键优点包括:
总之,Kafka的数据存储机制通过主题、分区和段的组织,支持高吞吐量的消息流处理,使其成为一种强大的数据流平台。

[root@localhost artisan-0]# /root/kafka/kafka/bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index
Dumping ./00000000000000000000.index
offset: 0 position: 0
Mismatches in :/tmp/kafka-logs/artisan-0/./00000000000000000000.index
Index offset: 0, log offset: 3
[root@localhost artisan-0]# /root/kafka/kafka/bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.log
Dumping ./00000000000000000000.log
Log starting offset: 0
baseOffset: 0 lastOffset: 3 count: 4 baseSequence: 0 lastSequence: 3 producerId: 2012 producerEpoch: 0 partitionLeaderEpoch: 0 isTransactional: false isControl: false deleteHorizonMs: OptionalLong.empty position: 0 CreateTime: 1698303603739 size: 137 magic: 2 compresscodec: none crc: 3622782875 isvalid: true
baseOffset: 4 lastOffset: 13 count: 10 baseSequence: 0 lastSequence: 9 producerId: 2013 producerEpoch: 0 partitionLeaderEpoch: 0 isTransactional: false isControl: false deleteHorizonMs: OptionalLong.empty position: 137 CreateTime: 1698304010395 size: 241 magic: 2 compresscodec: none crc: 1795667702 isvalid: true
baseOffset: 14 lastOffset: 23 count: 10 baseSequence: 0 lastSequence: 9 producerId: 2014 producerEpoch: 0 partitionLeaderEpoch: 0 isTransactional: false isControl: false deleteHorizonMs: OptionalLong.empty position: 378 CreateTime: 1698304027258 size: 241 magic: 2 compresscodec: none crc: 2868390514 isvalid: true
baseOffset: 24 lastOffset: 28 count: 5 baseSequence: 0 lastSequence: 4 producerId: 2017 producerEpoch: 0 partitionLeaderEpoch: 0 isTransactional: false isControl: false deleteHorizonMs: OptionalLong.empty position: 619 CreateTime: 1698304616155 size: 156 magic: 2 compresscodec: none crc: 1863625421 isvalid: true
baseOffset: 29 lastOffset: 33 count: 5 baseSequence: 0 lastSequence: 4 producerId: 2018 producerEpoch: 0 partitionLeaderEpoch: 0 isTransactional: false isControl: false deleteHorizonMs: OptionalLong.empty position: 775 CreateTime: 1698304624578 size: 156 magic: 2 compresscodec: none crc: 739158864 isvalid: true
baseOffset: 34 lastOffset: 43 count: 10 baseSequence: 0 lastSequence: 9 producerId: 3000 producerEpoch: 0 partitionLeaderEpoch: 0 isTransactional: false isControl: false deleteHorizonMs: OptionalLong.empty position: 931 CreateTime: 1698373784040 size: 181 magic: 2 compresscodec: snappy crc: 3489556255 isvalid: true
[root@localhost artisan-0]#

| 参数 | 描述 |
|---|---|
| log.segment.bytes | Kafka中log日志是分成一块块存储的,此配置是指log日志划分成块的大小,默认值1G。 |
| log.index.interval.bytes | 默认4kb,Kafka里每当写入了4kb大小的日志(.log),然后就往index文件里面记录一个索引。稀疏索引。 |
Kafka的日志清理策略是为了管理磁盘上的数据,确保系统的性能和可用性。日志清理策略通常与消息日志的保留策略相关。以下是Kafka的日志清理策略的要点:
日志保留策略:
log.retention.ms参数)或消息数量(通过log.retention.bytes参数)。Segments(段):
日志清理策略类型:
消息日志清理的触发:
log.retention.ms)、日志大小(log.retention.bytes)、活动日志段的数量和特定主题的配置。日志清理的影响:
总之,Kafka的日志清理策略是一个关键组成部分,用于管理消息日志的大小和维护磁盘空间。根据业务需求,可以选择不同的保留策略和清理策略,以满足数据保留、性能和可用性方面的要求。
3.那么一旦超过了设置的时间就会采取清理策略,清理策略有两种:delete和compact
delete日志删除:将过期数据删除。
配置:log.cleanup.policy=delete
基于时间:默认打开,以segment中所有记录中的最大时间戳作为文件时间戳
基于大小:默认关闭,超过设置的所有日志大小,删除最早的segment。
log.retention.bytes,默认等于-1,表示无穷大。

Kafka本身是分布式集群,可以采用分区技术,并行度高
读数据采用稀疏索引,可以快速定位要消费的数据
顺序写磁盘
Kafka的producer生产数据,要写入到log文件中,写的过程是一直追加到文件末端,为顺序写。官网有数据表明,同样的磁盘,顺序写能到600M/s,而随机写只有100K/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。


| 参数 | 描述 |
|---|---|
| log.flush.interval.messages | 强制页缓存刷写到磁盘的条数,默认是long的最大值,9223372036854775807。一般不建议修改,交给系统自己管理。 |
| log.flush.interval.ms | 每隔多久,刷数据到磁盘,默认是null。一般不建议修改,交给系统自己管理。 |
