Kafka 基础与架构理解

目录

前言

Kafka 基础概念

消息队列简介:Kafka 与传统消息队列(如 RabbitMQ、ActiveMQ)的对比

Kafka 的组件

Kafka 的工作原理:消息的生产、分发、消费流程

Kafka 系统架构

Kafka 的分布式架构设计

Leader-Follower 机制与数据复制

Log-based Storage 和持久化

Broker 间通信协议

Zookeeper 在 Kafka 中的角色

总结


前言

Kafka 是一个分布式的消息系统,主要用于构建实时数据管道和流式处理应用。它以高吞吐量、可扩展性、持久性和容错性而闻名。深入理解 Kafka 的基础概念和架构是学习和使用 Kafka 的关键,下面我们详细讲解这些内容。

Kafka 基础概念

Kafka 是一个分布式流处理平台,常用于构建实时数据管道和流式应用程序。它可以处理大量的实时数据流,具有高吞吐量、持久性、可扩展性和容错能力。为了更深入地理解 Kafka,我们可以将其与传统消息队列进行对比,并分析其核心组件和工作原理。

消息队列简介:Kafka 与传统消息队列(如 RabbitMQ、ActiveMQ)的对比

消息队列的主要功能是提供可靠的消息传递机制,允许应用程序之间异步通信。以下是 Kafka 和其他传统消息队列(如 RabbitMQ、ActiveMQ)的对比:

特性KafkaRabbitMQActiveMQ
架构类型分布式、日志存储、流式处理基于 AMQP 协议的队列模型基于 JMS 的传统消息代理
吞吐量极高,支持每秒数百万条消息中等,适合较低吞吐量的场景中等,吞吐量不及 Kafka
持久化方式顺序写入磁盘,日志分段,支持持久化基于内存和磁盘的消息持久化基于内存和磁盘的消息持久化
消息顺序单个分区内严格的顺序保证默认无顺序,除非使用严格顺序队列支持 FIFO 和非 FIFO 队列
消息模型发布-订阅模式(Pub/Sub),支持批量处理和流式处理点对点、发布-订阅模式,处理较小的消息点对点、发布-订阅模式,主要用于事务性消息传递
数据保留消费后可选择保留,支持长时间保留历史数据消费后消息删除消费后消息删除
扩展性支持水平扩展,轻松增加节点或分区不支持分布式扩展,需要集群才能支持扩展支持集群扩展,但不如 Kafka 易扩展

Kafka 以其高吞吐量、分布式架构、持久化日志存储以及对实时流处理的支持,成为现代流式处理系统的首选。相比之下,RabbitMQ 和 ActiveMQ 更适合于传统的低延迟消息传递或事务性应用场景。


Kafka 的组件

Kafka 的核心组件可以分为五个部分,分别是 Producer、Consumer、Broker、Topic、Partition、Offset。

  1. Producer(生产者)
    生产者是 Kafka 中负责发布消息的组件。它将数据写入到 Kafka 中的特定主题(Topic)。生产者可以选择消息的目标分区(Partition),也可以让 Kafka 根据配置自动分配。生产者发送消息时会指定以下内容:

    • Topic:消息的目标主题。
    • Partition:如果指定,消息将被写入到该分区。
    • Key:如果指定,Kafka 会根据 Key 来决定消息被写入哪个分区(通过 hash 函数)。
  2. Consumer(消费者)
    消费者是从 Kafka 主题中读取消息的组件。消费者可以独立消费消息,也可以加入到消费组(Consumer Group)中,每个组中的消费者分担消费不同分区的数据。对于每个分区,同一消费组内只有一个消费者会读取该分区的数据,这保证了消费组内的并行性与顺序性。

  3. Broker(代理)
    Broker 是 Kafka 的核心服务节点,它负责接收、存储、并分发消息。Kafka 集群由多个 Broker 组成,每个 Broker 负责管理一部分 Topic 的分区。Kafka 的 Broker 具有以下特点:

    • 高可用性:通过数据复制和 Leader-Follower 机制保证故障恢复和数据容错。
    • 水平扩展:Kafka 可以通过增加 Broker 实现横向扩展,处理更多的数据流。
    • 持久化存储:Broker 将消息持久化存储到磁盘上,支持高效的 I/O 操作。
  4. Topic(主题)
    主题是 Kafka 中存储消息的逻辑分类。生产者将消息发布到主题中,消费者从主题中读取消息。一个主题可以被划分为多个分区,每个分区独立存储一部分消息,允许并行读写。

  5. Partition(分区)
    分区是 Kafka 中的基本存储单元。每个主题可以被分为多个分区,分区之间的数据是相互独立的。每个分区内的消息按照严格的顺序写入,消费者也按照该顺序读取。分区的设计允许 Kafka 水平扩展,并支持高吞吐量。

  6. Offset(偏移量)
    Offset 是 Kafka 中用来标识消息在分区中的位置的整数。每条消息在分区内都会分配一个唯一的偏移量,消费者通过 Offset 追踪自己消费到的消息位置。Kafka 的 Offset 保持在分区内唯一,但不同分区之间的 Offset 无关。


Kafka 的工作原理:消息的生产、分发、消费流程
  1. 消息生产

    • 生产者将消息发送到 Kafka 集群,指定消息的目标 Topic 和可能的分区。
    • Kafka 将收到的消息存储到对应的分区内,每个分区存储在 Kafka 的 Broker 上。Kafka 使用顺序写入的方式将消息写入磁盘,并将消息追加到日志文件中,以提高写入性能。
    • 生产者可以配置发送消息的确认模式(ACK):
      • acks=0:生产者不等待 Broker 确认消息是否成功接收。
      • acks=1:生产者等待 Leader Broker 确认接收消息。
      • acks=all:生产者等待所有副本确认消息。
  2. 消息分发

    • Kafka 集群中每个分区都有一个 Leader,Leader 负责处理所有的读写请求。
    • Leader 会将消息同步到该分区的副本(Follower),以确保数据的可靠性和高可用性。Follower 只负责从 Leader 同步数据,不处理客户端的读写请求。
  3. 消息消费

    • 消费者从 Kafka 的特定分区中读取消息。每个消费组内的消费者共享读取同一个 Topic 的消息,但一个分区只能被一个消费组内的消费者读取。
    • 消费者使用 Offset 来跟踪消费进度。Kafka 不会删除已经消费的消息,除非达到了配置的保留策略。这样,消费者可以灵活地控制自己的消费进度,允许重试消费或按需从特定位置开始消费。
    • 消费组中的消费者自动协调分区的分配,Kafka 通过 Zookeeper 或 Kafka 内部协议来管理消费者分区再平衡。

Kafka 系统架构

Kafka 的设计目标是成为一个高吞吐量、分布式、可扩展的流处理平台,能够应对大规模实时数据流的需求。为了实现这一目标,Kafka 使用了分布式架构、Leader-Follower 机制、日志存储和数据持久化等技术。此外,Kafka 依赖于 Zookeeper 来协调集群中的元数据、分区分配和 Leader 选举。下面我们详细讲解 Kafka 的系统架构及其各个组成部分。

Kafka 的分布式架构设计

Kafka 的架构由多个 Broker(代理)、Producer(生产者)、Consumer(消费者)以及 Zookeeper 组成。Kafka 通过这些组件和分区(Partition)来支持水平扩展,实现高并发和大规模数据的处理。

  1. Broker(代理)

    • Kafka 集群由多个 Broker 组成,每个 Broker 是一个独立的服务器,负责接收、存储和分发消息。集群中的每个 Broker 都具有唯一的标识。
    • Topic(主题)是逻辑上的消息流分类,生产者将消息发布到 Topic,消费者从 Topic 中读取消息。每个 Topic 被划分为多个 Partition(分区),每个 Partition 是 Kafka 的基本存储单元。
    • Kafka 通过增加更多的 Broker 来扩展系统,以便支持更多的 Partition,从而分担负载,增强 Kafka 的扩展能力。
    • 水平扩展:Kafka 集群中的分区可以分布在不同的 Broker 上,以实现负载均衡。这样,Kafka 便可以通过增加 Broker 来水平扩展集群的容量和处理能力。
  2. Partition(分区)

    • 每个 Kafka 主题(Topic)由多个分区组成。每个分区独立存储消息,并且在分区内部,消息是按顺序追加的。
    • 分区是 Kafka 系统扩展性和并行处理的基础,允许多个消费者并行地读取同一个 Topic 的不同分区中的消息。
    • Kafka 的消息顺序性保证在分区内,每条消息都有一个唯一的 Offset(偏移量),表示消息在分区中的位置。消费者根据 Offset 读取消息。
  3. Producer(生产者)

    • 生产者是负责向 Kafka 集群发送消息的客户端。生产者可以决定将消息发送到哪个 Topic 和分区。
    • Kafka 通过分区将负载分摊给多个 Broker,生产者可以根据消息的 Key 使用哈希函数自动将消息发送到指定的分区,或者直接指定特定的分区。
  4. Consumer(消费者)

    • 消费者从 Kafka 中读取消息,可以独立工作,也可以加入到 消费组 中。
    • 在消费组内,不同的消费者负责读取不同的分区。同一个消费组内的消费者不会消费重复的消息,而不同消费组则可以独立消费同一消息。

Leader-Follower 机制与数据复制

Kafka 通过 Leader-Follower 机制 实现分布式系统的容错和高可用性。

  1. Leader 和 Follower 角色

    • 每个 Kafka 分区都有一个 Leader 和若干个 Follower 副本。Leader 负责处理所有的读写请求,Follower 只负责从 Leader 同步数据。
    • 当一个 Leader 节点发生故障时,Kafka 会通过 Zookeeper 选举出一个新的 Leader(从 Follower 中选出),从而保证集群的高可用性。
  2. 数据复制

    • Kafka 通过将每个分区的副本(Replica)分布在不同的 Broker 上,确保数据的高可用性和容错性。生产者发送的每条消息都会复制到多个 Broker 上的副本中。
    • 副本之间的数据同步采用 Leader-Follower 模型:Leader 处理所有的写操作,Follower 通过异步方式从 Leader 获取数据更新。如果 Leader 节点宕机,Kafka 会自动选择一个 Follower 成为新的 Leader。
  3. 复制因子(Replication Factor)

    • Kafka 的每个分区都有一个 复制因子,即该分区的副本数量。通常设置为 3,以确保在发生单个或多个节点故障时,系统仍能继续运行。
    • 消费者只会从 Leader 副本中读取数据,Kafka 会确保 Follower 同步到最新的消息,从而保证一致性。

Log-based Storage 和持久化

Kafka 使用基于日志的存储(Log-based Storage)机制来处理消息的存储和持久化。

  1. 消息日志(Message Log)

    • 每个分区是一个有序的、不可变的消息日志。生产者将消息追加到日志的末尾,Kafka 采用 顺序写入 的方式,将消息写入磁盘,从而提高写入效率和吞吐量。
    • 消息在磁盘上存储时具有非常高效的 I/O 性能,因为 Kafka 利用操作系统的 页缓存 来优化磁盘读写。
  2. 持久化(Persistence)

    • Kafka 中的消息持久化到磁盘后,不会在消息消费后立即删除。Kafka 可以根据配置的 保留策略(Retention Policy)来决定消息的保留时间或存储容量。
    • 消息可以被保留一段时间,或根据存储大小保留一部分数据,从而允许消费者回溯历史数据,甚至支持延迟消费。
  3. Segment 文件

    • Kafka 将消息日志切分为多个段(Segment),每个 Segment 文件存储一定数量的消息。这样 Kafka 既可以快速追加新消息,也可以定期清理过期的 Segment 文件,以节省磁盘空间。

Broker 间通信协议

Kafka 的 Broker 之间使用了高效的通信协议来处理数据的复制、分发和协调工作。Kafka 的通信协议采用了以下设计原则:

  1. TCP 协议
    Kafka 使用 TCP 进行通信,确保了消息传输的可靠性和高效性。

  2. 二进制协议
    Kafka 的通信协议是自定义的二进制协议,具有紧凑的消息格式和高效的网络传输性能。这个协议用于生产者与 Broker、消费者与 Broker 以及 Broker 之间的数据交换。

  3. Leader-Follower 数据同步协议
    Kafka 使用内部协议确保 Follower 副本能够从 Leader 副本中同步最新的消息。当 Follower 从 Leader 获取消息时,它会定期向 Leader 发送拉取请求。

  4. 消费者再平衡协议
    当新的消费者加入消费组或已有消费者离开时,Kafka 使用内部的再平衡协议,确保消费组中的消费者重新分配分区,保持消费过程的一致性和并行性。


Zookeeper 在 Kafka 中的角色

Kafka 使用 Zookeeper 作为元数据存储和协调工具,尽管较新版本的 Kafka 已经开始逐步脱离对 Zookeeper 的依赖,但它仍在许多 Kafka 部署中发挥关键作用。

  1. Leader 选举

    • Zookeeper 负责管理 Kafka 中的 Leader 选举过程。当 Kafka 分区的 Leader 出现故障时,Zookeeper 会协调新 Leader 的选举,保证 Kafka 集群的高可用性。
    • Zookeeper 维护 Kafka 中每个 Broker 的状态,以及分区的元数据。当检测到 Broker 宕机时,Zookeeper 会触发分区 Leader 的重新选举。
  2. 配置管理

    • Kafka 的集群配置(如分区、复制因子、Broker 配置等)存储在 Zookeeper 中。Kafka Broker 启动时会从 Zookeeper 获取集群的配置信息。
    • 通过 Zookeeper,Kafka 的管理员可以动态修改集群配置,而无需重新启动整个集群。
  3. 消费者分区再平衡

    • Zookeeper 也负责协调消费者组的分区分配。当新的消费者加入或现有消费者离开时,Zookeeper 触发再平衡操作,将分区重新分配给消费者。

总结

Kafka 的分布式架构设计通过使用分区、Broker、Leader-Follower 机制,以及 Zookeeper 的协调功能,实现了高可用性、容错性和高吞吐量。其基于日志的存储和持久化机制确保了消息的高效存储与传输,而 Zookeeper 则为集群的管理、Leader 选举和配置管理提供了基础支持。

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

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

相关文章

进击J6:ResNeXt-50实战

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、实验目的: 阅读ResNeXt论文,了解作者的构建思路对比之前介绍的ResNet50V2、DenseNet算法使用ResNeXt-50算法完成猴痘病识别 二、实…

jmeter之仅一次控制器

仅一次控制器作用: 不管线程组设置多少次循环,它下面的组件都只会执行一次 Tips:很多情况下需要登录才能访问其他接口,比如:商品列表、添加商品到购物车、购物车列表等,在多场景下,登录只需要…

【EJB】会话Bean(Session Bean)

单例会话****bean在每个应用程序中实例化一次,并存在于应用程序的生命周期中。单例会话bean是为单个企业bean实例在客户端之间共享和并发访问的环境而设计的。 单例会话Bean提供了与无状态会话Bean相似的功能,但与它们不同,因为每个应用程序…

【CanMV K230 AI视觉】人脸关键部位

【CanMV K230 AI视觉】人脸关键部位 人脸关键部位 (动态测试效果可以去下面网站自己看。) B站视频链接:已做成合集 抖音链接:已做成合集 人脸关键部位 人脸关键部位检测,主要检测脸部轮廓、眉毛、眼睛、鼻子和嘴巴&a…

【Kubernetes】K8s 的鉴权管理(二):基于属性 / 节点 / Webhook 的访问控制

K8s 的鉴权管理(二):基于属性 / 节点 / Webhook 的访问控制 1.基于属性的访问控制(ABAC 鉴权)2.基于节点的访问控制(node 鉴权)2.1 读取操作2.2 写入操作 3.基于 Webhook 的访问控制3.1 基于 We…

什么是 Grafana?

什么是 Grafana? Grafana 是一个功能强大的开源平台,用于创建、查看、查询和分析来自多个来源的数据。通过可视化仪表盘(Dashboard),它能够帮助用户监控实时数据、生成历史报告,甚至进行预测分析。Grafana…

深入解读Docker核心原理:Cgroups资源限制机制详解

在容器化技术中,除了资源的隔离,如何有效地控制和分配系统资源同样至关重要。Cgroups(Control Groups) 是Linux内核提供的一个强大机制,允许限制、监控和隔离进程组的系统资源使用情况。Cgroups是Docker实现容器资源限…

ffmpeg实现视频的合成与分割

视频合成与分割程序使用 作者开发了一款软件,可以实现对视频的合成和分割,界面如下: 播放时,可以选择多个视频源;在选中“保存视频”情况下,会将多个视频源合成一个视频。如果只取一个视频源中一段视频…

初识爬虫1

学习路线:爬虫基础知识-requests模块-数据提取-selenium-反爬与反反爬-MongoDB数据库-scrapy-appium。 对应视频链接(百度网盘):正在整理中 爬虫基础知识: 1.爬虫的概念 总结:模拟浏览器,发送请求,获取…

Minimax-秋招正式批-面经(SQL相关)

1. 谈谈对聚簇索引的理解 聚簇索引 InnoDB通过主键聚集数据,如果没有定义主键,InnoDB会选择非空的唯一索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引聚簇索引就是按照每张表的主键构造一颗B树,同时叶子…

挖耳勺可以和别人共用吗?口碑好的可视耳勺!

人体分泌的耳垢会有细菌,如果与别人共用挖耳勺很有可能会交叉感染,所以一般建议自己有专用的挖耳勺。小编可以给大家分享一款超好用又能实现一人一用的挖耳勺--可视挖耳勺,它有着高清内窥镜可以进入耳道实时查看情况,并且耳勺头采…

Unity人工智能开发学习心得

在Unity中进行人工智能研究与应用主要集中在几个关键领域,包括使用Unity ML-Agents插件进行强化学习、利用神经网络技术和深度学习技术训练AI,以及基于行为树技术设计游戏人工智能。 ‌使用Unity ML-Agents插件进行强化学习‌:Unity ML-Agent…

浏览器百科:网页存储篇-IndexedDB介绍(十)

1.引言 在现代网页开发中,数据存储需求日益增多和复杂,传统的客户端存储技术如localStorage和sessionStorage已难以满足大型数据的存储和管理需求。为了解决这一问题,HTML5 引入了 IndexedDB,在本篇《浏览器百科:网页…

Debug-027-el-tooltip组件的使用及注意事项

前言: 这两天,碰到这个饿了么的el-tooltip比较多。这个组件使用起来也挺简单的,常用于展示鼠标 hover 时的提示信息。但是有一些小点需要注意。这里不再机械化的介绍文档,不熟悉的话可以先看一下: https://element-pl…

Linux 硬件学习 s3c2440 arm920t蜂鸣器

1.查找手册时钟图,输入12m想要通过pll得到400m的信号 2.对比pll值,找到最近的为405,得到pll中mdiv为127,pdiv为2,sdiv为1 3.想要得到fclk400,hclk100,pclk50,对比分频比例&#xff0…

jmeter执行python脚本,python脚本的Faker库

jmeter安装 jython的插件jar包 通过如下地址下载jython-standalone-XXX.jar包并放到jmeter的XXX\lib\ext目录下面 Downloads | JythonThe Python runtime on the JVMhttps://www.jython.org/download.html 重启jmeter在JSR223中找到jython可以编写python代码执行 python造数据…

MySQL:运维管理-主从复制

目录 一、主从复制的概述二、主从复制的工作原理三、搭建主从复制的结构3.1 环境准备3.2 搭建配置(主库配置)3.3 搭建配置(从库配置)3.4 测试 一、主从复制的概述 主从复制是指将主数据库中的DDL和DML操作的二进制文件保存到本地&…

小间距LED显示屏的模组与箱体参数

随着显示技术的发展,小间距LED显示屏因其高清晰度和高亮度而越来越受到市场的欢迎。然而,对于许多用户来说,如何理解和选择小间距LED显示屏的参数可能是一个挑战。本文将详细介绍小间距LED显示屏的两大核心参数:模组参数和箱体参数…

Python画笔案例-045 绘制渐变圆盘

1、绘制 渐变圆盘 通过 python 的turtle 库绘制 渐变圆盘,如下图: 2、实现代码 绘制 渐变圆盘,以下为实现代码: """本程序需要coloradd模块支持,安装方法pip install coloradd """ import turtle …

2024年解锁高效项目管理的秘密:AI赋能的10款项目管理工具大比拼

在数字化转型的浪潮中,项目经理、产品经理、研发管理者以及企业管理者们正面临着前所未有的挑战。如何在快节奏的环境中保持高效,确保项目按时交付,同时保证质量,成为了每个团队都需要思考的问题。幸运的是,随着AI技术…