Kafka之【存储消息】

news2024/11/27 13:31:24

数据已经由生产者Producer发送给Kafka集群,当Kafka接收到数据后,会将数据写入本地文件中。

存储组件

在这里插入图片描述

Kafka 的消息存储涉及多个关键组件,每个组件在消息的存储和管理过程中扮演着特定的角色。以下是 Kafka 存储消息过程中涉及的主要存储组件及其作用的详细解释:

1. KafkaApis

  • 作用:KafkaApis 是 Kafka 服务器端的 API 层,它负责处理从客户端接收到的请求,例如生产者的发送请求、消费者的拉取请求、元数据请求等。
  • 处理过程:它会进行基本的请求校验,例如检查主题和分区是否存在、验证消息格式等。
  • 如果验证通过,KafkaApis 将请求转发给 ReplicaManager。

2. ReplicaManager

  • 作用:ReplicaManager 是管理 Kafka 集群中副本(replica)的核心组件。它负责管理所有分区的副本,处理消息的读写请求,并确保数据的高可用性和一致性。
  • 首先检查当前节点是否是请求目标分区的主副本(leader)。如果不是,返回错误并告知客户端正确的 leader。如果是 leader,ReplicaManager 开始处理消息写入请求。
  • 处理过程:ReplicaManager 接收到 KafkaApis 转发的消息发送请求后,会将消息写入相应分区的日志中。

3. Partition

  • 作用:Partition 是 Kafka 中消息存储的基本单元。每个主题(topic)可以有多个分区,每个分区是一个有序的消息队列。
  • 处理过程:Partition 负责具体的消息存储和读取操作。每个分区由一个主副本(leader)和多个从副本(follower)组成。消息首先写入主副本,然后复制到从副本。

4. UnifiedLog

  • 作用:UnifiedLog 是对 Kafka 日志的抽象,它代表了一个分区的物理日志文件。
  • 处理过程:UnifiedLog 管理分区的日志数据,包括日志的追加、截断和清理等操作。它将消息追加到分区的日志中,并负责维护日志的索引。

5. LocalLog

  • 作用:LocalLog 是 Kafka 中实际存储日志的本地文件系统表示。它封装了对物理日志文件的访问。
  • 处理过程:LocalLog 负责将消息写入磁盘,并提供消息的读取接口。它是日志数据的实际存储位置。

6. LogSegment

  • 作用:LogSegment 是 Kafka 日志文件的一个片段,每个分区的日志由多个 LogSegment 组成。
  • 处理过程:LogSegment 管理一个日志片段的消息数据和索引。每个 LogSegment 包含一个日志文件和一个索引文件,日志文件存储实际的消息数据,索引文件存储消息在日志文件中的位置。

7. LogConfig

  • 作用:LogConfig 是日志配置的管理类,它定义了日志的相关配置参数,如段大小、保留策略、压缩设置等。
  • 处理过程:LogConfig 为每个主题和分区提供配置信息,指导日志文件的创建、滚动和清理等操作。
  • 具体参数如下
参数名参数作用默认值推荐值
min.insync.replicas最小同步副本数量12
log.segment.bytes文件段字节数据大小限制1G = 1024 * 1024 * 1024 byte/
log.roll.hours文件段强制滚动时间阈值7天 =24 * 7 * 60 * 60 * 1000L ms/
log.flush.interval.messages满足刷写日志文件的数据条数Long.MaxValue不推荐
log.flush.interval.ms满足刷写日志文件的时间周期Long.MaxValue不推荐
log.index.interval.bytes刷写索引文件的字节数4 * 1024/
replica.lag.time.max.ms副本延迟同步时间30s/

这些组件共同协作,形成了 Kafka 的消息存储机制:

数据存储的流程

  1. 消息写入 UnifiedLog

    • UnifiedLog 是 Kafka 分区日志的抽象层,它负责将消息追加到分区的日志中。
    • 每个分区都有一个对应的 UnifiedLog 实例,处理消息的追加、截断和清理等操作。
  2. 消息持久化到 LocalLog

    • LocalLog 封装了对物理日志文件的访问,实际将消息写入磁盘。
    • 它负责管理磁盘上的日志文件和索引文件。
    • 消息以 LogSegment 的形式存储在磁盘上,一个分区的日志由多个 LogSegment 组成。
  3. LogSegment 管理

    • LogSegment 包含日志文件和索引文件,分别存储实际的消息数据和消息在日志文件中的位置。
    • LogSegment 管理消息的物理存储和索引,以便后续的快速查找和读取。
  4. 索引更新

    • 在消息写入磁盘的同时,更新日志文件的索引,包括时间索引和偏移量索引。
    • 这些索引帮助快速定位和读取消息。
  5. 刷写磁盘

    • 根据配置参数(如 log.flush.interval.messageslog.flush.interval.ms),定期将内存中的消息刷写到磁盘,确保消息持久化。
    • 刷写操作将内存缓冲区中的消息持久化到磁盘,以防止数据丢失。
  6. 返回客户端响应

    • 当消息成功写入磁盘并同步到所有副本后,ReplicaManager 返回成功响应给客户端。
    • 如果写入过程中发生错误,返回相应的错误信息。

通过以上步骤和流程,Kafka 确保消息从接收到存储的过程是高效、安全且可靠的。每个组件在这个过程中都发挥了关键作用,协同工作以实现高性能的消息存储和管理。

数据刷写

在Linux系统中,当我们把数据写入文件系统之后,其实数据在操作系统的PageCache(页缓冲)里面,并没有刷到磁盘上。如果操作系统挂了,数据就丢失了。一方面,应用程序可以调用fsync这个系统调用来强制刷盘,另一方面,操作系统有后台线程,定时刷盘。频繁调用fsync会影响性能,需要在性能和可靠性之间进行权衡。

Kafka提供了参数进行数据的刷写

  • log.flush.interval.messages :达到消息数量时,会将数据flush到日志文件中。
  • log.flush.interval.ms :间隔多少时间(ms),执行一次强制的flush操作。
  • flush.scheduler.interval.ms:所有日志刷新到磁盘的频率

log.flush.interval.messages和log.flush.interval.ms无论哪个达到,都会flush。

官方不建议通过上述的三个参数来强制写盘,数据的可靠性应该通过replica来保证,而强制flush数据到磁盘会对整体性能产生影响。

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

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

相关文章

linux--实时性优化

linux--实时性优化 1 介绍2 实时性需求3 代表性实时系统4 嵌入式系统嵌入式软件系统结构处理器时钟节拍多任务机制任务调度方式任务调度算法时间片调度算法优先级调度算法基于优先级的时间片调度算法 5 cyclictest 测试工具命令说明 6 linux 实时性改进某版本上发布实时补丁或者…

(三)MySQL 索引

欢迎访问 什么是索引? 提高查询效率的一种数据结构,索引是数据的目录 索引的分类 按「数据结构」分类:Btree索引、Hash索引、Full-text索引。按「物理存储」分类:聚簇索引、二级索引。按「字段特性」分类:主键索引…

JavaScript: Uncaught SyntaxError: Invalid or unexpected token

好久没有碰前端的代码了。。。 今天测试WebSocket功能&#xff0c;Client端&#xff1a;使用HtmlJavaScript&#xff0c;通过浏览器解析后&#xff0c;当做客户端&#xff1b; 客户端代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head&g…

装饰模式:鸡腿堡

文章目录 UML类图目录结构Humburger.javaChickenBurger.javaCondiment.javaChuilli.javaLettuce.javaTest.java深度理解test怎么写 UML类图 目录结构 我们从指向最多的开始写 Humburger.java package zsms;public abstract class Humburger {protected String name;public S…

学至乎没而后止也

开场白 学至后没而后止也这个题目的原话来自与荀子《劝学》。大家知道什么意思吗&#xff1f;学习要学到你人没了&#xff0c;才算停止了。通俗点说就是只要没学死就往死里学&#xff0c;高雅点说就是要保持终身学习。 在以前说终身学习好像是一种良好习惯或品德&#xff0c;…

AIGC 009-DaLLE2遇见达利!文生图过程中另外一种思路。

AIGC 009-DaLLE2遇见达利&#xff01;文生图过程中另外一种思路。 0 论文工作 首先&#xff0c;遇见达利是我很喜欢的名字&#xff0c;达利是跟毕加索同等优秀的画家。这个名字就很有意思。 这篇论文提出了一种新颖的分层文本条件图像生成方法&#xff0c;该方法利用 CLIP&…

C语言笔记20 •整数和浮点数在内存中存储•

整数和浮点数在内存中存储 1.整数在内存中存储 整数在内存中存储比较简单&#xff0c;整数存储分为正整数存储和负整数存储。 对于有符号整数 符号位中0表示正整数&#xff0c;1表示负整数。 正整数在内存中存储&#xff1a; 正整数原码&#xff0c;反码 &#xff0c;补码…

这款网站测试工具,炫酷且强大!【送源码】

随着互联网的普及和发展&#xff0c;Web 应用程序的数量也越来越多&#xff0c;各种网络问题也是层出不穷&#xff0c;因而监测这些 Web 应用程序的性能和可用性变得非常重要。 今天的文章&#xff0c;了不起和大家分享一款十分好用的的网站分析项目 - Web-Check。 项目简介 …

MemoryDB 2024 论文分享

论文地址点这里。 TL;DR MemoryDB 通过底层依赖 AWS 内部系统 Multi-AZ Transaction Log 实现了 11 个 9 的持久性保证。 通过依赖 Transaction Log 的 Condition API 和租约机制来实现了一致性和可用性保证。 通过周期性调度 Off-box 节点来外部 Rewrite binlog 避免了内存…

FastReport 主子表关系

代码中只需要绑定主表的数据就可以&#xff0c;子表的数据会通过报表中的关连关系自动到数据库中带出。 using CloudSaaS.DB.Handler; using CloudSaaS.Model; using CloudSaaS.DAL; using FastReport; using FastReport.Web; using System; using System.Collections.Generic;…

Llama模型家族训练奖励模型Reward Model技术及代码实战(一)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

安全术语 | 软件包purl详解:跨工具、数据库、API和语言之间可靠地识别和定位软件包

软件包URL&#xff08;purl&#xff0c;Package URL&#xff09;是一个URL字符串&#xff0c;用于在编程语言、包管理器、包约定、工具、API和数据库中以最通用和统一的方式识别和定位软件包。purl是对现有方法进行标准化的尝试&#xff0c;以可靠地识别和定位软件包。 有望取代…

服务案例|网络攻击事件的排查与修复

LinkSLA智能运维管家V6.0版支持通过SNMP Trap对设备进行监控告警&#xff0c;Trap是一种主动推送网络设备事件或告警消息的方式&#xff0c;与SNMP轮询&#xff08;polling&#xff09;不同&#xff0c;具有以下几点优势&#xff1a; 1. 实时监控与快速响应 SNMP Trap能够实时…

【网络协议】应用层协议HTTPS

文章目录 为什么引入HTTPS&#xff1f;基本概念加密的基本过程对称加密非对称加密中间人攻击证书 为什么引入HTTPS&#xff1f; 由于HTTP协议在网络传输中是明文传输的&#xff0c;那么当传输一些机密的文件或着对钱的操作时&#xff0c;就会有泄密的风险&#xff0c;从而引入…

Mowgli用于配对多组学整合

对同一组细胞的多个分子层进行分析逐渐流行。越来越需要能够联合分析这些数据的多视图学习方法。Mowgli是一种支持配对多组学数据的整合方法。值得注意的是&#xff0c;Mowgli将非负矩阵分解和最优传输相结合&#xff0c;同时提高了非负矩阵分解的聚类性能和可解释性。作者将Mo…

AIGC 010-CLIP第一个文本和图像对齐的大模型!

AIGC 010-CLIP第一个文本和图像对齐的大模型&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 不客气的说CLIP和扩散模型的成功让计算式视觉领域几乎所有工作都重新做了一遍。 CLIP&#xff08;对比语言-图像预训练&#xff09;论文提出了一种新的对比学习方法&a…

adb获取包名和界面名

adb获取包名和界面名 mac adb shell dumpsys window windows | grep mFocusedApp windows adb shell dumpsys window windows | findstr mFocusedApp 这个是在当前手机打开哪个界面获取的就是哪个界面的包名与界面 注意第一次连接时会有提示&#xff0c;需要连接两次才可以 …

Java设计模式(23种设计模式 重点介绍一些常用的)

创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式&#xff0c;共七种&#xff1a;适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式&#xff0c;共十一种&#xff1a;…

SpringBoot整合SpringSecurit,实现ajax的登录、退出、权限校验

1、本文章中SpringBoot整合SpringSecurity&#xff0c;只是基于session方式&#xff0c;并且没有使用到redis。 2、登录、登出都是通过ajax的方式进行。 项目目录&#xff1a; 1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xm…

Leecode热题100---二分查找---搜索插入位置

题目&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 nums 为 无重复元素 的 升序 排列数组 常规思路&#xff1a; class Solution { public:int f…