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 选举和配置管理提供了基础支持。

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

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

相关文章

安卓玩机工具-----无需root权限 卸载 禁用 删除当前机型app应用 ADB玩机工具

ADB玩机工具 ADB AppControl是很实用的安卓手机应用管理工具,无需root权限,通过usb连接电脑后,可以很方便的进行应用程序安装与卸载,还支持提取手机应用apk文件到电脑上,此外还有手机系统垃圾清理、上传文件等…

VMware Workstation Player虚拟机Ubuntu启用Windows共享目录

1、新建共享目录 2、安装并启用vmtools、fuse sudo apt update sudo apt install open-vm-tools open-vm-tools-desktop sudo apt install fuse sudo systemctl start open-vm-tools sudo systemctl enable open-vm-tools 3、命令挂载 sudo vmhgfs-fuse .host:/SharedFold…

初学Linux(学习笔记)

初学Linux(学习笔记) 前言 本文跳过了Linux前期的环境准备,直接从知识点和指令开始。 知识点: 1.目录文件夹(Windows) 2.文件内容属性 3.在Windows当中区分文件类型是通过后缀,而Linux是通过…

leaflet【十】实时增加轨迹点轨迹回放效果实现

实时轨迹回放 在前面有用leaflet-trackplayer实现了一个轨迹回放的效果,单击前往:轨迹回放效果&控制台控制轨迹运动效果 这篇文章主要是实现一下实时增加轨迹点,不改变原来运行轨迹和速度。这里是简易做了一个demo效果,大概…

vue3透传、注入

属性透传 传递给子组件时,没有被子组件消费的属性或事件,常见的如id、class 注意1 1.class、style是合并的,style中如果出现重复的样式,以透传属性为准2.id属性是以透传属性为准,其他情况透传属性名相同&#xff0c…

【AI视频】复刻抖音爆款AI数字人作品初体验

博客主页: [小ᶻZ࿆] 本文专栏: AI视频 | AI数字人 文章目录 💯前言💯抖音上的爆火AI数字人视频💯注册HeyGen账号💯复刻抖音爆款AI数字人💯最终生成效果💯小结 对比原视频效果:…

【算法篇】哈希类(笔记)

目录 一、常见的三种哈希结构 二、LeetCode 练习 1. 有效的字母异位词 2. 两个数组的交集 3. 快乐数 4. 两数之和 5. 四数相加II 6. 赎金信 7. 三数之和 8. 四数之和 一、常见的三种哈希结构 当想使用哈希法来解决问题的时候,一般会选择如下三种数据…

Java--String类

前言: 在之前的学习中,学习了和了解了一些类的基本使用,例如object类等等,但是我们用String这个引用或者说这个类其实我们已经用了好久,只不过没有具体分析过! 对于String类,它可以引用一个字符…

JavaScript web API part3

web API DOM 日期对象 > 得到当前系统的时间 new这个操作就是实例化 语法 const date new Date() or const date new Date(2004-11-3 08:00:00) 可以指定时间 > 可应用于通过系统时间和指定时间实现倒计时的操作 //得到当前时间const date new Date()console.lo…

【Python小知识 - 2】:在VSCode中切换Python解释器版本

文章目录 在VSCode中切换Python解释器版本 在VSCode中切换Python解释器版本 在VSCode中按下快捷键CtrlShiftP,出现命令框。 输入以下命令: Python: Select Interpreter输入命令回车后即出现不同的Python解释器选项,选择想要切换的Python解释器…

【题解】—— LeetCode一周小结37

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结36 9.合并零之间的节点 题目链接:2181. 合并零之间…

【最新综述】基于深度学习的超声自动无损检测(下)

4.Levels of automation 5.Basic axioms for DL-based ultrasonic NDE 在回顾了最新技术和每个自动化级别的贡献之后,我们不难发现,目前的数字语言方法论在不同论文之间存在着很大的差异。例如,有些作者提出了同时处理不同步骤的模型[121]&…

感知器神经网络

1、原理 感知器是一种前馈人工神经网络,是人工神经网络中的一种典型结构。感知器具有分层结构,信息从输入层进入网络,逐层向前传递至输出层。根据感知器神经元变换函数、隐层数以及权值调整规则的不同,可以形成具有各种功能特点的…

Java并发常见面试题(上)

Java并发常见面试题(上) 什么是线程和进程? 一个 Java 程序的运行是 main 线程和多个其他线程同时运行 进程:程序的一次执行过程,系统运行一个程序就是一个进程从创建,运行到消亡的过程。在Java中启动main函数就是开启一个进程,main函数所…

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统 在产品将要上线之前,需要制作不同类型格式的根文件系统 在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统 优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命 【1】重启上位机nfs服…

WPF利用Path自定义画头部导航条(TOP)样式

1;新建两个多值转换器,都有用处,用来动态确定PATH的X,Y州坐标的。 EndPointConverter 该转换器主要用来动态确定X轴,和Y轴。用于画线条的。 internal class EndPointConverter : IMultiValueConverter {public object Convert(object[] val…

wifiip地址可以随便改吗?wifi的ip地址怎么改变

对于普通用户来说,WiFi IP地址的管理和修改往往显得神秘而复杂。本文旨在深入探讨WiFi IP地址是否可以随意更改,以及如何正确地改变WiFi的IP地址。虎观代理小二将详细解释WiFi IP地址的基本概念、作用以及更改时需要注意的事项,帮助用户更好地…

PPT中的图形与图片:插入、调整与格式设置技术详解

目录 引言 一、图形与图片的插入 1. 插入图形 2. 插入图片 二、图形与图片的调整 1. 调整大小与位置 2. 裁剪与旋转 3. 图形与图片的合并与组合 三、图片格式与布局设置 1. 图片格式设置 2. 图片布局设置 示例案例:制作产品展示PPT 四、结论 引言 在现…

Harmony OS DevEco Studio低代码开发流程 - HarmonyOS开发自学5

一. 为什么要用低代码开发? HarmonyOS低代码开发方式,具有丰富的UI界面编辑功能,例如基于图形化的自由拖拽、数据的参数化配置等,通过可视化界面开发方式快速构建布局,可有效降低用户的时间成本和提升用户构建UI界面的…

【JVM】类加载

1. 类加载过程 Java虚拟机(JVM)的 类加载 过程是将字节码文件(.class文件)从存储设备加载到内存,并为其创建相应的类对象的过程。类加载是Java程序运行的基础,保证了程序的动态性和安全性。JVM的类加载过程…