Kafka之【存储消息】

数据已经由生产者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数据到磁盘会对整体性能产生影响。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决ModuleNotFoundError: No module named ‘dnnlib‘问题

复现论文采用了大佬的库,这时候运行报错: 尝试采用:pip install dnnlib解决,但下载源中并不包含该依赖。 解决方法: pip install https://github.com/podgorskiy/dnnlib/releases/download/0.0.1/dnnlib-0.0.1-py3-n…

python数据类型之列表

目录 1.创建列表 2.列表基础操作 常用操作 对列表元素顺序随机打乱 列表下标和切片 字符串分割为列表 列表位移 列表切片替换 3.列表内置方法 4.列表排序 简单排序 使用key参数按指定规则排序 二维列表排序 自定义排序规则函数 5.列表排序算法 选择排序 柱状图…

MiniMax Golang2轮面试,期望薪资25K

一面 1、自我介绍 2、简单介绍一下你们成立了这个finance的财务中台之后,整体的服务架构是怎么样的吗? 3、就你提到的预算池项目,展开说说背景,以及解决了怎么样的问题? 4、为什么采用针对T-1订单的异步计算方案&a…

java语言概述和代码的编译

文章目录 前言 一、机器语言 二、汇编语言 三、高级语言 四、编写代码 打印字符串 求前n项和 五、问题及解决 总结 前言 计算机经过了多年的发展,已经诞生了很多编程语言,如早期的汇编语言,basic语言,现在的高级语言C语言java语言…

计算机网络——TCP 协议的三次握手 / 四次挥手

简述 TCP / UDP 协议都是传输层的协议。 UDP 是面向无连接的协议,就是说发送端不在乎消息数据是否传输到接收端了,所以会出现数据丢失的情况,所以可靠性也不高。 TCP 是面向连接的、可靠的、基于字节流的传输层协议。所谓面向连接的&#…

探秘死锁:原理、发生条件及解决方案

探秘死锁:原理、发生条件及解决方案 死锁是多线程编程中常见的一个问题,它会导致程序停止响应,进而影响系统的稳定性和性能。理解死锁的原理、发生条件以及如何预防和解决死锁是编写健壮并发程序的关键。 1. 死锁的定义 死锁是指两个或多个…

Linux--软硬链接

目录 0.文件系统 1.软硬链接 1.1见一下软硬链接 1.2软硬链接的特征 1.3软硬链接是什么,有什么作用(场景) 0.文件系统 Linux--文件系统-CSDN博客 1.软硬链接 1.1见一下软硬链接 1.这是软链接 这个命令在Unix和Linux系统中用于创建一个符号…

SQL刷题笔记day3——第二大值

1题目 我的错误代码: select emp_no,salary from salaries where salary (select salary from salaries group by salary order by salary limit 1,1 ) order by emp_no asc 正确代码: select emp_no,salary from salaries where salary (select sal…

jellyfish安装及使用(Bioinformatics工具-020)

01 背景 基因组survey以测序技术为基础,基于小片段文库的低深度测序,通过K-mer分析,快速获得基因组大小、杂合度、重复序列比例等基本信息,为制定该物种的全基因组de novo测序策略提供有效依据。 jellyfish (水母) 是一个用于快…

Cisco Nexus Leaf上线注册到APIC,并配置带外管理IP操作方法

现场2台Nexus93108交换机需要注册到APIC上,成为Leaf交换机。 在ACI的架构中,所有Leaf节点交换机要连接到SPINE交换机上,我们的spine交换机型号为Nexus 9364 Leaf N93108TC-EX长这样, 前面是48个万兆电口,后面6个端口支持40G或100…

maven打包报错:MalformedInputException: Input length = 1

maven 打包时报错: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources (default-resources) on project ec-work-mes: filtering /Users/ecmaster/svn/ecmaster/ynmk/ynmk-mes/ec-work/ec-work-mes/src/main/resou…

Linux配置nginx代理功能

ywtool运维工具下载链接及介绍: 工具下载/介绍/安装页面 目录 一.nginx proxy功能介绍二.配置nginx proxy功能2.1 新增nginx代理配置2.1.1 反向代理(当前只举例https转https)2.1.2 负载均衡(当前只举例https转https) 2.2 修改nginx代理配置2.2.1 手动修改配置文件2.2.2 通过此脚…

利用java8 的 CompletableFuture 优化 Flink 程序,性能提升 50%

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

【数据结构】线性表习题 |顺序表 |链表 |栈和队列

📖专栏文章:数据结构学习笔记 🪪作者主页:格乐斯 前言 线性表习题 |顺序表 |链表 |栈和队列 顺序表和链表 1、 选B 1002(5-1)108* 第i个元素地址X,元素长度Len,第j个元素地址Y 公式:YXL…

Docker进入容器查看内容并从容器里拷贝文件到宿主机

工作中需要从docker正在运行的镜像中复制文件到宿主机,于是便将这个过程记录了下来。 (1)查看正在运行的容器 通过以下命令,可以查看正在运行的容器: docker ps (2)进入某个容器执行脚本 我…

备考AMC8和AMC10竞赛,吃透2000-2024年1850道真题和解析(持续)

多做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一,通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。 今天我们继续…

Android Audio基础——AudioFlinger回放录制线程(七)

AndioFlinger 作为 Android 的音频系统引擎,重任之一是负责输入输出流设备的管理及音频流数据的处理传输,这是由回放线程 PlaybackThread 及其派生的子类和录制线程 RecordThread 进行的。 一、基础介绍 1、关系图 ThreadBase:PlaybackThread 和 RecordThread 的基类。 Re…

群晖NAS使用Docker部署WPS Office结 合内网穿透实现远程编辑本地文档

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本,通过…

redis--redis Cluster

简介 解决了redis单机写入的瓶颈问题,即单机的redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连…

Redis机制-Redis互斥锁、分布式锁

目录 一 互斥锁 二 分布式锁 Redis实现分布式锁 redisson实现分布式锁 可重入性: 主从一致性(性能差): 一 互斥锁 假设我们现在有一个业务要实现秒杀优惠券的功能,如果是一个正常的流程,线程之间应该…