深入了解Kafka的文件存储原理

Kafka简介

Kafka最初由Linkedin公司开发的分布式、分区的、多副本的、多订阅者的消息系统。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存是根据Topic进行归类,发送消息者称为Producer;消息接受者称为Consumer;此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息(kafka的0.8版本之后,producer不在依赖zookeeper保存meta信息,而是producer自己保存meta信息)。本文不打算对Apache Kafka的原理和实现进行介绍,而在编程的角度上介绍如何使用Apache Kafka。我们分别介绍如何编写Producer、Consumer以及Partitioner等。

Producer发送的消息是如何定位到具体的broker

  1. 生产者初始化:Producer在初始化时会加载配置参数,并开启网络线程准备发送消息。
  2. 拦截器逻辑:Producer可以设置拦截器来预处理消息,例如,修改或者丰富消息内容。
  3. 序列化:Producer将处理后的消息key/value进行序列化,以便在网络上传输。
  4. 分区策略:Producer会根据分区策略选择一个合适的分区,这个分区策略可以是轮询、随机或者根据key的哈希值等。
  5. 选择Broker:Producer并不直接将消息发送到指定的Broker,而是将消息发送到所选分区的leader副本所在的Broker。如果一个主题有多个分区,这些分区会均匀分布在集群中的Broker上。每个分区都有一个leader副本,Producer总是将消息发送到leader副本,然后由leader副本负责同步到follower副本。
  6. 发送模式:Producer发送消息的模式主要有三种:发后即忘(不关心结果),同步发送(等待结果),以及异步发送(通过Future对象跟踪状态)。
  7. 缓冲和批量发送:为了提高效率,Producer会先将消息收集到一个批次中,然后再一次性发送到Broker。
  8. 可靠性配置:Producer可以通过设置request.required.acks参数来控制消息的可靠性级别,例如,设置为"all"时,需要所有in-sync replicas都确认接收后才认为消息发送成功。
  9. 失败重试:如果请求失败,Producer会根据配置的retries参数来决定是否重试发送消息。

Kafka的Producer通过一系列步骤来确定消息的发送目标,其中分区策略和leader副本的选择是关键步骤,确保了消息能够正确地发送到相应的Broker。同时,通过合理的配置和重试机制,Producer能够保证消息的可靠性和系统的健壮性。

Kafka存储文件长什么样

在kafka集群中,每个broker(一个kafka实例称为一个broker)中有多个topic,topic数量可以自己设定。在每个topic中又有多个partition,每个partition为一个分区。kafka的分区有自己的命名的规则,它的命名规则为topic的名称+有序序号,这个序号从0开始依次增加。

图片

在每个partition中有可以分为多个segment file。当生产者往partition中存储数据时,内存中存不下了,就会往segment file里面存储。kafka默认每个segment file的大小是500M,在存储数据时,会先生成一个segment file,当这个segment file到500M之后,再生成第二个segment file 以此类推。每个segment file对应两个文件,分别是以.log结尾的数据文件和以.index结尾的索引文件。

具体来说,Kafka中的每个分区(Partition)由一个或多个Segment组成。每个Segment实际上是磁盘上的一个目录,这个目录下面会包含几个特定的文件:

  1. .log文件:这是真正存储消息数据的地方。每个Segment有一个对应的.log文件,它存储了属于这个Segment的所有消息。
  2. .index文件:索引文件,用于快速定位到.log文件中的具体消息。通过.index文件可以高效地查找消息所在的.log文件位置。
  3. .timeindex文件(可选):如果启用了时间戳索引,还会有这个文件。它用于按时间戳高效检索消息。

此外,Segment作为Kafka中数据组织的基本单位,设计成固定大小,这样做可以方便地进行数据的清理和压缩,同时保证性能。当一个Segment文件写满后,Kafka会自动创建一个新的Segment来继续存储数据。旧的Segment文件在满足一定条件(如被消费且达到一定的保留期)后会被删除,释放磁盘空间。

图片

每个segment file也有自己的命名规则,每个名字有20个字符,不够用0填充。每个名字从0开始命名,下一个segment file文件的名字就是上一个segment file中最后一条消息的索引值。在.index文件中,存储的是key-value格式的,key代表在.log中按顺序开始第条消息,value代表该消息的位置偏移。但是在.index中不是对每条消息都做记录,它是每隔一些消息记录一次,避免占用太多内存。即使消息不在index记录中在已有的记录中查找,范围也大大缩小了。 

Consumer如何消费数据

Kafka中的Consumer通过以下步骤来消费数据:

  1. 创建消费者实例:需要创建一个消费者实例,并指定一些关键配置,如消费者所属的群组、Topic名称以及与服务器通信的相关设置。
  2. 订阅主题:创建好的消费者实例需要订阅一个或多个主题,以便开始接收消息。
  3. 拉取数据:与一些消息系统采用的推送模式不同,Kafka的消费者采用的是“拉取”模式。这意味着消费者需要主动从Broker拉取数据,而不是等待Broker将数据推送过来。这种模式使得消费者可以根据自身处理能力来控制数据的获取速度。
  4. 长轮询机制:在没有新消息可消费时,消费者会使用长轮询机制等待新消息到达。消费者调用poll()方法时可以设置超时时间(timeout),这样如果没有新消息,消费者会在等待一段时间后返回,并在下次调用poll()时继续尝试获取新消息。
  5. 提交偏移量:消费者在消费过程中会跟踪每个分区的消费进度,即偏移量(offset)。当消费者处理完消息后,它会提交当前的偏移量到Broker,以便在服务重启或故障恢复的情况下可以从准确的位置继续消费数据。
  6. 故障恢复:如果消费者发生宕机等故障,由于Kafka会持久化消费者的偏移量信息,消费者可以在恢复后继续从之前提交的偏移量处消费数据,确保不丢失任何消息。
  7. 消费者群组:Kafka支持多个消费者组成一个群组共同消费一个主题。在一个群组内,每个消费者会被分配不同的分区来消费,从而实现负载均衡和横向伸缩。同一个分区不能被一个群组内的多个消费者同时消费。
  8. 数据处理:消费者在拉取到数据后,可以根据自己的业务逻辑对数据进行处理,比如进行实时流处理或者存储到数据库中进行离线分析。

综上所述,Kafka的Consumer通过上述流程高效地从Broker拉取并处理数据,这些特性使得Kafka能够在高吞吐量和可扩展性方面表现出色,适合处理大规模数据流的场景。

Kafka中的过期数据处理机制

 kafka作为一个消息中间件,是需要定期处理数据的,否则磁盘就爆了。

处理的机制

  • 根据数据的时间长短进行清理,例如数据在磁盘中超过多久会被清理(默认是168个小时) 
  • 根据文件大小的方式给进行清理,例如数据大小超过多大时,删除数据(大小是按照每个partition的大小来界定的)。

删除过期的日志的方式

Kafka通过日志清理机制来删除过期的日志,主要依赖于两个配置参数来实现这一功能:

  • 日志保留时间:通过设置log.retention.hours参数,可以指定日志文件的保留时间。当日志文件的保存时间超过这个设定值时,这些文件将被删除。
  • 日志清理策略:Kafka支持两种日志清理策略,分别是deletecompactdelete策略会根据数据的保存时间或日志的最大大小来进行删除。而compact策略则是根据消息中的key来进行删除操作,通常用于特定类型的主题,如__consumer_offsets

此外,在Kafka 0.9.0及更高版本中,日志清理功能默认是开启的(log.cleaner.enable默认为true)。这意味着Kafka会自动运行清理线程来执行定时清理任务。

综上所述,Kafka通过结合保留时间和清理策略的配置,实现了对过期日志的有效管理。这些机制确保了系统资源的合理利用,同时避免了因日志无限增长而导致的潜在问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

梯度下降算法(带你 原理 实践)

目录 一、引言 二、梯度下降算法的原理 三、梯度下降算法的实现 四、梯度下降算法的优缺点 优点: 缺点: 五、梯度下降算法的改进策略 1 随机梯度下降(Stochastic Gradient Descent, SGD) 2 批量梯度下降(Batch…

(一)Python数据分析体系--九五小庞

课程地址:https://space.bilibili.com/387143299/channel/collectiondetail?sid554734 主要内容 知识体系 分析什么样的数据 为什么使用Python做数据分析 Python近几年的发展势头是有目共睹的,尤其是在科学计算,数据处理,A方面…

驾辰龙跨Llama持Wasm,玩转Yi模型迎新春

今年新年很特别,AI工具添光彩。今天就来感受下最新的AI神器天选组合“WasmEdgeYi-34B”,只要短短三步,为这个甲辰龙年带来一份九紫离火运的科技感。 环境准备 这次用的算力是OpenBayes提供的英伟达RTX_4090*1、24GB显存、20核CPU、80GB内存…

产品营销展示型wordpress外贸网站模板

工艺品wordpress外贸主题 简约大气的wordpress外贸主题,适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377 餐饮设备wordpress外贸主题 简洁的wordpress外贸主题,适合食品机械、餐饮设备公司使用。 https://www.jianzh…

Linux 开发工具vim、gcc/g++、makefile

目录 Linux编辑器-vim 1. 基本概念 2. 基本操作 3. 正常模式命令集 4. 末行模式命令集 5. 其他操作 6. 简单vim配置 Linux编译器-gcc/g 1、基本概念 2、程序翻译的过程 3. gcc如何完成程序翻译 4、动静态库 Linux项目自动化构建工具-make/Makefile 1、背景 2、…

【Qt学习笔记】(四)Qt窗口

Qt窗口 1 菜单栏1.1 创建菜单栏1.2 在菜单栏中添加菜单1.3 创建菜单项1.4 在菜单项之间添加分割线1.5 给菜单项添加槽函数1.6 给菜单项添加快捷键 2 工具栏2.1 创建工具栏2.2 设置停靠位置2.3 设置浮动属性2.4 设置移动属性2.5 添加 Action 3 状态栏3.1 状态栏的创建3.2 在状态…

2024最新算法:冠豪猪优化算法(CPO)求解23个基准函数

一、冠豪猪优化算法 冠豪猪优化算法(Crested Porcupine Optimizer,CPO)由Mohamed Abdel-Basset等人于2024年提出,该算法模拟冠豪猪的四种不同保护机制:视觉、听觉、气味和物理攻击。第一和第二防御技术(视觉和听觉)反…

盘点 | IT行业哪些认证含金量高

微思网络 厦门微思网络 作为一名IT人员,谁没考几个证 ——值得考的证书拥有的特性 ▶ 获政府、企业和从业者认可; ▶ 持证人数多,业内共识度高; ▶ 帮持证者加分,快速提薪。 系统网络方向认证 01 华为认证 华为…

【机器学习】包裹式特征选择之递归特征消除法

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

电磁兼容(EMC):电解电容低阻如何选择详解

目录 1 为何要选低阻电解电容 2 电解电容等效高频等效电路 3 不同厂家ESR参数 4 高频ESR特性 5 Low ESR铝电解电容 1 为何要选低阻电解电容 在EMI超标时,将普通电解电容更换为低阻电解电容时,便通过了。这是因为低阻电解电容降低了功率回路的辐射电…

数字化转型导师坚鹏:证券公司数字化转型战略、方法与案例

证券公司数字化转型战略、方法与案例 课程背景: 数字化转型背景下,很多机构存在以下问题: 不清楚证券公司数字化转型的发展战略? 不知道证券公司数字化转型的核心方法? 不知道证券公司数字化转型的成功案例&am…

LLM 系列——BERT——论文解读

一、概述 1、是什么 是单模态“小”语言模型,是一个“Bidirectional Encoder Representations fromTransformers”的缩写,是一个语言预训练模型,通过随机掩盖一些词,然后预测这些被遮盖的词来训练双向语言模型(编码器…

【计算机网络通信】计算机之间的局域网通信和互联网通信方法(附Python和C#代码)

文章目录 前言一、局域网通信1.1 基本原理和方法1.1.1 获取本地ip1.1.2 实现局域网内的广播1.1.3 进行局域网通信 1.2 实现多客户端连接1.3 Python源码1.4 C#源码1.5 可能存在的问题 二、互联网通信2.1 实现原理2.1.1 内网穿透软件2.1.2 实现互联网通信 2.2 Python源码2.3 C#源…

基于Java的超市商品管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 简介1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品类型…

一文了解docker与k8s

随着 k8s 作为容器编排解决方案变得越来越流行,有些人开始拿 Docker 和 k8s 进行对比,不禁问道:Docker 不香吗? k8s 是 kubernetes 的缩写,8 代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手两者相互依存…

Qt外部调用进程类QProcess的使用

有的时候我们需要在自己程序运行过程中调用其他进程,那么就需要用到QProcess。 首先可以了解一些关于进程的相关知识:线程与进程,你真得理解了吗_进程和线程的区别-CSDN博客 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0…

Java面试——Redis

优质博文:IT-BLOG-CN 一、Redis 为什么那么快 【1】完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中。 【2】数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的。 【3】采用单线…

【Vue3】全局切换字体大小

VueUse 先安装VueUse <template><header><div class"left">left</div><div class"center">center</div><div class"right">right</div></header><div><button click"cha…

飞天使-学以致用-devops知识点4-SpringBoot项目CICD实现(实验失败,了解大概流程)

文章目录 代码准备创建jenkins 任务测试推送使用项目里面的jenkinsfile 进行升级操作 文字版本流程项目构建 代码准备 推送代码到gitlab 代码去叩叮狼教育找 k8s 创建jenkins 任务 创建一个k8s-cicd-demo 流水线任务 将jenkins 里面构建时候的地址还有token&#xff0c; 给到…

azure devops工具实践分析

对azure devops此工具的功能深挖&#xff0c;结合jira的使用经验的分析 1、在backlog的功能描述&#xff0c;可理解为需求项&#xff0c;这里包括了bug&#xff0c;从开发的角度修复bug也是个工作项&#xff0c;所以需求的范围是真正的需求&#xff08;开发接收到的已经确认的…