前言
说明
本文主要介绍几个高性能中间件的磁盘文件存储结构、存储逻辑等,从而学习它们的设计思路。
linux磁盘文件
- 硬盘的最小存储单位是扇区(Sector,512B),块(block)由多个连续的扇区组成,块的最常见的大小是4kb(8个连续的扇区组成)。
- 磁盘读取的基本单位是扇区(物理层),而操作系统(文件管理系统)读写的基本单位是块(逻辑层)。
- block:文件数据存储在块中,一个文件可能会占用多个块,但是一个块只能存放一个文件。
- inode:linux/unix文件系统的基础,每个文件都有一个inode,存储文件的元信息。虽然我们将文件存储在了块(block)中,但是我们还需要一个空间来存储文件的元信息metadata:如某个文件被分成几块、每一块在的地址、文件拥有者,创建时间,权限,大小等。这种 存储文件元信息的区域就叫inode(索引节点:indexNode)。
- 可以使用 stat 命令可以查看文件的 inode 信息。每个 inode 都有一个号码,Linux/Unix 操作系统不使用文件名来区分文件,而是使用 inode 号码区分不同的文件。
Kafka
每个分区会创建一个分区目录,分区目录下面存放的是日志文件(.log),名称相同的索引文件(.index / .timeIndex)
这里仅分析文件结构,更多实现细节查看:https://blog.csdn.net/songcf_faith/article/details/124741797
1.日志文件
- 命名:日志文件名为上一个log文件的最后一个offset的值+1,作为新的日志和索引文件名(索引和日志文件同名/仅后缀不同)。(比如00000000000000000271.log文件的上一个日志文件中最后的offset一定是270)
- 大小:每个日志文件大小默认1G,可根据log.segment.bytes配置;
- 内容:日志文件存储了消息的具体内容(offset、messageSize、data);offset类似消息自增id
- 清理:日志文件和索引文件会不断被清理,依赖于topic的保留时长(log.retention.ms)和保留字节大小(log.retention.bytes)决定。
2.索引文件
- 命名:同日志文件名,仅后缀不同。
- offset索引:索引文件每条记录包含相对offset(4B)和日志position(4B)两部分,共8字节
- time索引:索引文件每条记录包含时间戳(8B)和日志position(4B)两部分,共8字节
- 内容:存放的是稀疏索引(像跳表)并非全部,可以节约空间将索引全部加载进内存,缺点就是部分消息不能一次性定位。
图片引用自:

最低0.47元/天 解锁文章
830

被折叠的 条评论
为什么被折叠?



