kafka日志存储设计

1.日志存储设计

1.kafka日志

日志格式类型

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

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

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

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

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

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

分区和分区日志

分区和分区日志.jpg

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值