Kafka数据存储

【大数据学习 | kafka】kafka的数据存储结构 也就是说,写到磁盘的数据是按照1G分为一个整体部分的,但是这个整体部分需要4KB写一次,并且一次会生成一个索引问题信息,在检索的时候可以通过稀疏索引进行数据的检索,效率更快。那么查询数据还是需要在1G大小的内容中找寻是比较麻烦的,这个时候可以从index索引出发去检索,首先我们可以通过kafka提供的工具类去查看log和index中的内容。所以首先检索数据的时候就可以跳过1G为大小的块,比如检索888这条数据的,就可以直接去00000000000000000000.log中查询数据。一个数据段大小是1G。 阅读详情

前言

  不同于Redis和Memcache等内存消息队列,Kafka的设计是把所有的Message都要写入速度低容量大的硬盘,以此来换取更强的存储能力。实际上,Kafka使用硬盘并没有带来过多的性能损失。Kafka在磁盘上只做Sequence I/O。首先,Kafka重度依赖底层操作系统提供的PageCache功能。当上层有写操作时,操作系统只是将数据写入PageCache,同时标记Page属性为Dirty,当读写操作发生时,先从PageCache中查找,如果发生缺页才进行磁盘调度,最终返回需要的数据。实际上PageCache是把尽可能多的空闲内存都当做了磁盘缓存来使用,同时如果有其他进程申请内存,回收PageCache的代价又很小。
  使用PageCache功能同时可以避免在JVM内部缓存数据以及JVM的GC问题。如果在Heap内管理缓存,JVM的GC线程会频繁扫描Heap空间,带来不必要的开销。如果Heap过大,执行一次Full GC对系统的可用性来说将是极大的挑战。所有在JVM内的对象都不免带有一个Object Overhead,内存的有效空间利用率会因此降低。所有的In-Process Cache在OS中都有一份同样的PageCache,所以通过将缓存只放在PageCache,可以至少让可用缓存空间翻倍。如果Kafka重启,所有的In-Process Cache都会失效,而OS管理的pageCache依然可以继续使用。

除了PageCache,Kafka还采用了SendFile技术,具体参见:Kafka高吞吐低延迟原理

 - Topic
 - Partition:一个topic可以分为多个partition
 - Segment:每个partition又由多个segment file组成
 - offset:每个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中
 		   partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息
 - message:kafka文件中最小的存储单位

  在Kafka文件存储中,同一个Topic下有多个不同partition,每个partition为一个目录,partition命名规则为Topic名称+有序序号,第一个partition序号从0开始序号最大值为partition数量减1。topic与partition的关系如下:
在这里插入图片描述
  每个partition(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。默认保留7天的数据。每个partition只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定。
  Segment file组成:由2大部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀“.index”和“.log”分别表示为segment索引文件、数据文件。Segment文件命名规则:partition全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消费的offset值。

Kafka数据的存储方式

segment中的文件
  对于一个partition里面有很多大小相等的segment数据文件(文件的大小可以在config/server.properties中进行设置),这种特性可以方便old segment file的快速删除。partition中的segment file的组成:index file和data file,这两个文件是一一对应的。索引文件和数据文件对应关系如图:
在这里插入图片描述
  segment的索引文件中存储着大量的元数据,数据文件中存储着大量消息,索引文件中的元数据指向对应数据文件中的message的物理偏移地址。以索引文件中的3,497为例,在数据文件中表示第3个message(在全局partition表示第368772个message),以及该消息的物理偏移地址为497。

注:Partition中的每条message由offset来表示它在这个partition中的偏移量,这个offset并不是该Message在partition中实际存储位置,而是逻辑上的一个值,但它却唯一确定了partition中的一条Message(可以认为offset是partition中Message的id)。

message文件
  一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成:

  • header由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成。当magic的值为1的时候,会在magic和crc32之间多一个字节的数据:attributes(保存一些相关属性,比如是否压缩、压缩格式等)
  • body是由N个字节构成的一个消息体,包含了具体的key/value消息

message中的物理结构如图所示:
在这里插入图片描述
参数说明:

关键字解释说明
offset在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),它可以唯一确定每条消息在parition(分区)内的位置。即offset表示partiion的第多少message
message sizemessage大小
CRC32用crc32校验message
“magic”表示本次发布Kafka服务程序协议版本号
“attributes”表示为独立版本、或标识压缩类型、或编码类型
key length表示key的长度,当key为-1时,K byte key字段不填
key可选
value bytes payload表示实际消息数据

Kafka如何通过offset查找message

Kafka在内部通过分段和索引解决查找效率低下的问题。

数据文件的分段
  例如加入有100条message,它们的offset是从0到99,假设将数据文件分为5段,第一段为0-19,第二段为20-39,依次类推,每段放在一个单独的数据文件里面,数据文件以该段中最小的offset命名。这样在查找指定offset的Message的时候,用二分查找就可以定位到该Message在哪一段中。

为数据文件建索引
  数据文件分段使得可以在一个较小的数据文件中查找对应offset的message了,但是这依然需要顺序扫描才能找到对应offset的message。为了进一步提高查找的效率,Kafka为每个分段后的数据文件建立了索引文件。
  索引文件中包含若干个索引条目,每个条目表示数据文件中一条message的索引。索引包含两个部分(均为4个字节的数字),分别为相对offset和position。

  • 相对offset:因为数据文件分段以后,每个数据文件的起始offset不为0,相对offset表示这条message相对于其所属数据文件中最小的offset的大小,存储相对offset可以减小索引文件占用的空间
  • position:表示该条message在数据文件中的绝对位置。只要打开文件并移动文件指针到这个position就可以读取对应的message了

通过offset查找message

  1. 查找segment file
    因为文件以起始偏移量命名并排序这些文件,只要根据offset 二分查找文件列表,就可以快速定位到具体文件
  2. 通过segment file查找message
    通过第一步定位到segment file,然后依次定位到.index的元数据物理位置和.log的物理偏移地址,然后再通过.log顺序查找直到目标offset为止

  segment index file并没有为数据文件中的每条message建立索引,而是采取稀疏索引存储方式,每隔一定字节的数据建立一条索引,它减少了索引文件大小,通过map可以直接内存操作,稀疏索引为数据文件的每个对应message设置一个元数据指针,它比稠密索引节省了更多的存储空间,但查找起来需要消耗更多的时间。

`Kafka高效文件存储设计特点:`
 - Kafka把topic中一个parition大文件分成多个小文件段,通过多个小文件段,
   就容易定期清除已经消费完文件,减少磁盘占用
 - 通过索引信息可以快速定位message和确定response的最大大小
 - 通过index元数据全部映射到memory,可以避免segment file的IO磁盘操作
 - 通过索引文件稀疏存储,可以大幅降低index文件元数据占用空间大小

附

Kafka 是如何清理过期数据的?
日志保存清理策略

属性名含义默认值
log.cleanup.policy日志清理保存的策略只有delete和compact两种delete
log.retention.hours日志保存的时间,可以选择hours,minutes和ms168(7day)
log.retention.bytes删除前日志文件允许保存的最大值-1
log.segment.delete.delay.ms日志文件被真正删除前的保留时间60000
log.cleanup.interval.mins每隔一段时间多久调用一次清理的步骤10
log.retention.check.interval.ms周期性检查是否有日志符合删除的条件(新版本使用)300000

  Kafka 的日志实际上是以日志的方式默认保存在/kafka-logs文件夹中的,默认7天清理机制。当删除的条件满足以后,日志将被“删除”,但是这里的删除其实只是将该日志进行了“delete”标注,文件只是无法被索引到了而已。但是文件本身,仍然是存在的,只有当过了log.segment.delete.delay.ms 这个时间以后,文件才会被真正的从文件系统中删除。
  为了避免在删除时阻塞读操作,采用了copy-on-write形式的实现,删除操作进行时,读取操作的二分查找功能实际是在一个静态的快照副本上进行的,这类似于Java的CopyOnWriteArrayList。

Kafka怎么判断有大量积压消息?
生产的offset和消费的offset有大的差值。

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

相关推荐

【kafka】简介Kafka之数据存储

文章目录1.视界概念2. partition中的数据文件2.1.segment中的文件2.2.message文件2.3.数据文件的内部实现方法3.查找3.1.遇到的问题3.2.如何去解决这个问题3.2.1 数据文件的分段3.2.2 为数据文件建索引3.3.通过offset查找message 1.视界 概念 写介绍kafka的几个重要概念(可以参考之前的博文Kafka的简单介绍): Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群; To

九师兄 440

Kafka简介和架构

一、简介 Kafka是一个分布式消息队列。★Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。无论是kafka集群,还是consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性。 二、优点(相比较于Flume) 在企业中...

张鑫的博客 2万+

接口操作MySQL跟MongoDB事务回滚问题

通常使用的事务注解:@Transactional 是不会对MongoDB生效的,但是在一些生产接口中无法避免同时使用MySQL跟MongoDB的操作。

weixin_45932023的博客 1578

消息队列-kafka-服务端处理架构(架构,Topic文件结构,服务端数据的一致性)

2 活过来的时候,发现已经有顶替的 leader 角色(主分片)了,那么就跟随,也就是向 leader 获取 HW 高水位线,与自己的 LEO 比对,大于 LEO 则删除,小于 LEO 则从 leader 这边复制数据过去。1 首先它会从ISR中剔除,当恢复正常的时候,会向主分片获取 HW 高水位线,与自己的 LEO 比对,如果自己的 LEO 超过 HW 则干掉超过的部分,小于的话就从主分片复制数据过来。HW:高水位,消费者消费最高的位置,其实也就是木桶原理,所以只能到下面图中的第四条消息。

qq_43259860的博客 1223

利用李雅普诺夫函数开发航天器姿态控制系统

本文基于李雅普诺夫函数控制方法,采用修正罗德里格斯参数(MRP)描述航天器姿态,设计了姿态控制律。通过构造能量型李雅普诺夫函数,推导出保证系统稳定的控制闭环方程,实现了航天器从初始状态到目标状态的稳定转换。针对MRP参数可能出现的奇异性问题,采用影子集进行规避。仿真实验包含两种模式:非追踪模式(目标状态为0)和追踪模式(目标为三角函数轨迹)。结果表明,该控制方法能够有效实现姿态稳定和轨迹跟踪,在短暂调整后即可精确跟随目标轨迹。控制律设计考虑了不同参考系间的转换,通过DCM矩阵处理目标角速度的坐标变换问题。

weixin_50227659的博客 1221

C#报表,使用微软rdlc模板,生成Excel, PDF, Word, Image文件,使用自定义对象做数据集不连接数据库

我项目是用vs2017 建的,.NET farmwork 4.7.2 这种报表可以用于任何模式的应用,web,桌面,因为这只是生成一个文件或者文件流 步骤比较详细啰嗦,其中有讲到rdlc怎么新建设计,如果已经会设计rdlc了的可以直接跳到底部看代码的执行结果, 底部还有源码下载链接,百度盘 首先控制台安装报表包 新建rdlc 报表 建立rdlc里要用的数据模型 模型建完,或者修改都要重新...

qq_35955916的博客 5203

Kafka实践:到底该不该把不同类型的消息放在同一个主题中?

http://martin.kleppmann.com/2018/01/18/event-types-in-kafka-topic.html AI 前线导读: 如果你使用了像 Kafka 这样的流式处理平台,就要搞清楚一件事情:你需要用到哪些主题?特别是如果你要将一堆不同的事件作为消息发布到 Kafka,是将它们放在同一个主题中,还是将它们拆分到不同的主题中?更多优质内容请关注微信公众号“AI ...

$firecat利白的代码足迹$ 2547

Label Studio保姆级教程:从零搭建医疗影像标注平台(DICOM格式支持)

本文提供基于Label Studio从零搭建医疗影像标注平台的保姆级教程。针对DICOM格式支持,详细阐述了环境部署、DICOM深度集成与预处理、团队协作权限管理以及质量审核闭环等核心环节,旨在构建一个高效、可落地的医疗AI数据标注解决方案,助力模型落地。

nft7creator的博客 304

应该在同一个Kafka主题中放入几种事件类型吗?

  使用此新功能,可以轻松,干净地将特定事物的所有不同事件放在同一主题中。现在,可以根据上述条件自由选择主题的粒度,而不仅限于每个主题的单个事件类型。

zouduchen的博客 262

STM32G474多通道ADC电压采集:软件触发与单次转换实战

本文详细介绍了STM32G474多通道ADC电压采集的实战方法,重点讲解了软件触发与单次转换的实现技巧。通过硬件设计、HAL库配置、多通道轮询采集及数据处理等环节的详细解析,帮助开发者高效完成精确电压采集任务。文章还提供了常见问题调试技巧和性能优化建议,适用于需要高精度电压监测的嵌入式应用场景。

weixin_28720767的博客 462

RAG的“诊断艺术”:从测试集结果倒追根源,精准优化检索、排序与生成

当RAG应用给出一个糟糕的答案时,开发者的第一反应可能是:“我的Prompt写得不够好?”这种基于“感觉”的猜测往往是低效的。通过构建一个包含黄金上下文信息的测试集,我们可以像一位经验丰富的医生一样,对RAG系统的各个“器官”进行独立的“健康检查”。一个用于RAG诊断的测试集,除了问题和答案,还需要包含中间环节的“黄金标准”。如果你的RAG流程包含Re-ranker,那么在评估完初期的召回后,需要单独评估Re-ranker的效果。RAG的优化是一个持续的过程,应该形成一个闭环。的文档块尽可能多地召回。

kakaZhui的博客 153

Kafka实践:到底该不该把不同类型的消息放在同一个主题中

如果你使用了像Kafka这样的流式处理平台,就要搞清楚一件事情:你需要用到哪些主题?特别是如果你要将一堆不同的事件作为消息发布到Kafka,是将它们放在同一个主题中,还是将它们拆分到不同的主题中?\\Kafka主题最重要的一个功能是可以让消费者指定它们想要消费的消息子集。在极端情况下,将所有数据放在同一个主题中可能不是一个好主意,因为这样消费者就无法选择它们感兴趣的事件——它们需要消费所有的消息。...

cpongo5 340

有之以为利,无之以为用,在 RAP 开发里的虚实取舍

摘要(149字) SAP RAP框架通过"有"与"无"的哲学平衡实现业务应用价值。其"有"体现在CDS视图、行为定义、服务绑定等具体对象,为系统提供形体;而"无"则表现为保留的扩展空间、未暴露的实现细节和框架托管的生命周期。在采购审批应用中,RAP既通过明确定义的行为模型建立业务语义,又通过验证、动作等机制保持灵活性。这种架构既确保核心功能稳固,又为未来演进留出余地,印证了"有之以为利,无之以为用"的技术智慧

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1303

【Kafka】Kafka 数据存储

Kafka 中的消息是存储在磁盘上的,一个分区副本对应一个 日志(Log)。为了防止 Log 过大,Kafka 又引入了 日志分段(LogSegment)的概念,将 Log 切分为多个 LogSegment ,相当于一个巨型文件被平均分配为多个相对较小的文件,这样也便于消息的维护和清理。事实上,Log 和 LogSegment 也不是纯粹物理意义上的概念,Log 在物理上只以文件夹的形式存储,而每个 LogSegment 对应于磁盘上的一个日志文件和两个索引文件,以及可能的其他文件。

Data · Model · Agent · Repeat 2117

【LDPC-7】LLR量化位宽对LDPC译码性能的影响分析——以最小和译码算法为例进行matlab仿真

最小和译码算法的步骤如下:最后译码结果如果满足或者完成所有迭代次数,则译码算法停止迭代,否则继续进行译码迭代操作。

FPGA/MATLAB学习教程/源码/项目合作开发 1471

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Kafka数据存储结构

Kafka 的数据分为两部分:元数据、消息数据。 元数据:元数据包括集群信息、节点信息、队列信息、主从信息、分区信息、分区分布信息等,这类信息都存储在 Zookeeper 上,Kafka 的任何一个节点都可以读取元数据信息。 消息数据:生产者向集群发送的消息。生产者直接向分区的 Leader 发送消息,Leader 会同步至 Flowers 节点,分区的 Leader 及 Flowers 节点都存储了一份消息数据。 元数据结构clustercontrollercontroller_epochbroke

死牛胖子的技术随笔 3687

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Kafka之数据存储

Zebul博2018-05-03 15:09:002958已收藏1 本文主要讲述以下两部分内容: kafka数据的存储方式; kafka如何通过offset查找message。 1.前言 写介绍kafka的几个重要概念(可以参考之前的博文Kafka的简单介绍): Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker可以组成一个K...

大JAVA解决方案 952

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Kafka:数据存储、删除,查询

kafka数据删除存储查询

Joseph25的博客 1406

kafka能不能作为数据存储,你不知道的秘密!

Kafka你不知道的秘密!   人们总是问是否可以把 Kafka 作为长期的数据存储来使用,很显然,如果把数据保留策略设置为“永久”或者启用主题的日志压缩功能,那么数据就可以被永久保存下来。但我觉得人们其实真正想知道的是,这样做是不是很疯狂。 简而言之,这样做不算疯狂。实际上,人们一直都在这么做,而且 Kafka 的设计意图之一就是要将它作为数据存储系统。不过问题是,为什么我们要把 Kafk...

tp15868352616的博客 1万+

Kafka数据存储概述

Kafka这款分布式消息队列使用文件系统和操作系统的页缓存(page cache)分别存储和缓存消息,摒弃了Java的堆缓存机制,同时将随机写操作改为顺序写,再结合Zero-Copy的特性极大地改善了IO性能。而提起磁盘的文件系统,相信很多对硬盘存储了解的同学都知道:“一块SATA RAID-5阵列磁盘的线性写速度可以达到几百M/s,而随机写的速度只能是100多KB/s,线性写的速度是随机写的上千倍”,由此可以看出对磁盘写消息的速度快慢关键还是取决于我们的使用方法。鉴于此,Kafka的数据存储设计是建立在对

weixin_57763462的博客 1532

Kafka面试小结八:kafka数据存储在内存还是磁盘

然后,Kafka使用一定的时间间隔将缓存中的消息批量写入磁盘。缓存的大小可以通过Kafka配置中的`log.flush.interval.messages`和`log.flush.interval.ms`参数来配置。当缓存中的消息被写入磁盘时,它们被追加到一个或多个日志文件中。需要注意的是,Kafka的数据存储在磁盘上是持久的,而在内存中的缓存则具有一定的容量限制。当缓存的大小达到了阈值或者达到了一定的时间间隔时,Kafka会将缓存中的消息写入磁盘,以确保数据的安全性和可靠性。

之乎者也·的博客 2634

kafka原理—01数据存储、日志清理

kafka数据存储、日志清理

AlbertLiangzt的博客 1947

Kafka 学习笔记之 数据存储与高效读写

前言 ​ 上一篇笔记中概述了一下什么是消息队列以及 kafka 的组织架构,这篇笔记就来整理一下 kafka 是如何存储数据,以及其怎么保证了大数据场景下的高效读写,文中如有错误与纰漏欢迎指正,共同进步! kafka 数据存储结构 topic 与 partition ​ 在 kafka 的架构中有讲到作为基于订阅/发布模式的消息队列 kafka 的所有操作都是面向 topic 的,而为了水平扩展的弹性和增大吞吐量在 kafka 中又可以将一个 topic 分成多个 partition 分布在不同的机

an_vana的博客 533

3.Kafka-数据存储流程

Kafka数据存储流程分为四个阶段:1)生产者发送消息到Broker;2)日志追加与持久化,包括分配偏移量、写入页缓存和ISR副本同步;3)异步数据持久化到物理磁盘;4)索引更新与日志段滚动。整个过程通过顺序写入、页缓存和副本机制实现了高吞吐与可靠性,其中ISR机制和异步刷盘是关键优化点。日志段滚动策略则便于文件管理和数据清理。

zhuzhu_YT的博客 745

Kafka 数据存储Topic和Partition

对于Kafka 数据的存储,我们最经常听到的两个概念就是Topic和Partition了,下面就简单介绍下他们在Kafka系统中的意思和作用。 Topic Topic是Kafka中消息的逻辑分类,每个Topic可有多个Partition Partition Partition是Kafka中实际的数据存储单元,每个Partition可以看做一个可以被订阅和消费的消息队列。每个Topic的pa...

Rocky的技术博客 1442

大数据环境下 Kafka 的数据存储与管理

在大数据时代,数据的产生速度和规模呈爆炸式增长。Kafka 作为一种高性能、分布式的消息队列系统,在大数据处理流程中扮演着至关重要的角色。本文的目的在于深入剖析 Kafka 在大数据环境下的数据存储与管理机制,详细介绍其核心原理、算法、实际应用场景等内容。范围涵盖 Kafka 的基本概念、存储架构、数据管理策略、相关算法和数学模型,以及在实际项目中的应用案例和开发工具推荐等方面。本文将按照以下结构展开:首先介绍 Kafka 的核心概念与联系,包括其架构和主要组件;

专注搜索引擎技术 1056
上一篇: Spark内核的SQL解析
下一篇: 分布式事务:2PC/3PC
K. Bob
博客等级 码龄8年 82粉丝 294原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值