ZK记录了主题与分区的关系
0 客户端的消息集
每个消息集偏移量,数据大小、数据内容等。
Meeage。scala中
1 日志结构
一个分区定义个独立的目录,多个segment(默认1g)
segment主要由3部分组成:
索引文件:后缀为.index的文件;
日志文件:后缀为.log的文件;
时间戳索引文件:后缀为timeindex的文件。
已中止(Aborted)
事务的索引文件(.txnindex)
segment 文件命名规则:partition 全局的第一个 segment从 0 开始,后续每个 segment 文件名为上一个 segment文件最后一条消息的 offset 值进行递增。数值最大为 64 位long 大小,20 位数字字符长度,没有数字用 0 填充。如:
第一个 log 文件的最后一个 offset 为:5376,下一个segment 的文件命名为:
00000000000000005376.log
00000000000000005376.index
00000000000000005376.timeindex
每个segment文集都有一个基准的offset,
1 日志偏移元数据
下一个偏移量的源数据
日志结尾偏移量的元数据
最高水位的元数据
2数据文件
每间隔indexIntervalBytes才会创建一条索引(稀疏索引)
3 索引文件
索引偏移量是相对的
log文件
每条Message包含了以下三个属性:
offset
MessageSize
data
offset
为long类型
2 写入
3 日志读取
1 选取分段:将数据文件分段,每段放在一个单独的数据文件里,由于文件命名与offset有关,所以在查找指定offset的数据时,使用二分查找法可快速定位到segment;
2 查找索引文件:数据文件分段使得可以在一个较小的数据文件中查找对应offset的数据了,但是这依然需要顺序扫描整个文件。为了进一步提高查找的效率,Kafka为每个分段后的数据文件建立了索引文件。其包含两个部分:
相对offset:这里的相对offset和log文件里的offset不同,相对offset是每个segment都从1开始的,而绝对offset在整个partition中都是唯一的。举例:分段后的一个数据文件的offset是从20开始,那么offset为25的数据在index文件中的相对offset就是25-20 = 5。存储相对offset可以减小索引文件占用的空间。
position:表示该条数据在数据文件中的绝对位置。只要打开文件并移动文件指针到这个position就可以读取对应的数据了
3 搜索
一条一条的搜索
4 0拷贝
处理客户端的拉请求,直接将问价传输到网络通信
4 日志管理
日志的创建、检索、清理
日志刷新策略和日志清理策略。
4.1 检查点文件
检查点表示已经刷到磁盘的位置,用于故障恢复。
1 启动管理类时,把每个分区对应的检查点作为恢复点
2 刷新日志,更新最新的偏移量最为日志的检查点
3 定时任务 定时刷盘
4.2 刷新日志(刷盘)
日志管理器会定时调度flushDirty方法,定期将页面缓存中的数据真正写到磁盘中,,每个log.fluish.interval.ms
4.3 清理日志
1 删除
时间和大小
删除日志的实现思路:当前最新的日志大小减去下一个即将删除的日志,小于阈值保留,大于则删除
删除是一个异步操作,在执行删除之前,要将日志分段从映射删除,并将日志分段的文件名(数据和索引文件)加上delete后缀。异步删除
2 压缩
对同一个key进行压缩