日志索引
- 索引文件以稀疏索引的方式构造消息的索引,每当写入一定量,偏移量索引文件和时间戳索引文件分别增加一个偏移量索引项和时间戳索引项。
- 俩个索引文件采用二分查找快速定位
偏移量索引
- 日志分段后,为每个日志对象使用ConcurrentSkipListMap来保存各个日志分段,每个日志分段的baseOffset作为key,这样可以根据指定偏移量快速定位到消息所在的日志分段
时间戳索引
- 新追加的时间戳索引项中的timestamp必须大于之前追加的索引中的timestamp
- 日志分段处理同偏移量索引
- 俩个文件增加索引是同时进行的,但位置可能不同
日志清理
日志删除:按照一定条件进行删除
日志压缩:对消息的Key进行整合
日志存储
- Kafka依赖于文件系统(磁盘)来进行存储
高吞吐量的存储层次原因
- 磁盘的顺序写入
- 采用页缓存机制
- 由于进程内部的内存消耗,以及重启之后内存的重建,GC问题
- 零拷贝
- 依赖于底层的sendFile方法
- 请求内核把磁盘中的数据传输给Socket
- 省去Socket Buffer过程
- 经历过2次磁盘复制,上下文切换2次