各中间件的文件存储结构分析/mq/db/es

前言

  说明

   本文主要介绍几个高性能中间件的磁盘文件存储结构、存储逻辑等,从而学习它们的设计思路。

  linux磁盘文件

  1. 硬盘的最小存储单位是扇区(Sector,512B),块(block)由多个连续的扇区组成,块的最常见的大小是4kb(8个连续的扇区组成)。
  2. 磁盘读取的基本单位是扇区(物理层),而操作系统(文件管理系统)读写的基本单位是块(逻辑层)。
  3. block:文件数据存储在块中,一个文件可能会占用多个块,但是一个块只能存放一个文件。
  4. inode:linux/unix文件系统的基础,每个文件都有一个inode,存储文件的元信息。虽然我们将文件存储在了块(block)中,但是我们还需要一个空间来存储文件的元信息metadata:如某个文件被分成几块、每一块在的地址、文件拥有者,创建时间,权限,大小等。这种 存储文件元信息的区域就叫inode(索引节点:indexNode)。
  5. 可以使用 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字节
  • 内容:存放的是稀疏索引(像跳表)并非全部,可以节约空间将索引全部加载进内存,缺点就是部分消息不能一次性定位。

图片引用自:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值