日志究竟是如何加载日志段的?
日志是日志段的容器,里面定义了很多管理日志段 的操作。总体上,该文件定义了 10 个类和对象
1、LogAppendInfo
保存了一组待写入消息的各种元数据信息。比如,这组消息中第一条消息的位移值是多少、最后一条消息的位移值是多少;再比如,这组消息中最大的消息时间戳又是多少。
2、Log
Log 源码中最核心的代码
3、RollParams
定义用于控制日志段是否切分(Roll)的数据结构。
4、LogMetricNames
定义了 Log 对象的监控指标。
5、LogOffsetSnapshot
封装分区所有位移元数据的容器类。
6、LogReadInfo
封装读取日志返回的数据及其元数据。
7、CompletedTxn
记录已完成事务的元数据,主要用于构建事务索引。
除了.log、.index、.timeindex 和.txnindex 文件,还有其他几种文件类型。
.snapshot 是 Kafka 为幂等型或事务型 Producer 所做的快照文件。鉴于我们现在还处于阅读源码的初级阶段,事务或幂等部分的源码我就不详细展开讲了。
.deleted 是删除日志段操作创建的文件。目前删除日志段文件是异步操作,Broker 端把日志段文件从.log 后缀修改为.deleted 后缀。如果你看到一大堆.deleted 后缀的文件名,别慌,这是 Kafka 在执行日志段文件删除。
.cleaned 和.swap 都是 Compaction 操作的产物,等我们讲到 Cleaner 的时候再说。
-delete 则是应用于文件夹的。当你删除一个主题的时候,主题的分区文件夹会被加上这个后缀。
-future 是用于变更主题分区文件夹地址的,属于比较高阶的用法。
Log类的初始化逻辑
1、创建日志分区路径
2、初始化Leader Epoch Cache
2.1 Leader Epoch 检查点文件
2.2 生成Leader Epoch Cache 对象
3、加载所有日志段对象
4、更新nextOffsetMetadata和logStartOffset
5、更新Leader Epoch Cache,清除无效数据