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消费分区重平衡机制