掌握 Apache Kafka:实时数据流核心完整指南

2025-05-27

掌握 Apache Kafka:实时数据流核心完整指南

在当今世界,实时数据驱动着业务决策和消费者体验,掌握 Kafka 对于任何使用大规模数据系统的人来说都至关重要。无论您是构建可扩展的数据管道、支持分析,还是开发实时应用程序,Kafka 都是一切的核心。但是,Kafka 究竟是什么?它是如何工作的?为什么它在处理海量数据流方面如此受欢迎?

在本指南中,我们将揭开 Kafka 的神秘面纱,从如何搭建包含多个 Broker 的 Kafka 集群,到理解分区、消费者偏移量和复制等复杂概念。无论您是初学入门,还是希望提升技能,本指南都将带您了解 Kafka 的方方面面,让您像专业人士一样应对实时数据挑战。

让我们开始吧!


Apache Kafka 是一个强大的分布式事件流平台,广泛用于实时数据处理。对于初学者来说,Kafka 的术语可能会让人感到不知所措,但它们是理解 Kafka 工作原理的关键。在本博客中,我们将揭秘 Kafka 的一些概念,例如集群、代理、生产者、消费者、主题、分区、流和连接,并以简单的方式逐步讲解它们的功能。


什么是 Apache Kafka?

Kafka 是一个分布式系统,旨在高效处理海量数据流。它充当中间人的角色,实现不同系统之间的实时数据交换。想象一下一个报纸投递系统:生产者是印刷机,消费者是读者,而 Kafka 则是确保报纸准时送达的投递系统。


图片描述

Kafka集群

Kafka 集群是一组协同工作的 Kafka Broker。

  • 每个代理都是一个 Kafka 服务器,用于处理来自客户端的读写请求并存储数据。
  • 为了实现容错和可扩展性,多个代理在集群中协作。
  • 示例:想象一下多个仓库协同存储和分发产品。这些仓库就是你的代理,而这个集体系统就是 Kafka 集群。

卡夫卡经纪人

Broker 是一个单独的 Kafka 服务器。

  • 每个代理都有一个唯一的 ID,并负责存储特定部分的数据。
  • 代理根据主题和分区在彼此之间分发传入的数据(消息)。
  • 即使一个代理发生故障,集群也可以使用存储在其他代理上的复制数据进行恢复。

Kafka制作人

生产者是向 Kafka 发送新数据的应用程序或系统。

  • 在我们的类比中,将生产者想象为报纸的出版商。
  • 它将数据发送到 Kafka 集群内的特定主题。例如:
    • 天气应用程序向 Kafka 发送实时温度数据。
    • 电子商务网站记录用户活动以进行实时分析。

Kafka消费者

消费者是从 Kafka 读取数据的应用程序。

  • 消费者订阅特定主题并处理传入的数据。
  • 例如,股票交易应用程序可能会使用实时市场数据来更新用户屏幕上的价格。

Kafka 主题

主题是发送消息的类别或提要名称。

  • 主题就像数据库中的表或文件系统中的文件夹。
  • 生产者向主题发送数据,消费者从主题读取数据。例如:“天气”主题包含与天气相关的更新。“股票价格”主题存储实时市场数据。

Kafka 分区

分区将主题分成更小的部分,以实现可扩展性和容错性。

图片描述

  • 每个主题分为一个或多个分区。
  • 示例:将分区想象为某个主题内的书页。
  • 每个页面包含该主题的一部分数据。
  • 分区的优点并行处理:多个消费者可以同时从分区读取数据。容错性:数据在分区之间复制,以便在发生故障时进行恢复。

分区数据顺序
Kafka 确保在每个分区内维护消息的顺序,但不在整个主题内维护消息的顺序。


Kafka 连接

Kafka Connect 允许您将 Kafka 与其他系统集成,而无需编写代码。

  • 它用于将数据移入和移出 Kafka,例如从数据库导入数据或将数据导出到数据仓库。
  • 示例:如果您想将数据从 MySQL 数据库同步到 Kafka 进行实时处理,Kafka Connect 可以处理此问题,而无需您编写复杂的脚本。

Kafka Streams

Kafka Streams 是一个用于构建流处理应用程序的库。

  • 它允许您在数据流经 Kafka 时对其进行转换、聚合或过滤。
  • 示例:假设您有一个购买数据流。您可以使用 Kafka Streams 计算实时销售趋势,例如每分钟的总收入。


设置 Kafka

以下是如何在您的系统上设置 Kafka 的简要概述:

1.下载 Apache Kafka

访问Apache Kafka 网站并下载最新版本。
将下载的文件解压到计算机上的文件夹中,
并保存在“C”文件夹中。

2.运行Zookeeper

  • Kafka 依靠 Zookeeper 来管理其代理。
  • 使用提供的 shell 脚本启动 Zookeeper
  • 我的文件位置是C:\kafka_2.13-3.9.0\bin\windows我从这里运行我的所有命令。
zookeeper-server-start.bat ..\..\config\zookeeper.properties
Enter fullscreen mode Exit fullscreen mode

3.启动Kafka Broker

  • 使用代理配置启动 Kafka:
kafka-server-start.bat ..\..\config\server.properties
Enter fullscreen mode Exit fullscreen mode

4.创建主题

  • 创建新主题来发送和接收消息:
kafka-topics.bat --create --topic my-topic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3
Enter fullscreen mode Exit fullscreen mode

运行上述命令后,您将看到显示此消息:

图片描述

5.生产和消费消息

  • 启动生产者发送消息:
kafka-console-producer.bat --broker-list localhost:9092 --topic my-topic
Enter fullscreen mode Exit fullscreen mode
  • 启动消费者读取消息:
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my-topic --from-beginning
Enter fullscreen mode Exit fullscreen mode

现在,您将打开以下 4 个命令提示符:

图片描述

让我们围绕生产者和消费者进行游戏:
在生产者提示中,我生产了像芒果和番石榴这样的数据,你会看到消费者正在成功消费数据!

图片描述

  • 现在,消费者命令中有两件事,如果我从一开始就说我不想要消息,那么我的命令将是
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my-topic
Enter fullscreen mode Exit fullscreen mode

因此,我们将从开始的地方获取数据:只有 sitafal 和苹果的消费者服务器,我们将获得:

图片描述


通过命令行发送带有密钥的 Kafka 消息

在 Kafka 设置中,消息排序、分区和键的使用在管理数据流和确保数据完整性方面起着至关重要的作用。下面,我们将讨论 Kafka 消息在有键和无键的情况下的行为,并介绍使用命令行实现这些概念的实际步骤。

了解消息分区和排序

1.无钥匙:

当您发送不带键的消息时,Kafka 会使用循环策略将它们分配到各个分区。这可以确保负载均衡,但无法维护各个分区之间的消息顺序。

示例:某个主题有两个分区(P1、P2)。消息 M1、M2、M3、M4 交替分发:

  • M1 -> P1
  • M2 -> P2
  • M3 -> P1
  • M4 -> P2

在这种情况下,消费者从随机分区读取消息,导致消息排序不可靠。

2. 使用 Key:
当使用 Key 发送消息时,Kafka 会通过对 Key 进行哈希算法来确定目标分区。具有相同 Key 的消息始终发送到同一个分区,从而确保这些 Key 的有序传递。

  • 当使用密钥发送消息时,由于它们位于同一分区,因此顺序将保持不变
  • 如果没有密钥,我们就无法保证消息的顺序,因为消费者会同时从所有分区轮询消息。

例子:

  • 键:order123,消息:M1、M2、M3->全部转到同一个分区(例如,P1)。
  • 键:userXYZ,消息:M4,M5 -> 这些转到另一个分区(例如,P2)。

实用命令行步骤

1.启动 Kafka:
确保 Kafka 代理和 ZooKeeper 正在运行。

zookeeper-server-start.bat ..\..\config\zookeeper.properties

kafka-server-start.bat ..\..\config\server.properties

Enter fullscreen mode Exit fullscreen mode

2.创建主题:
创建一个名为my_topic的主题,包含4个分区

kafka-topics.bat --create --topic fruits --bootstrap-server localhost:9092 --replication-factor 1 --partitions 4
Enter fullscreen mode Exit fullscreen mode

3.启动生产者和消费者

制片人:

kafka-console-producer.bat --broker-list localhost:9092 --topic fruits --property "key.separator=-" --property "parse.key=true"
Enter fullscreen mode Exit fullscreen mode

消费者:

kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic fruits --from-beginning -property "key.separator=-" --property "print.key=false"
Enter fullscreen mode Exit fullscreen mode
  1. 使用密钥发送消息:要使用密钥发送消息,请指定由分隔符分隔的键和值对

输入键值对,例如:

hello-apple
hello-banana
hello-kiwi
bye-mango
bye-gauva

Enter fullscreen mode Exit fullscreen mode

5.消费消息:
要消费消息,请使用 Kafka 消费者。对于有序消费:

图片描述


关键要点

  • 使用键来确保分区内的消息排序。
  • 了解权衡:循环确保均匀分布,而键允许排序但可能导致分区负载不均匀。
  • 利用 Kafka 的消费者偏移管理实现可靠的处理。

高级概念:消费者组和偏移量
Kafka 使用消费者偏移量来跟踪消息消费的进度。

1.偏移和可靠性:

Kafka 维护一个内部主题 (__consumer_offsets),用于存储消费者组已处理的每个分区的最新偏移量。如果消费者发生故障并重新启动,它将从上次提交的偏移量恢复。

2.消费者群体:

同一组中的多个消费者之间可以分担分区消费,确保数据处理高效。不同组中的消费者可以独立消费同一主题的消息。

运行 zookeeper 和服务器:

zookeeper-server-start.bat ..\..\config\zookeeper.properties

kafka-server-start.bat ..\..\config\server.properties

Enter fullscreen mode Exit fullscreen mode
kafka-topics.bat --bootstrap-server localhost:9092 --list
Enter fullscreen mode Exit fullscreen mode

图片描述

现在让我们来分组消费者:

kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my-topic --from-beginning
Enter fullscreen mode Exit fullscreen mode

一旦你启动消费者,kafka 就会将其分组到消费者组中,并使用新的唯一 ID 创建新的

kafka-consumer-groups.bat --bootstrap-server localhost:9092 --list
Enter fullscreen mode Exit fullscreen mode

图片描述

让我们再次启动消费者,它将创建另一个消费者组并列出以下内容:

图片描述

kafka-topics.bat --describe --topic my-topic --bootstrap-server localhost:9092
Enter fullscreen mode Exit fullscreen mode

图片描述

开始制作人:

kafka-console-producer.bat --broker-list localhost:9092 --topic my-topic
Enter fullscreen mode Exit fullscreen mode

并在 3 个不同的提示符下使用相同的命令启动了 3 个消费者:

kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my-topic --group console-consumer-93231
Enter fullscreen mode Exit fullscreen mode

现在我们有 3 个消费者和 1 个生产者

  1. 我生产数据1、2、3、4 -> 图片右上角已经消费了数据
  2. 然后我停止左下角消费者 ->
  3. 然后我生成数据 5,6,7,8 -> 右下角的消费者消费数据

图片描述


如何设置具有三个代理的 Kafka 集群:分步指南

图片描述

Kafka 是一个强大的分布式事件流平台,其工作原理是允许应用程序实时发布和订阅记录流。为了了解如何在生产环境中高效地扩展 Kafka,搭建一个包含多个 Broker 的 Kafka 集群至关重要。在本篇博文中,我们将引导您完成搭建包含三个 Broker 的 Kafka 集群的过程。

步骤 1:了解 Kafka 集群
Kafka 集群本质上是一组 Kafka Broker 的集合,它们协同工作,提供高可用性和容错性的消息传递系统。每个 Broker 管理一部分数据,并将主题划分为跨集群中各个 Broker 的分区。复制机制确保每个分区在多个 Broker 之间进行复制,以实现容错性。

步骤 2:设置 Broker 配置
启动 Kafka Broker 的过程涉及为集群中的每个 Broker 配置一个 server.properties 文件。以下是三个 Broker 的配置方法:

1.创建三个配置文件:对于三个代理,您需要创建三个不同的server.properties文件,每个文件都有独特的配置:

Broker ID(0、1、2)
用于通信的端口号
用于存储日志的日志目录
示例:

Broker 0:server.properties 文件,Broker ID 为 0,端口为 9092,并带有唯一的日志目录。Broker
1:server1.properties 文件,Broker ID 为 1,端口为 9093,并带有另一个日志目录。Broker
2:server2.properties 文件,Broker ID 为 2,端口为 9094,并带有一个单独的日志目录。

图片描述

2.配置 Broker:每个 server.properties 文件必须指定唯一的 Broker ID、端口和日志目录。您可以使用 Visual Studio Code 等文本编辑器在配置文件中修改这些内容。

3.启动代理:配置文件准备好后,您可以使用以下命令运行 Kafka 服务器来启动每个代理:

例如:

经纪人 0:kafka-server-start.bat ..\..\config\server.properties
经纪人 1:kafka-server-start.bat ..\..\config\server1.properties
经纪人 2:kafka-server-start.bat ..\..\config\server2.properties

图片描述

启动代理后,您将看到它们在各自的端口上运行,准备接受连接。

步骤3:创建主题并设置复制因子。
一旦代理运行起来,就该创建 Kafka 主题并配置其复制因子了。复制因子定义了在各个代理之间维护主题分区的副本数量。

你必须让你的动物园管理员处于运行状态:

zookeeper-server-start.bat ..\..\config\zookeeper.properties
Enter fullscreen mode Exit fullscreen mode

下面介绍如何创建具有三个复制因子和三个分区的主题:

kafka-topics.bat --create --topic gadgets --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --replication-factor 3 --partitions 3
Enter fullscreen mode Exit fullscreen mode

图片描述

在此示例中,复制因子为 3,确保主题的数据在集群中的所有三个 Broker 之间复制。这对于容错至关重要,因为即使一个 Broker 发生故障,Kafka 也能保持数据可用性。

步骤 4:生成和使用消息
创建主题后,您可以通过生成和使用消息来测试设置。

1.Producer:使用Kafka生产者向主题发送消息:

kafka-console-producer.bat --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --topic gadgets
Enter fullscreen mode Exit fullscreen mode

您可以发送诸如 Hello、Laptop、Mouse 和 Monitor 之类的消息,它们将被发布到主题的分区。

2.Consumer:使用Kafka消费者从主题读取消息:

kafka-console-consumer.bat --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --topic gadgets --from-beginning
Enter fullscreen mode Exit fullscreen mode

图片描述

您将看到其中C:\tmp\kafka-logs创建了 3 个文件夹,C:\tmp\kafka-logs1并且C:\tmp\kafka-logs2

图片描述

正如您在教程中看到的,数据将在各个 Broker 之间复制。例如,如果一条消息发送到分区 0,它将被复制到 Broker 0 和 1。同样,如果一条消息发送到分区 1,它将被复制到 Broker 1 和 2,依此类推。

步骤 5:理解同步副本 (ISR)
在 Kafka 中,同步副本 (ISR) 是一个关键概念。它指的是给定分区的副本集,这些副本完全与该分区的 Leader 同步。分区 Leader 负责处理该分区的所有读写请求。

1.ISR 的工作原理:Kafka 中的每个分区都有一个 Leader 和多个 Follower(副本)。Leader 负责管理数据,Follower 负责复制数据。ISR 负责确保数据在各个 Broker 之间正确复制。

2.故障转移机制:如果 ISR 中的 Broker 发生故障,Kafka 会自动将其中一个 Follower 提升为新的 Leader,从而确保数据始终可用。这对于保持高可用性和可靠性至关重要。

您可以使用以下命令检查主题的 ISR 状态:

kafka-topics.bat --describe --topic gadgets --bootstrap-server localhost:9092,localhost:9093,localhost:9094
Enter fullscreen mode Exit fullscreen mode

图片描述

步骤 6:测试故障转移
要测试故障转移机制,您可以关闭集群中的某个 Broker,并观察 ISR 如何进行调整。每个分区的 Leader 都会发生变化,ISR 将确保副本始终保持最新状态。

图片描述

总结
在本教程中,我们成功搭建了一个包含三个 Broker 的 Kafka 集群,创建了一个副本数为 3 的主题,并测试了消息的生成和消费。了解 Kafka 如何管理复制、分区和故障转移对于构建可靠且可扩展的事件驱动系统至关重要。借助 Kafka 强大的容错机制,您可以自信地部署 Kafka 集群来处理高吞吐量的实时数据流。

您可以通过观看下一个视频来继续学习有关 Kafka 中同步副本 (ISR) 的重要性,该视频进一步解释了 Kafka 如何确保跨代理的数据一致性和可用性。


我已经解释了上面列出的关键主题,但为了清楚起见,这里对每个主题进行简要总结:

1.Kafka集群、Kafka Broker、生产者、消费者:

Kafka 集群:一组 Kafka 代理服务器,它们协同工作以处理大量数据流。Kafka 集群支持分布式处理和扩展。Kafka
代理服务器: Kafka 代理服务器是 Kafka 生态系统中的服务器,用于存储数据并响应客户端请求(例如生产者和消费者)。
生产者:生产者向 Kafka 主题发送消息。它可以写入一个主题的多个分区。
消费者:消费者从 Kafka 主题读取消息。消费者可以加入消费者组,以分散消息处理。

2.Kafka Topic 和 Partition:

主题:生产者向其发送消息,消费者从中读取消息的类别或 feed 名称。主题是 Kafka 组织消息的主要机制。
分区:一个主题可以包含多个分区,以实现并行处理和数据复制。每个分区都是一个有序日志,有助于在 Kafka Broker 之间分发数据。

3.如何从命令行发送Kafka消息(使用密钥):

Kafka 提供了命令行工具(例如kafka-console-producerkafka-console-consumer),允许用户发送和消费消息。生产者可以为消息添加一个键,用于将消息路由到特定的分区。

4.了解消费者偏移、消费者群体和……

消费者偏移量: Kafka 使用偏移量来跟踪每个消费者的进度,偏移量指示消费者在日志中的位置(消费者当前正在读取的消息)。
消费者组:一组消费者协同工作,从主题中消费数据。Kafka 确保每个分区每次只被组中的一位消费者读取。如果一个组中有多个消费者,则主题的分区将在这些消费者之间进行拆分。

5.掌握 Kafka 的艺术:一步一步的消费者抵消和……

这需要了解如何管理消费者偏移量,可以依赖 Kafka 的默认偏移量管理,也可以根据业务逻辑手动提交偏移量。合理的偏移量管理可以确保消费者在发生故障后能够从正确的位置恢复读取。

6.Kafka 基础知识:了解段,...

Kafka 将消息以段的形式存储在日志文件中。每个分区的日志被拆分成多个段,以便高效地存储和检索。随着时间的推移,旧的段会根据保留策略等配置设置被删除。

7.如何创建包含 3 个 Broker 的 Kafka 集群:了解复制因子

这需要搭建一个包含多个 Broker(比如 3 个)的 Kafka 集群,每个 Broker 存储一部分数据。复制因子决定了每个分区在各个 Broker 上的副本数量,从而确保高可用性和容错能力。

8.Kafka中的ISR(同步副本):

ISR(同步副本)是指分区中与主副本完全同步(即,它们具有相同数据)的副本集。ISR 确保只有保持最新状态的副本才有资格成为分区的主副本。
这些主题构成了理解和使用 Apache Kafka 所需的核心知识,无论您是要设置 Kafka 集群、生产和消费消息,还是处理消费者组、复制和偏移量等更高级的概念。

如果您想深入了解任何特定主题或需要更详细的示例,您可以查看此博客使用 ASP.NET Core 的 .NET 6 中的 Kafka 生产者和消费者示例)!

学习愉快!

文章来源:https://dev.to/renukapatil/mastering-apache-kafka-a-complete-guide-to-the-heart-of-real-time-data-streaming-3456
PREV
编写优美的代码
NEXT
在本地主机上运行 SSL