1.日志存储设计
1.kafka日志
日志格式类型
- 松散结构化的日志(请求日志、错误日志或其他数据),这种日志主要用途就是方便人们阅读。
- 专门为程序访问的日志。(kafka日志属于类型2)
kafka日志设计更像是关系型数据库中的记录,或者是某些系统中的提交日志。kafka日志特点是按照时间顺序在日志尾部追加写入记录(Record)。
kafka不会直接将原生消息写入日志文件,而是会将消息和一些必要的元数据信息打包在一起,封装成一个record写入日志。
kafka消息格式:自定义了消息格式,并且在写入日志前序列化成紧凑的二进制数组来保存日志。
kafka的日志设计都是以分区为单位的,即每个分区都有它自己的日志,该日志被称为分区日志partition log。
producer生产消息时需要确定该消息被发送到的分区,kafka broker把该消息写入到该分区对应的日志中。
分区和分区日志
具体对每个日志而言,kafka又将其细分成日志段文件log segment file,以及日志段索引文件。
分区日志构成:若干组日志段文件+索引文件。
2.底层文件系统
- .log文件:日志段文件,保存真实的kafka记录。每个.log文件都包含了一段位移范围内的kafka记录。 在创建topic时,kafka为该topic的每个分区在文件系统中创建了一个对应的子目录。命名规则: “-<分区号>”。如topic有2个分区,在文件系统中kafka会创建2个子目录:test-0,test-1。
- .log文件的命名规则:用文件的第一条记录的offset来命名此.log文件。
第一个文件0000…0000.log,一共20位数字,该数字表示该日志段的起始位置。(在kafka内部offset是用64位来保存的,但对于日志段文件而言,kafka只使用20位数字来标识offset通常已经足够)。例如:0000 0000 0000 0416 1281.log 说明该日志段的起始位移即第一条消息的位移是4161281,同时说明上一个文件 0000 0000 0000 0000.log文件中消息总数是4161280条。 - .log日志段文件是有大小限制的,默认是1GB。由broker参数:log.segment.bytes控制。
- 日志切分:当日志段文件填满记录后,kafka会自动创建一组新的日志段文件和索引文件。
- 当前激活日志段:kafka正在写入的分区日志段文件,当前日志段不会被清理。
3.索引文件
.index和.timeindex都属于稀疏索引sparse(/spa:s/) index file文件(kafka不会为每条信息记录都保存对应的索引项,而是等待写入若干条记录后才加一个索引项)。log.index.internval.bytes :索引文件间隔大小,默认是4KB。即kafka分区至少写入了4KB数据后才会在索引文件中添加一个索引项。
不论是位移索引还是时间戳索引文件,索引项都是按照某种规律进行升序排列。
- 位移索引按照位移顺序保存。
- 时间戳索引按照时间戳顺序保存。
- log.index.size.max.bytes :索引文件的最大文件大小,默认是10MB。
------>kafka可以利用二分查找算法来搜索目标索引项,时间复杂度O(lgN)。
3.1 .index 位移索引文件
.index:帮助broker更快的定位记录所在的物理文件位置。
3.2 .timeindex 时间戳索引文件
.timeindex:根据给定的时间戳查找对应的位移信息。