Apache Kafka源码剖析:第6篇 日志存储系列1-基本概念
Apache Kafka源码剖析:第6篇 日志存储系列1-基本概念
强子哥哥 发表于4个月前
Apache Kafka源码剖析:第6篇 日志存储系列1-基本概念
  • 发表于 4个月前
  • 阅读 39
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

下面开始将日志存储相关。

1 基本概念

kafka使用日志文件来保存生产者发送的消息。

既然是文件,就有偏移量,在kafka中,我们用术语offset来表示这个偏移量。(逻辑值而非物理值)

那么每条记录就有一个自己唯一的offset,

本质都是一样的!

既然是唯一,那么就可以跟mysql中的主键类比起来,也就是说,offset唯一确定了分区中的一条消息,

这个很简单,没啥好说的。

 

注意:上面明确说了是确定分区中的一条消息,因为消息会入到一个topic的其中1个分区里,一个topic会包含多个分区,单一分区内消息有序,分区之间不保证有序,这一点一定要注意了!

 

可能很多人用过redis,对redis的快很有体验,那么对kafka的磁盘操作是否可以这么快表示怀疑,

真相只有1个,那就是顺序IO操作,顺序IO操作到底嘛意思?就是磁盘不用花时间去寻道寻址了,否则读写磁头换来换去,把磁头累的不行了,效率还低。。。得不偿失,所以顺序IO!!!避免了随机写入带来的性能问题。

 

我们知道,topic分成多个分区partition,每个分区分成多个副本,

小贴士:
想一想mongodb和elasticsearch的存储机制,是不是很熟悉,
这就对了,技术的解决方案都是类似的。

存储一定是有状态的,只有涉及到网络的才是无状态的。

当1个分区的副本被指定到某个broker上,自然就要创建相应的文件夹了,文件夹里放日志log文件!

---

kafka中一般存储了海量数据,为了避免日志文件太大,Log不是只写成1个文件

想一想,如果只有1个文件,那得多大。。。怎么写,怎么删除?
管理都不好管理!!!

既然不是写成1个文件,那是啥?对应到磁盘上的一个目录,目录的命名规则是

topic_partitionid, log和分区是一一对应的,对应分区里的消息全部存储在这个分区目录下的日志文件里。

 

刚才说了,一个分区对应一个目录,目录里不是放一个文件,就是多个文件,每个文件我们称之为segment,分段,也就是把一个大文件拆分成多个小文件。

每个文件称之为 segment. 一个segment对应着一个日志文件和一个索引文件。

这就比较清楚了,不需要解释了!

日志文件用于记录具体的真实的消息,索引自然是为了加速,想想mysql的索引,一个意思。

随着消息的写入,段文件越来越大,到达一个阈值后,就创建新的日志文件和索引文件继续写

其实也就是产生了新的段segment文件!

 

文件名的规则是baseOffset.log,怎么理解 baseOffset?

就是本文件包含的第一条消息的offset,我们之前说了分区内消息是绝对有序的,拆分成多个segment后

单个segment也是绝对有序的,这个不需要解释了!

 

为了提高查询效率,每个日志文件对应了一个索引文件,但是,这个索引文件没有为每条消息都创建索引项,而是采用稀疏索引的方式为部分消息创建索引!

这样,找的时候,先通过二分法快速找到大致区域,然后在小范围内快速遍历,搞定!

下一节开始讲解代码!

标签: Kafka
共有 人打赏支持
强子哥哥
粉丝 836
博文 686
码字总数 713911
作品 8
×
强子哥哥
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: