当前位置: 首页 > news >正文

kafka 文件存储机制

文章目录

    • 1. 思考四个问题:
      • 1.1 topic中partition存储分布:
      • 1.2 partiton中文件存储方式:
      • 1.3 partiton中segment文件存储结构:
      • 1.4 在partition中如何通过offset查找message:
    • 2. kafka日志存储参数配置

  • Topic是逻辑上的概念,而partition是物理上的概念
  • 每个partition对应于一个log文件,该log文件中存储的就是Producer生产的数据。
  • Producer生产的数据会被不断追加到该log文件末端,为防止log文件过大导致数据定位效率低下(不需要先查出来数据,直接往最后追加,也是kafka可以高效读写的原因之一),Kafka采取了分片和索引机制,将每个partition分为多个segment。(segment默认大小为1GB)
    • 每个segment包括:“.index”文件、“.log”文件和.timeindex等文件。这些文件位于一个文件夹下,该文件夹的命名规则为:topic名称+分区序号,例如:first-0。

1. 思考四个问题:

  1. topic中partition存储分布
  2. partiton中文件存储方式
  3. partiton中segment文件存储结构
  4. 在partition中如何通过offset查找message

1.1 topic中partition存储分布:

  • 在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。
  • 每个partition下面有多个segment。

1.2 partiton中文件存储方式:

  • 每个partion(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。
  • 每个partiton只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定。

1.3 partiton中segment文件存储结构:

  • segment file由segment索引文件、数据文件2部分组成,这两个文件一一对应,后缀是”.index”和“.log”,分别表示为segment索引文件、数据文件
  • segment文件命名规则:partion全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。

1.4 在partition中如何通过offset查找message:

  • segment的索引文件命令规则:起始偏移量(offset)为0.后续每个segment文件名为上一个segment文件最后一条消息的offset值,所以,第二个文件00000000000000000522.index的文件名是上一个log中最大偏移量+1(521+1=522),其他后续文件依次类推,只要根据offset 二分查找 文件列表,就可以快速定位到具体文件。 当offset=600时定位到00000000000000000522.index|log,用index文件名上的数字+相对offset计算log文件中数据存在的位置,522+65=587,522+117=639,587 < 600 < 639,所以Offset=600的数据在position=6410的位置往下顺扫。

segment index file采取稀疏索引存储方式,不会为每条数据创建索引,大大的减少索了引文件大小。

2. kafka日志存储参数配置

参数描述
log.segment.bytesKafka 中 log 日志是分成一块块存储的,此配置是指 log 日志划分成块的大小,默认值 1G。
log.index.interval.bytes稀疏索引间存储数据的大小,默认 4kb,kafka 里面每当写入了 4kb 大小的日志(.log),然后就往 index 文件里面记录一个索引。

相关文章:

  • nextcloud 优化扩展
  • 基于YOLOv8算法的照片角度分类项目实践
  • 第十三、十四个知识点:用javascript获取表单的内容并加密
  • 电子电器架构 —— 网关测试脚本分析
  • ASP.NET Core MVC 控制查询数据表后在视图显示
  • 传输频宽是啥?对网速影响有多大?
  • Java基于微信小程序的驾校报名小程序,附源码
  • 十分钟学会用springboot制作微信小程序富文本编辑器
  • 负载均衡SLB
  • TCP 和 UDP的区别
  • Vite 下一代的前端工具链,前端开发与构建工具
  • 百面嵌入式专栏(面试题)C语言面试题22道
  • C++ 内存管理(newdelete)
  • c#: 表达式树的简化
  • 移动光猫gs3101超级密码及改桥接模式教程
  • [译]如何构建服务器端web组件,为何要构建?
  • 2017-09-12 前端日报
  • Angular 响应式表单 基础例子
  • css的样式优先级
  • ES6核心特性
  • Go 语言编译器的 //go: 详解
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • mysql中InnoDB引擎中页的概念
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • php面试题 汇集2
  • quasar-framework cnodejs社区
  • Vue2.0 实现互斥
  • 产品三维模型在线预览
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前端工程化(Gulp、Webpack)-webpack
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 三分钟教你同步 Visual Studio Code 设置
  • 深入浅出Node.js
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 温故知新之javascript面向对象
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 原生Ajax
  • 字符串匹配基础上
  • k8s使用glusterfs实现动态持久化存储
  • Spring Batch JSON 支持
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # centos7下FFmpeg环境部署记录
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #if 1...#endif
  • #每日一题合集#牛客JZ23-JZ33
  • $.each()与$(selector).each()
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (八)c52学习之旅-中断实验
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (顺序)容器的好伴侣 --- 容器适配器
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验