首页 > 其他分享 >深入理解Kafka核心设计-日志存储

深入理解Kafka核心设计-日志存储

时间:2022-12-23 16:47:58浏览次数:39  
标签:文件 存储 偏移量 Kafka 索引 内存 磁盘 日志

一、文件系统中存储方式
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

相关文章

  • 【SQL Server】存储过程带参数输出——output
    在SQL Server 中,如果要用一个存储过程返回字符串应该怎么做?用output参数。错误方式接下来,展示一下,常见的错误方法CREATEPROCEDUREtestStringASBEGINRETURN......
  • SpringBoot2.x系列教程85--SpringBoot中整合阿里云OSS存储
    SpringBoot2.x系列教程85--SpringBoot中整合阿里云OSS存储作者:一一哥一.阿里云OSS简介1.存储服务简介我们进行项目开发,很多时候都需要进行文件、图片等的上传,对于很多项目......
  • 每天一点基础K8S--K8S中的存储方案PV、PVC
    持久卷PV官网文档https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/什么是PV和PVC持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员......
  • FastDFS客户端与自定义文件存储系统
    本文的前提是已经启动FastDFS的tracker和storage安装安装提供给大家的fdfs_client-py-master.zip到虚拟环境中 pipinstallfdfs_client-py-master.zip 链接:ht......
  • 自定义python Django文件存储系统
    在学习Django框架的时候,我们已经讲过,Django自带文件存储系统,但是默认文件存储在本地,在本项目中,我们需要将文件保存到FastDFS服务器上,所以需要自定义文件存储系统。自定义......
  • 【服务器数据恢复】Storwize系列存储设备raid5多块硬盘离线导致Mdisk失效,通用卷无法使
    服务器故障:某品牌Storwize系列存储中raid5阵列有一块硬盘出现故障离线,热备盘启用替换离线盘,开始同步数据。这时与离线盘同一组Mdisk中的另一块磁盘故障离线,热备盘同步失败,......
  • 开发日志
    作为个小白,开发过程中总会遇到一些困扰,也会有许多小惊喜,此日志作为一个笔记文档,随缘记录使用一个list接收一个字符串表示的列表,以","分隔statusList=newArrayList(S......
  • Flutter 持久化存储之数据库存储进阶
    前言在移动端,持久化存储需求越来越普遍,无论是单机模式还是配置数据,都离不开存储,SharedPreferences可以解决大部分的问题,但是比较复杂的数据就很难处理了,这里使用关系型数......
  • 简单介绍python 存储变量的几种方法
    这篇文章主要介绍了python存储变量的几种方法,包括numpy自带方法,pandas自带方法,sklearn的自带方法和pickle库操作方法,本文通过实例代码给大家介绍的非常详细,需要的朋友......
  • 每天一点基础K8S--K8S中的常用存储方案--emptyDir、hostPath、NFS
    这几天阳了,坐一会儿就腰痛K8S中的常用存储方案背景因为K8S的POD运行了最终的业务,而pod在控制器的管理下可能会出现重建,重建的pod是镜像的新实例,如果一些重要配置文件或......