一、文件系统中存储方式
1.1 树形结构图
1.2 目录结构
【分而治之】
一个topic有多个分区,一个分区就是一个Log(文件夹),文件夹命名方式:<topic>-<partition>
如创建订单topic:CREATE_ORDER 分了2个区,其在文件系统表现形式为 CREATE_ORDER-0 、 CREATE_ORDER-1
一个Log会分割成多个LogSegment(一个日志文件+两个索引文件)
日志文件baseOffset.log、偏移量索引文件baseOffset.index、时间戳索引文件baseOffset.timeindex
日志文件切割条件:
1、文件大小达到配置上限,默认1G
2、LogSegment中最大消息的最大时间戳与当前系统的时间戳差值达到配置值,默认7天
文件名以偏移量数字命名(baseOffset),大量数字被压缩能够节省存储空间
1.3 索引文件
偏移量索引文件用来建立消息偏移量(offset)到物理地址之间的映射关系,方便快速定位消息所在的物理文件位置
时间戳索引文件则根据指定的时间戳(timestamp)来查找对应的偏移量信息
Kafka 中的索引文件以稀疏索引(sparse index)的方式构造消息的索引,稀疏索引通过MappedByteBuffer将索引文件映射到内存中
索引文件切分条件:
偏移量索引文件或时间戳索引文件的大小达到配置上限,默认10M
注:偏移量大小用的是4个字节存储,追加的消息偏移量与当前分段日志base偏移量差值大于Integer.MAX_VALUE时,必定切分
1.4 文件清理
日志删除:不符条件直接删除,默认此项
保留策略:基于时间的保留策略、基于日志大小的保留策略、基于日志起始偏移量
日志压缩:相同key只保留最后一条版本
1.5 消息格式演变史
V0版本消息格式
V1版本消息格式
V2版本消息格式
二、磁盘的一些特性
2.1 常用存储介质速率快慢
寄存器(CPU直接访问)>缓存(L1、L2、L3)>内存>磁盘
其中磁盘顺序读写>内存随机读写,所以说kafka使用磁盘作为存储介质依然能够实现高性能消息中间件
2.2 操作系统对磁盘访问的优化技术
页缓存pagecache
磁盘读写以扇区为单位,大小512B(对磁盘结构有兴趣可以去了解下),一般程序对文件数据要求远大于512B,为防止一次取数据会发生多次磁盘IO,操作系统采取预读将连续的多个扇区加载至内存,并将数据驻留在页缓存中。
每次用户程序读取文件如在pagecahe匹配就直接返回,不发生磁盘IO
磁盘IO流程
用户程序发起系统调用read,CPU int中断进入内核态(线程上线文切换),通过DMA读取磁盘文件至内核空间(一次内存拷贝),再将内核数据复制给用户空间(一次内存拷贝)
零拷贝
非零拷贝
java零拷贝函数: FileChannal.transferTo()
底层用到的linux函数: sendfile()
将磁盘数据读取到内核空间,然后发送到网卡,不需要用户程序参与,所以整个过程仅发生一次线程上下文切换,0次内核空间到用户空间拷贝
其他:
内存映射
电梯算法
机械硬盘与固态硬盘的区别
标签:文件,存储,偏移量,Kafka,索引,内存,磁盘,日志 From: https://www.cnblogs.com/tsymqzq/p/17001007.html