Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kafka的位移索引和时间戳索引

Kafka的位移索引和时间戳索引

作者头像
JavaEdge
发布于 2021-02-23 07:05:52
发布于 2021-02-23 07:05:52
1.7K0
举报
文章被收录于专栏:JavaEdgeJavaEdge

Kafka的数据路径下有很多.index.timeindex后缀文件:

  • .index文件,即Kafka中的位移索引文件
  • .timeindex文件,即时间戳索引文件。

1 OffsetIndex - 位移索引

1.1 定义

用于根据位移值快速查找消息所在文件位置。

每当Consumer需要从topic分区的某位置开始读消息时,Kafka就会用OffsetIndex直接定位物理文件位置,避免从头读取消息的I/O性能开销。

不同索引类型保存不同的 K.V 对。OffsetIndex的K即消息的相对位移,V即保存该消息的日志段文件中该消息第一个字节的物理文件位置。

相对位移

AbstractIndex类中的抽象方法entrySize定义了单个K.V对所用的字节数。 OffsetIndex的entrySize就是8,如OffsetIndex.scala中定义的那样:

相对位移是个Integer,4字节,物理文件位置也是一个Integer,4字节,因此共8字节。

Kafka的消息位移值是一个长整型(Long),应占8字节。在保存OffsetIndex的K.V对时,Kafka做了一些优化。每个OffsetIndex对象在创建时,都已保存了对应日志段对象的起始位移,因此,OffsetIndex无需保存完整8字节位移值。实际上,只需保存与起始位移的差值,该差值整型存储足矣。这种设计就让OffsetIndex每个索引项都节省4字节。

假设某一索引文件保存1000个索引项,使用相对位移值就能节省大约4M。 AbstractIndex定义了relativeOffset方法

  • 将一个Long位移值转换成相对偏移
  • 真正的转换

读取OffsetIndex时,还需将相对偏移值还原成之前的完整偏移。

  • parseEntry:构造OffsetPosition所需的Key和Value
  • 该方法返回OffsetPosition类型。因为该类的俩方法分别返回索引项的K、V。
  • physical

写索引项 - append

通过Long位移值和Integer物理文件位置参数,然后向mmap写入相对位移值、物理文件位置

Truncation 截断

将索引文件内容直接裁剪掉部分。比如,OffsetIndex索引文件中当前保存100个索引项,现在只想保留最开始40个索引项。

  • truncateToEntries

使用OffsetIndex

OffsetIndex被用来快速定位消息所在的物理文件位置,那么必然需定义一个方法执行对应的查询逻辑。这个方法就是lookup。

该方法返回的,是不大于给定位移值targetOffset的最大位移值,以及对应的物理文件位置。你大致可以把这个方法,理解为位移值的FLOOR函数。

2 TimeIndex - 时间戳索引

2.1 定义

用于根据时间戳快速查找特定消息的位移值。

TimeIndex保存<时间戳,相对位移值>对:

  • 时间戳需长整型存储
  • 相对偏移值使用Integer存储

因此,TimeIndex单个索引项需要占12字节。 存储同数量索引项,TimeIndex比OffsetIndex占更多磁盘空间。

2.2 写索引

  • maybeAppend

向TimeIndex写索引的主体逻辑,是向mmap分别写入时间戳和相对偏移值。 除校验偏移值的单调增加性之外,TimeIndex还会确保顺序写入的时间戳也单调增加。

不单调增加会咋样?

向TimeIndex索引文件中写入一个过期时间戳和位移,就会导致消费端程序混乱。因为,当消费者端程序根据时间戳信息去过滤待读取消息时,它读到了这个过期时间戳并拿到错误位移值,于是返回错误数据。

3 总结及 FAQ

虽然OffsetIndexTimeIndex是不同类型索引,但Kafka内部把二者结合使用。通常先使用TimeIndex寻找满足时间戳要求的消息位移值,然后再利用OffsetIndex定位该位移值所在的物理文件位置。因此,它们其实是协作关系。

  • 二者的 broker 端参数都是log.index.size.max.bytes
  • 为什么需要一起使用,消费者不是根据Offset找到对于位置值开始消费就好吗?而且结合使用性能也应该降低吧? 没错。不过一般情况下消费者并不是直接能够定位目标offset,相反地它是通过时间戳先找到目标offset。

不要对索引文件做任何修改!擅自重命名索引文件可能导致Broker崩溃无法启动的场景。虽然Kafka能重建索引,但随意删除索引文件很危险!

  • 建立分区初始化的时候,log-segment的位移索引和时间索引文件将近有10M的数据? 里面为空,只是预分配了10MB的空间
  • kafka记录消费者的消费offset是对消费者组,还是对单个消费者?比如一个消费者组中新加入一个消费者,分区重新分配,那新加入的消费者是从哪里开始消费? 针对消费者组,或者说针对每个group id。保存的是三元组。新增消费者拿到要消费的分区后,去查看有无对应的三元组记录,如果没有,则根据consumer端参数auto.offset.reset值来决定从哪里开始消费
  • Kafka没有提供延时消息机制,只能自己实现的哈。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kafka竟然也用二分搜索算法查找索引!
难得的是,Kafka的索引组件中应用了二分查找算法,而且社区还针对Kafka自身的特点对其进行了改良。
JavaEdge
2021/02/23
6540
Kafka竟然也用二分搜索算法查找索引!
Kafka存储机制解析:如何确保数据不丢失?
Apache Kafka 诞生于对海量实时日志流处理的迫切需求,其设计目标是应对每天千亿级规模的日志数据吞吐。这种规模的数据流具有两个显著特征:
Lion 莱恩呀
2025/04/29
1110
Kafka存储机制解析:如何确保数据不丢失?
Kafka 消息存储与索引设计
消息中间件的性能好坏,它的消息存储的机制是衡量该性能的最重要指标之一,而 Kafka 具有高性能、高吞吐、低延时的特点,动不动可以上到几十上百万 TPS,离不开它优秀的消息存储设计。下面我按照自己的理解为大家讲解 Kafka 消息存储设计的那些事。
张乘辉
2020/12/31
1.4K0
Kafka 高性能之 Page Cache 的应用哲学
Kafka 的消息存储会按照该 Topic 的 Partition 进行保存,即每个 Partition 都有属于自己的日志,在 Kafka 中被称为分区日志(partition log)。
码哥字节
2024/07/04
1540
Kafka 高性能之 Page Cache 的应用哲学
大数据开发:Kafka日志结构
Kafka作为大数据技术生态的重要组件,尤其是实时流数据处理场景下,作为分布式生产/消费系统,得到广泛的重用。而Kafka在数据生产和消费上,日志是主要的场景。今天的大数据开发学习分享,我们就来讲讲kafka日志结构的基础。
用户1483438
2022/04/07
5010
kafka的86条笔记,全会的肯定是高手
更多内容: https://github.com/pierre94/kafka-notes
皮皮熊
2020/06/02
7540
Kafka源码解析之日志段类LogSegment
如上图可见,Kafka日志对象由多个日志段对象组成,而每个日志段对象会在磁盘上创建一组文件,包括不止如下:
JavaEdge
2021/02/23
6210
Kafka源码解析之日志段类LogSegment
让面试官直拍大腿的回答!谈谈你对Kafka数据存储原理的理解
一位5年工作经验的小伙伴面试的时候被问到这样一个问题,说”谈谈你对Kafka数据存储原理的理解“。
Tom弹架构
2023/09/07
2160
让面试官直拍大腿的回答!谈谈你对Kafka数据存储原理的理解
Kafka学习五
前面我们知道其重要的启动方法里面有关的方法:它的注释是非常具有启发性的, 启动API,以启动Kafka服务器的单个实例。实例化LogManager,SocketServer和请求处理程序-KafkaRequestHandlers。也即告诉我们它会启动kafka服务实例,同时实例是单个的,同时里面实例化日志管理器、socket服务器、kafka请求处理器。而启动kafka服务中,不免会启动kafka控制器,而kafka控制器中涉及到主从broker服务、主从副本、状态机、监听、重平衡以及与其他broker通信。下面我们来看日志相关的信息:
路行的亚洲
2020/11/03
5420
Kafka日志分段与消息查找
Kafka作为一个消息中间件(后面Kafka逐渐转向一个流失处理平台KafkaStream),消息最终的存储都落在日志中。
shysh95
2020/03/06
4K0
Kafka日志分段与消息查找
kafka位移
消费者提了异步 commit 实际还没更新完offset,消费者再不断地poll,其实会有重复消费的情况?
Michel_Rolle
2023/11/14
2.7K0
Kafka面试题系列之进阶篇
__consumer_offsets:作用是保存 Kafka 消费者的位移信息 __transaction_state:用来存储事务日志消息
Spark学习技巧
2022/01/13
5910
Kafka面试题系列之进阶篇
kafka日志段如何读写?
作者:Hollis 本文已收录至我的GitHub 引子 之所以写这篇文章是因为之前面试时候被面试官问到(倒)了,面试官说:“你说你对Kafka比较熟?看过源码? 那说说kafka日志段如何读写的吧?”
Java3y
2020/07/09
1K0
kafka日志段如何读写?
关于Kafka,你必须要知道的offset知识。
对于Kafka中的分区而言,它的每条消息都有唯一的offset,用来表示消息在分区中对应的位置。对于消费者而言,它也有一个offset的概念,消费者使用offset来表示消费到分区中某个消息所在的位置。在Kafka中其实有关于offset有两个含义。我这里主要分享消费者提交offset问题。首先我们来看一下issue:https://github.com/confluentinc/confluent-kafka-go/issues/195,涉及到问题:Why CommitOffsets() does not increment the offset like Commit()【为什么CommitOffsets和Commit方法一样不能增加offset】。里面有个正确答案:提交的offset等于msg.offset+1。为什么是这样的呢?我们来深入了解一下。
公众号-利志分享
2022/04/25
7120
关于Kafka,你必须要知道的offset知识。
消息中间件—Kafka数据存储(一)
摘要:消息存储对于每一款消息队列都非常重要,那么Kafka在这方面是如何来设计做到高效的呢? Kafka这款分布式消息队列使用文件系统和操作系统的页缓存(page cache)分别存储和缓存消息,摒弃了Java的堆缓存机制,同时将随机写操作改为顺序写,再结合Zero-Copy的特性极大地改善了IO性能。而提起磁盘的文件系统,相信很多对硬盘存储了解的同学都知道:“一块SATA RAID-5阵列磁盘的线性写速度可以达到几百M/s,而随机写的速度只能是100多KB/s,线性写的速度是随机写的上千倍”,由此可以看出对磁盘写消息的速度快慢关键还是取决于我们的使用方法。鉴于此,Kafka的数据存储设计是建立在对文件进行追加的基础上实现的,因为是顺序追加,通过O(1)的磁盘数据结构即可提供消息的持久化,并且这种结构对于即使是数以TB级别的消息存储也能够保持长时间的稳定性能。在理想情况下,只要磁盘空间足够大就一直可以追加消息。此外,Kafka也能够通过配置让用户自己决定已经落盘的持久化消息保存的时间,提供消息处理更为灵活的方式。本文将主要介绍Kafka中数据的存储消息结构、存储方式以及如何通过offset来查找消息等内容。
用户2991389
2018/09/05
9280
消息中间件—Kafka数据存储(一)
你可能需要的Kafka面试题与部分答案整理
场景:数据比较集中且实时要求不是太高,如果同步处理,假如业务高峰需要4台服务支撑,那么在业务高峰过了之后,就会出现资源闲置,如果引入消息队列的话,将数据放到消息队列后直接返回成功,提升了响应时间,真正的业务在消息队列后面消费处理,可能2台服务就能够支撑的住,而且流量更加均匀。
大数据真好玩
2020/02/13
8940
万字干货:Kafka 高可靠高性能原理探究
引言 在探究 Kafka 核心知识之前,我们先思考一个问题:什么场景会促使我们使用 .Kafka? 说到这里,我们头脑中或多或少会蹦出异步解耦和削峰填谷等字样,是的,这就是 Kafka 最重要的落地场
腾讯云中间件团队
2023/04/06
1.9K0
万字干货:Kafka 高可靠高性能原理探究
Kafka详解日志结构
Kafka 作为大数据技术生态的重要组件,尤其是实时流数据处理场景下,作为分布式生产/消费系统,得到广泛的重用。而 Kafka 在数据生产和消费上,日志是主要的场景。今天的大数据开发学习分享,我们就来讲讲 kafka 日志结构的基础。
857技术社区
2022/05/17
6800
Kafka详解日志结构
【kafka原理】kafka Log存储解析以及索引机制
启动之后kafka-client发送一个topic为消息szz-test-topic的消息
石臻臻的杂货铺[同名公众号]
2021/07/14
2.3K0
kafka 的内部结构和 kafka 的工作原理
让我们开始安装kafka。下载最新的 Kafka 版本并解压缩。打开终端并启动 kafka 和 zookeeper。
用户4235284
2023/10/14
2340
kafka 的内部结构和 kafka 的工作原理
相关推荐
Kafka竟然也用二分搜索算法查找索引!
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档