Kafka核心原理之消息存储机制

【图文详细 】Kafka消息队列——Kafka的核心组件 4.1、kafka的核心组件概述   Kafka 是 LinkedIn 用于日志处理的分布式消息队列,同时支持离线和在线日志处理。  Kafka 对消息保存时根据 Topic 进行归类: 发送消息者就是 Producer,消息的发布描述为 Producer 消息接受者就是 Consumer,消息的订阅描述为 Consumer 每个 Kafka 实例称为 Broker,将中间的存储阵... 阅读详情

消息存储机制

Kafka中消息是存储在磁盘上的,基本存储单元是Partition,一个Partition对应一个日志(Log),为了防止Log过大,Kafka又引入了日志分段(LogSegment)的概念,将Log切分为多个LogSegment ,相当于一个巨型文件被平分为多个相对较小的文件,便于消息的维护和清理。

Log和LogSegment不是纯粹物理意义上的概念,Log在物理上以文件夹的形式存储(格式:主题名-分区,如:一个名为order的主题存在两个分区,存储格式为:order-0、order-1),而每个LogSegment对应于磁盘上的一个日志文件和两个索引文件,以及可能的其他文件(如:以.txnindex为后缀的事务索引文件)。

如图所示:

日志分段

虽然一个Log被切分为多个分段,但只有最后一个LogSegment(当前活跃的日志分段)才能执行写入操作,在此之前所有的LogSegment都不能写入数据。当满足以下任一条件时会创建新的LogSegment:

  • 当前日志分段文件的大小超过了Broker端参数log.segment.bytes设置的值,默认1GB。
  • 当前日志分段中消息的最大时间戳与当前系统的时间戳的差值大于参数log.roll.m或log.roll.hours设置的值,默认为7天。
  • 偏移量索引文件或时间戳索引文件的大小达到Broker端参数log.index.size .max.bytes设置的值,默认为10M。
  • 追加消息的偏移量与当前日志分段的偏移量之间的差值大于Integr.MAX_VALUE。

Log文件在切分时,Kafka会关闭当前正在写入的LogSegment文件并置为只读模式,同时以可读写的模式创建新的LogSegment文件,文件大小默认为1GB。当下次Log切分时才会设置为LogSegment文件的实际大小。即:旧LogSegment文件大小为文件的实际大小,活跃LogSegment大小为默认的1GB。

日志分段详细信息:

kafka-run-class.sh kafka.tools.DumpLogSegments --files 00000000000000000000.log --print-data-log

Dumping 00000000000000000000.log
Starting offset: 0
baseOffset: 0 lastOffset: 3 count: 4 baseSequence: -1 lastSequence: -1 producerId: -1 producerEpoch: -1 partitionLeaderEpoch: 0 isTransactional: false isControl: false position: 0 CreateTime: 1660546405649 size: 117 magic: 2 compresscodec: NONE crc: 1789113225 isvalid: true
| offset: 0 CreateTime: 1660546405647 keysize: 1 valuesize: 6 sequence: -1 headerKeys: [] key: 1 payload: kafka1
| offset: 1 CreateTime: 1660546405648 keysize: 1 valuesize: 6 sequence: -1 headerKeys: [] key: 5 payload: kafka5
| offset: 2 CreateTime: 1660546405648 keysize: 1 valuesize: 6 sequence: -1 headerKeys: [] key: 7 payload: kafka7
| offset: 3 CreateTime: 1660546405649 keysize: 1 valuesize: 6 sequence: -1 headerKeys: [] key: 8 payload: kafka8

日志索引

索引的主要目的是提高查找的效率。

Kafka采用稀疏索引(Sparse Index)的方式构造消息的索引,它并不保证每个消息在索引文件中都有对应的索引项。而是当写入一定量(由Broker端参数log.index. interval.bytes指定,默认为4KB)的消息后,索引文件才会增加一个索引项。

偏移量索引

偏移量索引包含两部分数据,如图所示:

  • relativeOffset:相对偏移量,表示消息相对于baseOffset的偏移量,当前索引文件的文件名即为baseOffset。
  • position:物理地址,指的是消息在日志分段文件中对应的物理位置。

消息查找过程。如图所示:

假设要查找偏移量为23的消息,先通过二分法在偏移量索引文件中找到不大于23最大索引项,即:[22 656],再从日志分段文件中的物理地址656开始顺序查找偏移量为23的消息。

如果要查找要查找下图中偏移量为268的消息:

查找步骤:

  • 1)定位到baseOffset=251的日志分段。
  • 2)计算相对偏移量relativeOffset:268 - 251=17。
  • 3)在baseOffset=251的索引文件中找到不大于17的索引项。
  • 4)根据索引项中的物理地址(position)从baseOffset=251的日志分段中顺序查找目标消息。

如何查找baseOffset=251的日志分段的呢?

Kafka使用了跳跃表结构,每个日志对象中使用ConcurrentSkipListMap来保存各个日志分段,每个日志分段以baseOffset作为key ,这样就可以根据指定偏移量(251<偏移量268<378,因此要查找的日志分段为251)来快速定位消息所在的日志分段。

时间戳索引

时间戳索引(时间戳索引名与偏移量索引名一样,只是文件后缀不一样(即:.timeindex和.index))包含两部分数据,如图所示:

  • timestamp:当前日志分段最大的时间戳。
  • relativeOffset:时间戳所对应的消息的相对偏移量,即:偏移量索引中偏移量。

时间戳索引文件中包含若干时间戳索引项,每个追加的时间戳索引项中的timestamp必须大于之前追加的索引项的timestamp ,否则不予追加。

消息查找过程如图所示:

假如要查找指定时间戳targetTimeStamp = 1526384718288开始的消息,首先找到不小于指定时间戳的日志分段。这里无法使用跳跃表来快速定位相应的日志分段, 需要分以下几个步骤来完成:

  • 1)targetTimeStamp和每个日志分段中的最大时间戳对比,直到找到不小于targetTimeStam所对应的日志分段。注:日志分段中的最大时间戳的计算是先查询该日志分段所对应的时间戳索引文件,找到最后一条索引项,若最后一条索引项的时间戳字段值大于0 ,则取其值,否则取该日志分段的最近修改时间。
  • 2)找到对应的日志分段后,在时间戳索引文件中使用二分查找算法查找到不大于 targetTimeStamp最大索引项(即:[1526384718283, 28]),从而找到相对偏移量28。
  • 3)再从偏移量索引文件中使用二分法查找到不大于28的最大索引项(即:[26,838])。
  • 4)最后根据物理地址838从步骤1中找到的日志分段中顺序查找目标消息。

日志清理

Kafka将消息存储在磁盘中,为了控制磁盘占用空间的不断增加,需要对消息做一定的清理操作。Kafka提供了两种日志清理策略:

  • 日志删除:按照一定的保留策略直接删除不符合条件的日志分段,默认策略。
  • 日志压缩:针对每个消息的Key进行整合,对于有相同key不同value的消息,只保留最后一个版本。

日志删除

kafka有专门的任务来周期性删除不符合条件的日志分段文件,删除策略主要以下有3种:

1)基于时间

Broker端可通过参数配置来设置日志的最大保留时间,默认7天。定时任务会查看每个分段的最大时间戳,若最大时间戳距离当前时间超过7天,则需要删除。

删除日志分段时, 首先会从跳跃表中移除待删除的日志分段,保证没有线程对这些日志分段进行读取操作,然后将待删除日志分段对应的所有文件添加上.delete的后缀。最后由专门的定时任务来删除以.delete为后缀的文件。

2)基于日志大小

日志删除任务会检查当前日志的大小是否超过设定的阀值(参数:retentionSize)来寻找可删除的日志分段的文件集合(deletableSegments)。

注意:这里的日志的大小是指所有Segment的总和,不是单个Segment。

如图所示:

首先计算日志文件的总大小和设定阈值的差值(即:计算需要删除的日志总大小),然后从日志文件中的第一个日志分段开始进行查找可删除的日志分段,放入deletableSegments集合中 ,最后进行删除。删除过程与基于时间删除策略一致。

3)基于日志起始偏移量

一般情况下,日志文件的起始偏移logStartOffset等于第1个日志分段的baseOffset ,但logStartOffset是可以被修改的。该策略会判断某个日志分段的下一个日志分段的起始偏移量baseOffset是否小于等于logStartOffset ,是则将其放入deletableSegments集合中,最后进行删除。删除过程与基于时间删除策略一致。

如图所示:

日志压缩

对于有相同key不同value值的消息,只保留最后一个版本。如果应用只关心key对应的最新value值,则可以开启日志压缩功能,Kafka会定期将相同key的消息进行合井,只保留最新的value值。

如图所示:

Kafka的数据存储 kafka数据存储详细说明 阅读详情

相关推荐

AMD锐龙笔记本隐藏玩法:分核降压+ PBO2超频全攻略(以5900HX/6900HX为例)

本文详细解析了AMD锐龙笔记本(以5900HX/6900HX为例)的分核降压与PBO2超频技术,帮助用户释放处理器隐藏性能。通过BIOS设置、Curve Optimizer参数调整及稳定性测试,实现性能提升与温度控制的完美平衡,适合硬件爱好者进阶调校。

weixin_30617737的博客 349

kafka的消息存储在哪里?

对于一个分布式的流数据处理平台,消息存储在哪里是极为重要的。那么kafka的数据存储在哪里呢? 先说结论: kafka放弃的Java的堆存储,改为使用磁盘(使用文件系统和操作系统的页缓存),同时将随机写改为顺序写,建立在文件追加的基础上,极大提高io性能。 首先要知道几个概念 Partition:每个主题又被分成一个或者若干个分区(Partition)。每个分区在本地磁盘上对应一个文件夹,分区命名规则为主题名称后接“—”连接符,之后再接分区编号,分区编号从0开始至分区总数减-1; LogSegme

weixin_46378680的博客 5839

告别Win11睡眠假死:深入解析Modern Standby S0与S3冲突及注册表修复方案

本文深入解析了Windows 11中Modern Standby(S0)与传统睡眠(S3)模式的冲突,该冲突是导致电脑睡眠后出现假死、断网等问题的根源。文章提供了通过修改注册表键值(PlatformAoAcOverride)强制启用稳定S3睡眠的终极修复方案,并附有详细诊断步骤与避坑指南,帮助用户彻底解决睡眠故障。

ol789012的博客 823

Kafka中的消息是如何存储的?

Kafka 的消息存储是基于日志文件和分区的,确保了消息的可靠性、持久性和高吞吐量。消息被追加到日志文件中,每个消息都有唯一的偏移量,分区和副本机制保证了数据的冗余存储和可用性。这种设计使 Kafka 成为一个可信赖的消息传递系统,适用于各种实时数据处理、日志聚合和事件驱动应用程序。Kafka 中的消息是以文件的方式持久化到磁盘中进行存储的,这是 Kafka 的一个关键特性,确保消息的可靠性和可用性。

越努力越幸运。 886

[后端设计]innovus命令editPin详解?

先放命令,有空慢慢写。

m0_61003348的博客 5738

2026年数据中心运行与管理专业人才培养基地建设方案(高职、数据中心运行与管理新专业、人才培养、专业代码:510310)

摘要: 为响应国家“东数西算”战略和数字经济需求,我校拟联合行业领军企业建设数据中心运行与管理人才培养基地。项目基于国家政策引导和产业快速发展背景,针对行业10万人才缺口,对标教育部新设专业标准(510310),分三阶段实施五年规划:专业奠基(2026-2028)、内涵深化(2028-2029)、辐射引领(2030-2031)。建设内容涵盖校企协同岗位能力分析、模块化课程开发(如网络管理、自动化运维等)、实训基地搭建及“课证融通”培养模式,重点培养基础设施、网络服务、运维托管三类岗位技能人才,目标建成区域性

啊碧根果的博客 1690

Kafka系列——详解kafka消息的物理存储及分区分配,清理等功能

Kafka 的基本存储单元是分区。分区无法在多个 broker 间进行再细分,也无法在同一个broker 的多个磁盘上进行再细分。所以,分区的大小受到单个挂载点可用空间的限制(一个挂载点由单个磁盘或多个磁盘组成,如果配置了 JBOD就是单个磁盘,如果配置了RAID,就是多个磁盘。在配置 Kafka 的时候,管理员指定了一个——也就是 log.dirs 参数的值(不要把它与存放错误日志的目录混淆了,日志目录是配置在 log4j.properties 文件里的)。该参数一般会包含每个挂载点的目录。

zekser的博客 1841

基于Spring Boot在线远程考试系统的设计与实现

结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。目前的信息时代,对信息的管理趋于高效化,便捷化,这也是计算机大力普及所带来的便利,此程序软件在设备选用上,依靠的是比较大众的电脑设备,对电脑的配置没有过多要求,一般学校的计算机机房的电脑都可以满足程序开发需求,另外,开发出此款程序,让信息处理变得高效率,其所带来的高效益是远超程序开发的低成本的,因此程序开发的资金投入是可以忽略不计的。

ITbiyesheji的博客 1218

Kafka消息存储

Kafka消息存储

an13654067079的博客 1136

SAP生产订单技术性完成(TECO)操作指南与实战应用

生产订单技术关闭操作指南主要包括单笔和批量关闭两种方式,通过CO02/COHV事务码完成。

m0_47402127的博客 1932

【WRF安装第三期(Ubuntu)】搭建WRF编译所需系统-第三方依赖库安装

WRF安装第三期:搭建WRF编译所需系统-第三方依赖库安装

WW、forever的博客 3139

Kafka史上最详细原理总结

Kafka Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。 1.前言 消息队列的性能好坏.

s275287998的博客 3512

把开源 Skills 集成到 LangGraph 项目

1. 定义智能体状态(必须包含 messages,其他字段按需扩展)messages: List[HumanMessage | AIMessage | ToolMessage] # 消息流(核心)skill_output: Optional[str] # 存储 Skill 执行结果next_node: str # 控制流程跳转# 2. 定义智能体决策节点(决定是否调用 Skill)"""智能体决策逻辑:根据用户输入判断是否调用开源 Skill"""# 获取最后一条用户消息。

lpfasd123的博客 906

1、Kafka与消息队列核心原理详解

本文系统梳理了 Kafka 消息队列的核心原理,包括架构组成、数据存储、分区与副本机制、消息消费流程、offset 管理及高效查找策略。通过顺序写入、分段索引和消费者组机制,Kafka 实现了高吞吐、可扩展和高可用,广泛应用于日志收集、流式处理等分布式场景。

梦想飞舞的专栏 1423

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

消息中间件_Kafka

Kafka的数据按照topic来存储并分区,每个分区的数据再分段储存,包含有两个核心文件,log用来存储数据,index用来记录数据的偏移量.当log文件等于1G时,新的会写入到下一个分段中.查询时根据index来读取数据.kafka-topics.sh --zookeeper localhost:2181 --create --topic toipc名称 --partitions 2 --replication-factor 2。③消息队列:结合消息和队列,并提供了各种API和底层优化设计的应用框架.

weixin_43875878的博客 1112

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

一、kafka原理、部署安装、常用命令

kafka的基本原理kafka的安装部署kafka的常用命令一、Kafka基本原理Kafka架构它的架构包括以下组件:Broker:Kafka节点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群。Topic:一类消息,消息存放的目录即主题,例如page view日志、click日志等都可以以topic的形式存在,Kafka集群能够同时负责多个topic的分发。P...

hannuotayouxi的博客 3535

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

kafka消息队列

消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到MQ中而不用管谁来取,消息使用者只管从MQ中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。

悟已往之不谏 825

你说嘴巴嘟嘟,ok我是扣码,现在开始学kafka

包括你的Kafka集群的各种元数据,比如说每台机器上有哪些partition,谁是leader,谁是follower,是谁来管理的?生产者生产的消息按照一定的分区策略被发送到topic中partition中,partition在磁盘上就是一个目录,该目录名是topic的名称加上一个序号,在这个partition目录下,有两类文件,一类是以log为后缀的文件,一类是以index为后缀的文件,每一个log文件和一个index文件相对应,这一对文件就是一个segment file,也就是一个段。

m0_47443458的博客 274

Kafka - 底层存储机制:日志分段与索引文件设计

Kafka 底层存储机制解析 Kafka 采用分区+日志分段存储设计,每个分区由多个日志段(.log文件)和索引文件(.index/.timeindex)组成。日志分段基于大小(默认1GB)或时间滚动,文件名以起始offset命名。消息以Record Batch格式存储,支持批量压缩。 核心索引机制: Offset索引:稀疏映射offset到物理位置(每4KB记录),通过二分查找加速定位 Time索引:按时间戳关联offset(默认每条消息记录),支持时间范围查询 高效查找流程: 先通过文件名二分定位目标段

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

大数据存储域——Kafka设计原理

本文主要介绍了Kafka的架构原理、消息订阅模式以及在金融风控等领域的应用。Kafka作为数据中转站,可同步不同系统数据,支持事件驱动架构,广泛应用于金融支付与风控场景。其架构包括Producer、Broker、Topic、Partition、Replication、Message、Consumer和Consumer Group等组件,依赖Zookeeper保存元信息。Kafka的消息订阅模式包括点对点、发布-订阅、分区级订阅、静态订阅和动态订阅等,每种模式都有其特点和适用场景。此外,还探讨了Kafka与R

庄小焱 1402

Kafka消息存储核心架构设计及核心技术原理分析

胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电子工业出版技术成长领路人称号,荣获2024年电子工业出版社博文视点20周年荣誉专家称号,2024电子工业出版社年度优秀作者。

huxian1234的专栏 1251

消息队列——Kafka基本使用及原理分析

一、什么是Kafka 二、Kafka的基本使用 Java 三、KafKa原理分析 四、总结

夜勿语的博客 854

消息中间件中RocketMQ与Kafka的存储区别

存储区别

鲜衣怒马楼兰月 4602

消息队列-Kafka

1. Kafka简介 答:Kafka是一种分布式的基于发布/订阅的消息系统。 1.1 特性 支持消息的持久化;支持批量读写消息;支持消息分区;支持多副本。 1.2 高性能原理 答:Kafka实现高性能的原因是: 顺序读写磁盘:Kafka将消息保存在磁盘中,顺序进行读写,磁盘的顺序读写速度超过内存的随机读写。而且消息消费后不会删除。(删除针对的是过期消息) 页缓存:把磁盘中的数据缓存到内存中,以减...

口木西成 449

一文详解Kafka集群环境搭建,消息存储机制

一、Kafka集群环境 1、环境版本 版本:kafka2.11,zookeeper3.4 注意:这里zookeeper3.4也是基于集群模式部署。 2、解压重命名 tar -zxvf kafka_2.11-0.11.0.0.tgz mv kafka_2.11-0.11.0.0 kafka2.11 创建日志目录 [root@en-master kafka2.11]# mkdir logs 注意:以上操作需要同步到集群下其他服务上。 3、添加环境变量 vim /etc/profile

weixin_48673251的博客 256

深入理解kafka原理和细节

一、kafka架构、存储原理 引言 对于网络应用来说,网络数据传输延迟是不确定的,这种时候同步消息机制(即阻塞等待响应)就太慢了,所以需要异步通信机制。既然所有框架都有同样的需求,那自然需要一个专门处理异步通信的框架,即实现消息队列(MQ),这就是Kafka。 kafka基础架构 kafka基于发布订阅模式,请求交给MQ队列,MQ队列负责代理请求的发送和响应信息的接收。大数据框架中这种信息交流的可靠性要求很高,因而消息会被kafka持久化。多个订阅者(消费者)即从kafka...

KDLin‘s Blog 528
上一篇: 基于ShardingSphere分库分表
下一篇: Kafka核心原理之生产端
南秋同学
博客等级 码龄7年 65粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值