0%

kafka之日志管理器

日志管理器

日志管理器是kafka用来管理所有日志的,负责管理日志的创建与删除、日志检索、日志加载和恢复、检查点及日志文件刷写磁盘以及日志清理等

kafka日志结构

kafka的消息是以主题为基本单位进行组织的,各个主题之间相互独立。每个主题在逻辑上又由一个或多个分区构成,分区数可以在创建主题的时候指定,也可以在主题创建后修改。每个分区可以有一个或多个副本,从副本中选出一个副本作为Leader,Leader负责与客户端进行读写操作,其他副本作为Follower。生产者将消息发送到Leader副本的代理节点,而Follower副本从Leader副本同步数据。

在存储结构上分区的每个副本在逻辑上对应一个Log对象,每个Log又划分为多个LogSegment,每个LogSegment包括一个日志文件和两个索引文件,其中两个索引文件分别为偏移量索引文件和时间戳索引文件。

在存储结构上每个分区副本对应一个目录,每个分区副本由一个或多个日志段(LogSegment)组成。每个日志段在物理结构上对应一个以.index后缀的偏移量索引文件、一个以.timeindex后缀的时间戳索引文件和一个以.log结尾的日志文件

  • log.segment.bytes 日志文件的大小(默认1073741824 1G)

  • log.index.interval.bytes 索引文件跨度 默认4K

日志文件

可以使用命令来查看消息内容

1
kafka-run-class.sh kafka.tools.DumpLogSegments --files 日志文件路径 --print-data-log

payload为消息体的实际内容

偏移量索引文件

偏移量索引文件存储了若干个索引条目,索引条目用来将逻辑偏移量映射成消息在数据文件中的物理位置,每个索引条目由offset和position组成,offset表示与之对应的数据文件中某条消息的offset,position为与之对应的数据文件中某条消息的position。

并不是每条消息都有索引,而是采用了稀疏索引的方式,每隔一定字节的数据建立一条索引。

通过索引文件,我们就能够根据指定的偏移量快速定位到消息物理位置。首先根据指定的偏移量,通过二分查找,查询出该偏移量对应消息所在的日志文件和索引文件,然后在索引文件中通过二分查找,查找值小于等于指定偏移量的最大偏移量,最后从查找出的最大偏移量处开始顺序扫描日志文件,直至在日志文件中查询到偏移量于指定偏移量相等的数据

时间戳索引文件

该索引文件与之对应的日志文件文件名相同,后缀为.timeindex,该索引文件包括一个8字节的时间戳字段和一个四字节的偏移量字段,时间戳记录的是该日志段目前为止最大的时间戳,偏移量则记录的是插入新的索引条目时,当前消息的偏移量

时间戳索引文件中的时间戳对应的类型可以是消息创建时间,也可以是消息写入数据文件的时间,也采用了稀疏存储的方式

日志清理

  • log.retention.check.interval.ms 每隔多久检查一次是否进行日志删除
  • log.retention.hours/log.retention.minutes/log.retention.ms 日志保留时长,默认为168小时,即7天
  • log.retention.bytes 基于日志大小来进行删除