首页  

kafka消息存储及索引机制     所属分类 kafka 浏览量 1047
num.partitions       默认分区数      
log.dirs              日志目录
offsets.topic.replication.factor	 offset topic 复制因子
log.index.interval.bytes	  默认4096
log.segment.bytes	 单个日志文件的最大大小	  1073741824

查看 topic 分区和副本 (leader Fllower)


bin/kafka-topics.sh  --describe --topic test_topic --zookeeper localhost:2181

/brokers/topics/test_topic/partitions/0/state

.log .index .timeindex   
文件名为 offset (前面补0)

.log    消息文件
.index  消息索引   根据offset定位具体的消息
.timeindex 时间索引文件  根据时间戳定位具体的消息

test_topic-0
    00000000000000000000.index	
    00000000000000000000.log	
    00000000000000000000.timeindex	
    leader-epoch-checkpoint
    
topicName_partitionId


文件内容查看 

bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.log
最后一行内容
baseOffset: 73 lastOffset: 73 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false position: 13053 CreateTime: 1607050637922 isvalid: true size: 179 magic: 2 compresscodec: NONE crc: 2076238732

bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.index

offset: 23 position: 4107
offset: 46 position: 8222
offset: 69 position: 12337


bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.timeindex

timestamp: 1607050817655 offset: 1380
timestamp: 1607050817926 offset: 1403
timestamp: 1607050818228 offset: 1426
timestamp: 1607050818531 offset: 1449


查找指定offset的Message

用二分查找确定在哪个LogSegment中 
打开Segment的index文件,用二分查找找到offset小于或等于指定offset的索引条目 
打开数据文件,从指定位置开始顺序扫描直到找到指定offset的Message


稀疏索引(sparse index)
写入 log.index.interval.bytes 消息之后 写 索引文件 index timeindex

通过 MappedByteBuffer 将索引文件映射到内存中


leader-epoch-checkpoint 的作用 leader epoch 机制,在每个副本日志目录下创建leader-epoch-checkpoint 文件,用于保存 leader 的 epoch 信息 格式为 epoch offset epoch leader 版本,是一个单调递增的一个正整数值,每次 leader 变更,epoch 版本都会 +1 offset 是每一代 leader 写入的第一条消息的offset 副本成为 leader 时 接收到消息时,把新的 leader epoch 以及 LEO 添加到 leader-epoch-checkpoint 文件中 LEO Log End Offset 当前日志文件中下一条待写入消息的offset 当副本变成 follower 时 发送 LeaderEpochRequest 请求给 leader 副本,请求包含 follower 中最新的 epoch 版本 leader 返回给 follower 的相应中包含了一个 LastOffset,如果 follower last epoch = leader last epoch,则 LastOffset = leader LEO,否则取大于 follower last epoch 中最小的 leader epoch 的 start offset 值 follower 拿到 LastOffset 之后,会对比当前 LEO 值是否大于 LastOffset,如果当前 LEO 大于 LastOffset,则从 LastOffset 截断日志 follower 开始发送 fetch 请求给 leader 保持消息同步
https://gitee.com/dyyx/kafkademo MappedByteBuffer 例子 https://gitee.com/dyyx/hellocode/blob/master/src/nio/FileChannelMapTest.java
kafka中的 AR OSR ISR HW 和 LEO kafka核心知识点 kafka集群搭建

上一篇     下一篇
busybox编译

linux netstat

linux 帮助命令使用

kafka消费机制要点

kafka消费端核心参数

kafka消费分区重平衡机制