Kafka 基础与架构理解

news2024/11/13 12:02:21

目录

前言

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.coloradmin.cn/o/2130709.html

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

相关文章

新品|瑞芯微RK3588工控机IPC8801适用AI算力、边缘计算、工业视觉

深圳触觉智能重磅推出旗舰级工控机IPC8801,搭载瑞芯微RK3588 ⼋核处理器;全铝紧凑机身、支持无风扇被动散热低噪音,确保设备在恶劣工业环境下稳定运行。 作为AI算力、边缘计算及工业视觉领域的高性能工控机,在国产化智能硬件与系统…

Axure PR 9 标签 设计交互

大家好,我是大明同学。 这期内容,我们将深入探讨Axure中可编辑标签元件设计与交互技巧。 可移除标签元件 创建可移除标签所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个文本框元件。 3.选中文本框元件&#xff0c…

视频服务器:GB28181网络视频协议

一、前言 某项目中需要集成视频管理平台,实现分布在各省公司的摄像及接入,对视频进行统一管理。本项目中视频管理平台采用GB/T28181实现的监控设备接入管理平台,支持在开放互联网和局域网对监控设备进行远程接入、远程管理、远程调阅、录像回…

【文件包含】——日志文件注入

改变的确很难,但结果值得冒险 本文主要根据做题内容的总结,如有错误之处,还请各位师傅指正 一.伪协议的失效 当我们做到关于文件包含的题目时,常用思路其实就是使用伪协议(php:filter,data,inpput等等)执行…

【NOI-题解】1407. 图像相似度1330. 求最大梯形的面积1384. 靶心数1398. 奇偶统计

文章目录 一、前言二、问题问题:1407. 图像相似度问题:1330. 求最大梯形的面积问题:1384. 靶心数问题:1398. 奇偶统计 三、感谢 一、前言 欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 本章节主要对…

优秀的安防视频监控平台应该具备怎样的视频编解码能力?

随着安防技术的飞速发展,监控平台作为保障公共安全、维护社会秩序的重要工具,其性能与效率日益成为行业关注的焦点。其中,监控平台的视频编码能力在视频监控系统中扮演着至关重要的角色,视频编码技术作为监控系统的核心组成部分&a…

200美元/月的ChatGPT Pro版上线?OpenAI草莓模型曝两周内发布,但模型表现要打个问号?

夕小瑶科技说 原创 作者 | 海野 现在看到“草莓”两个字,我已经条件反射了,已经不再是之前单纯的香香甜甜的草莓了。 一早醒来,又发生了两件“大事”: 一个是OpenAI的草莓(strawberry)被曝要提前了&#xf…

Xorbits Inference(Xinference):一款性能强大且功能全面的大模型部署与分布式推理框架

大模型部署与分布式推理框架Xinference Xinference的基本使用概述安装启动服务模型部署模型参数配置说明 API接口概述对话接口模型列表嵌入模型Rerank模型使用Xinference SDK使用OpenAI SDK 命令行工具概述启动模型引擎参数其他操作 集成LoRA启动时集成LoRA应用时集成LoRA 部署…

Stable Diffusion绘画 | ControlNet应用-Tile(分块)—tile_resample(分块-重采样)

要想使用 SD 生成高品质图片,放大增加分辨率是必不可少的环节。 tile_resample(分块-重采样) 主要是将图片切分成很多个分块,并识别每个分块的信息,最终通过特定算法把分块的信息重组起来。 能有效避免直接对一整张图片统一处理&#xff0c…

TensorFlow深度学习框架改进K-means聚类、SOM自组织映射算法及上海招生政策影响分析研究...

全文链接:https://tecdat.cn/?p37652 分析师:Chen Zhang 在教育政策研究领域,准确评估政策对不同区域和学生群体的影响至关重要。2021 年上海市出台的《上海市初中学业水平考试实施办法》对招生政策进行了调整,其中名额分配综合…

LSS可视化分析

1 完整 2 去掉plt.imshow(img_show) 3 去掉plt.axis(‘off’) 4 去掉plt.annotate(cams_text[img_id].replace(‘_’, ’ ), (0.01, 0.92), xycoords=‘axes fraction’)

3C电子胶黏剂在手机制造方面有哪些关键的应用

3C电子胶黏剂在手机制造方面有哪些关键的应用 3C电子胶黏剂在手机制造中扮演着至关重要的角色,其应用广泛且细致,覆盖了手机内部组件的多个层面,确保了设备的可靠性和性能。以下是电子胶在手机制造中的关键应用: 手机主板用胶&…

【蓝桥杯省赛真题52】Scratch猪八戒落地 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

scratch猪八戒落地 第十五届青少年蓝桥杯scratch编程省赛真题解析 一、题目要求 编程实现 1)点击绿旗,猪八戒在空中踩着一朵云,如图所示; 2)1秒后,猪八戒踩着云向地面移动,如图所示; 3)猪八…

海外问卷调查有其他方式赚美金吗?

大家好,我是梦蝶问卷,专注于海外问卷调查项目。 大家应该都了解,做海外问卷项目填写问卷能赚美金,那除此之外,还有其它盈利模式吗?答案当然是肯定的。 有创业过的朋友应该都知道,一个项目的每个…

spring项目期间的学习9/11

核心:需要计算具体要求字段出现的数量使用count,需要返回出现字段的数量需要使用AS,需要避免重复需要使用distinct,需要具体体现在8月份需要使用like 代码如下: selectcount(distinct device_id) as did_cnt,count(question_id) …

UDS 诊断 - RequestUpload(请求上传)(0x35)服务

UDS 诊断服务系列文章目录 诊断和通信管理功能单元 UDS 诊断 - DiagnosticSessionControl(诊断会话控制)(0x10)服务 UDS 诊断 - ECUReset(ECU重置)(0x11)服务 UDS 诊断 - SecurityA…

一篇文章,讲清SQL的 joins 语法

SQL 中的不同 JOIN 类型: 1. (INNER)JOIN(内连接):返回两个表中具有匹配值的记录。 2. LEFT(OUTER)JOIN(左外连接):返回左表中的所有记录&#…

【SQL】百题计划:SQL内置函数“LENGTH“的使用

【SQL】百题计划-20240912 方法一: Select tweet_id from Tweets where LENGTH(content) > 15;– 方法二: Select tweet_id from Tweets where CHAR_LENGTH(content)> 15;

【DataSophon】Yarn配置历史服务器JobHistory和Spark集成historyServer

目录 一、概述 1.1历史服务器JobHistory 1.2 Spark历史服务器HistoryServer 二、集成配置 一、概述 1.1历史服务器JobHistory 为了查看程序的历史运行情况,需要配置一下历史服务器。方便在xxxx:8088查看历史任务运行日志信息。 1.2 Spark历史服务器HistoryServ…

夜幕降临 Nightfall Comes,官方中文,解压即玩,

游戏截图 《Nightfall Comes》是一款基于俯视角3D动作的Rogue-lite游戏, 讲述了四位角色的故事,他们怀着对已灭亡世界的最后执念,聚集在一个领地上的城堡中。 下载地址: 夜幕降临 Nightfall Comes,官方中文,解压即玩,