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

Kafka 源码分析(一) 日志段

首先我们的 kafka 的消息本身是存储在日志段中的, 对应的源码是下面这段代码:

class LogSegment private[log] (val log: FileRecords,val lazyOffsetIndex: LazyIndex[OffsetIndex],val lazyTimeIndex: LazyIndex[TimeIndex],val txnIndex: TransactionIndex,val baseOffset: Long,val indexIntervalBytes: Int,val rollJitterMs: Long,val time: Time) extends Logging {}

一个日志段包含消息日志文件、位移索引文件、时间戳索引文件、已中止事务索引文件等。这里的 FileRecords 就是实际保存 Kafka 消息的对象。

索引文件通常是以.index 为结尾的:

  • .offsetIndex 我们可以根据位移索引文件定位到记录在那个log 文件,
  • .timeindex:是时间索引文件,是用来帮助Kafka通过时间戳来查找对应记录的位移信息。

在这里插入图片描述

  • baseOffset 表示基础偏移量, 对应着文件名称, 注意这个开始位移在一开始就是固定的。
  • indexIntervalBytes 值其实就是 Broker 端参数 log.index.interval.bytes 值,它控制了日志段对象新增索引项的频率。默认情况下一般需要达到4kb 才会创建新的索引项
  • rollJitterMs 是日志段对象新增倒计时的“扰动值”。因为目前 Broker 端日志段新增倒计时是全局设置,这就是说,在未来的某个时刻可能同时创建多个日志段对象,这将极大地增加物理磁盘 I/O 压力。有了 rollJitterMs 值的干扰,每个新增日志段在创建时会彼此岔开一小段时间,这样可以缓解物理磁盘的 I/O 负载瓶颈。

这个扰动值含义是当前避免同时多个线程同时向磁盘中写入对应的数据

关于这个LogSegment 是存在与之相关的方法的, 主要有三个方法, 分别是对应的 append 方法, read 方法, 以及对应的 recover 方法。

首先我们看一下对应的append 函数

def append(largestOffset: Long,largestTimestamp: Long,shallowOffsetOfMaxTimestamp: Long,records: MemoryRecords): Unit;
  1. 这个函数首先会判断当前日志段时候为空, 如果为null, 我们就需要写入对应的最大时间戳
  2. 确保对应的最大位移值是正确的, 如果不正确的话是不给写入的
  3. 执行真正的写入操作
  4. 更新最大时间戳, 最大的位移值
  5. 更新写入的字节数量

和日志段相关的第二个相关的操作是 read 函数, 这个函数接受了四个参数, 分别是:

  1. 要读取的第一条消息的位移
  2. 能读取消息的最大位移数量
  3. 能读取的最大文件位置
  4. 是否允许消息体过大的时候至少返回对应的消息

和日志段相关的第三个操作是 recover 函数,在消息系统中, 日志被分成了多个日志段, 每个日志段包含一定数量的消息,这些日志消息被保存在磁盘上面,

recover 方法的作用是确保在 Broker 启动时,能够正确地从磁盘加载日志段数据,并将其恢复到一个一致的状态,以便后续的读写操作能够正常进行。

http://www.lryc.cn/news/524759.html

相关文章:

  • javaEE初阶————多线程初阶(2)
  • Redis学习笔记1【数据类型和常用命令】
  • JavaWeb项目——查询角色列表到页面中——转发模式
  • feign调用跳过HTTPS的SSL证书校验配置详解
  • 今天也是记录小程序进展的一天(破晓时8)
  • SQL-leetcode—1084. 销售分析 III
  • Linux C\C++编程-文件位置指针与读写文件数据块
  • Flask简介与安装以及实现一个糕点店的简单流程
  • 【自动化测试】—— Appium使用保姆教程
  • 西门子【Library of General Functions (LGF) for SIMATIC S7-1200 / S7-1500】
  • IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载
  • Python----Python高级(正则表达式:语法规则,re库)
  • 通过Ukey或者OTP动态口令实现windows安全登录
  • Node.js接收文件分片数据并进行合并处理
  • Lsky-Pro在线图片搭建教程(Docker部署方式)
  • “深入浅出”系列之算法篇:(2)openCV、openMV、openGL
  • AI 新动态:技术突破与应用拓展
  • 从CRUD到高级功能:EF Core在.NET Core中全面应用(三)
  • 【记录】Jenkins版本及JDK关系介绍的官网地址
  • vue3-json-viewer和vue-json-pretty插件使用,vue3 json数据美化展示
  • python转转商超书籍信息爬虫
  • Spring Boot 中的 InitializingBean:Bean 初始化背后的故事
  • 微信小程序:实现单选,多选,通过变量控制单选/多选
  • MOS怎样选型,步骤详解
  • CMake技术细节:解决未定义,提供参数
  • 1688 满足跨境业务需求而提供的一组 API 接口
  • 物联网网关Web服务器--CGI开发实例BMI计算
  • 计算机网络 (51)鉴别
  • 【Docker】搭建一个功能强大的自托管虚拟浏览器 - n.eko
  • 论文笔记(六十二)Diffusion Reward Learning Rewards via Conditional Video Diffusion