文章目录

  • 1.日志存储设计
  • 1.kafka日志
  • 2.底层文件系统
  • 3.索引文件
  • 3.1 .index 位移索引文件
  • 3.2 .timeindex 时间戳索引文件


1.日志存储设计

1.kafka日志

日志格式类型

  1. 松散结构化的日志(请求日志、错误日志或其他数据),这种日志主要用途就是方便人们阅读。
  2. 专门为程序访问的日志。(kafka日志属于类型2)

kafka日志设计更像是关系型数据库中的记录,或者是某些系统中的提交日志。kafka日志特点是按照时间顺序在日志尾部追加写入记录(Record)

kafka不会直接将原生消息写入日志文件,而是会将消息和一些必要的元数据信息打包在一起,封装成一个record写入日志。

kafka消息格式:自定义了消息格式,并且在写入日志前序列化成紧凑的二进制数组来保存日志。

kafka的日志设计都是以分区为单位的,即每个分区都有它自己的日志,该日志被称为分区日志partition log。

producer生产消息时需要确定该消息被发送到的分区,kafka broker把该消息写入到该分区对应的日志中。

分区和分区日志

查看kafka报错日志 kafka 日志_文件系统

具体对每个日志而言,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:根据给定的时间戳查找对应的位移信息。