文档章节

Apache Kafka源码剖析:第6篇 日志存储系列1-基本概念

强子1985
 强子1985
发布于 2017/08/13 16:04
字数 965
阅读 158
收藏 0

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

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也是绝对有序的,这个不需要解释了!

 

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

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

下一节开始讲解代码!

© 著作权归作者所有

共有 人打赏支持
强子1985

强子1985

粉丝 864
博文 997
码字总数 679817
作品 8
南京
架构师
apache kafka技术分享系列(目录索引)

目录索引: Kafka使用场景 1.为何使用消息系统 2.我们为何需要搭建ApacheKafka分布式系统 3.消息队列中点对点与发布订阅区别 kafka开发与管理: 1)apachekafka消息服务 2)kafak安装与使用 ...

dannyhe
2015/09/06
453
1
分布式消息系统 Kafka 简介

Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。 ...

大数据之路
2014/08/19
0
0
Kafka日志存储系统和offset查找逻辑

起始篇 1,kafka通过文件系统来保存和缓存处理的消息,每个发送到kafka的消息,都会被记录到日志文件中,由partition的leader记录,并由partition的follower同步。 2,kafka的消息采用顺序写...

lkforce
2017/09/05
0
0
Java后端工程师学习大纲

之前自己总结过的Java后端工程师技能树,其涵盖的技术点比较全面,并非一朝一夕能够全部覆盖到的。对于一些还没有入门或者刚刚入门的Java后端工程师,如果一下子需要学习如此多的知识,想必很...

JackFace
2016/07/08
567
0
源码圈 365 胖友的书单整理

🙂🙂🙂关注微信公众号:【芋道源码】有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码的疑问...

芋道源码掘金Java群217878901
2017/09/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

idea 通过jpa自动生成实体类

引入jpa包 打开persistence窗口 右键选择连接数据库 如果数据库没配置,则可以在下图选项中配置 选择好数据库和实体类的生成地址

斩神魂
30分钟前
1
0
tcpdump 命令

TCPDUMP简介 tcpdump 是一个很常用的网络包分析工具,可以用来显示通过网络传输到本系统的 TCP/IP 以及其他网络的数据包。tcpdump 使用 libpcap 库来抓取网络报,这个库在几乎在所有的 Linu...

寰宇01
38分钟前
2
0
软件的Alpha、Beta、RC、GA版本的区别

Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。 Beta:也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出。 RC:(Release Candidate) 顾名思义...

乔老哥
39分钟前
2
0
慢雾安全海贼王:从DApp亡灵军团,细说区块链安全

本文转载自微信公号“万向区块链”,为慢雾安全负责人海贼王在万向区块链实验室举办的2018上海区块链国际周-技术开放日上的演讲速记整理。 这张图总结了智能合约攻防的各个方面,分为两大部分...

万向区块链
45分钟前
13
0
Matlab编程之——卷积神经网络CNN代码解析

卷积神经网络CNN代码解析 deepLearnToolbox-master是一个深度学习matlab包,里面含有很多机器学习算法,如卷积神经网络CNN,深度信念网络DBN,自动编码AutoE ncoder(堆栈SAE,卷积CAE)的作...

酒逢知己千杯少
45分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部