65.9K
CodeProject 正在变化。 阅读更多。
Home

Kafka 初学者理解指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (14投票s)

2020年8月1日

CPOL

8分钟阅读

viewsIcon

21582

本指南旨在帮助您了解Kafka,并在Windows环境中进行数据管道的设置与测试。

kafka-logo

Java & Scala 开源项目

引言

Apache Kafka 是一个分布式流处理平台,具有三个关键能力:

  • 消息系统 – 发布/订阅记录流
  • 可用性与可靠性 – 以容错和持久的方式存储记录流
  • 可扩展与实时 – 处理正在发生的记录流

数据系统组件

Kafka通常用于将数据流式传输到应用程序数据湖和实时流分析系统

<kafka-highlevel-architecture>

应用程序将消息输入到Kafka服务器。这些消息可以是任何计划捕获的定义信息。它们以可靠的方式(由于Kafka的分布式架构)传递给另一个应用程序或服务进行处理或重新处理。

内部,Kafka使用数据结构来管理其消息。这些消息在数据结构单元级别应用了保留策略。保留策略是可配置的——基于时间或基于大小。默认情况下,发送的数据存储168小时(7天)。

Kafka架构

通常,会有多个生产者、消费者、集群协同处理消息。通过添加更多代理(brokers)可以轻松实现水平扩展。下图描绘了示例架构。

kafka-internals

Kafka通过TCP协议在客户端和服务器之间进行通信。更多详细信息,请参阅Kafka协议指南

Kafka生态系统提供REST代理,允许通过HTTP和JSON轻松集成。

主要有四个关键API:生产者API消费者API流API连接器API

关键组件与相关术语

  • 消息/记录 – 对象的字节数组。包含键、值和时间戳。
  • 主题 – 分类后的消息流。
  • 生产者 – 将消息发布到Kafka主题的进程。
  • 消费者 – 订阅主题并处理已发布消息流的进程。
  • 代理 (Broker) – 托管主题。也称为Kafka 服务器或Kafka 节点
  • 集群 – 由一个或多个代理组成。
  • Zookeeper – 维护集群的状态(代理、主题、消费者)。
  • 连接器 – 将主题连接到现有应用程序或数据系统。
  • 流处理器 – 消耗来自主题的输入流并产生输出流到输出主题。
  • ISR(In-Sync Replica,同步副本)– 用于支持故障转移的复制。
  • 控制器 – 集群中负责维护所有分区领导者/追随者关系的代理。

动物园管理员

Apache ZooKeeper是一个开源项目,有助于构建分布式应用程序。它是一个用于维护配置信息的集中式服务。它负责以下事项:

  • 代理 状态 – 维护活动代理列表以及它们所属的集群。
  • 已配置主题 – 维护所有主题列表、每个主题的分区数、所有副本的位置、首选领导者是谁、分区的ISR列表。
  • 控制器 选举 – 当节点关闭时选择新的控制器。同时确保在任何给定时间只有一个控制器。
  • ACL 信息 – 维护所有主题的访问控制列表(ACL)。

Kafka内部机制

集群中的代理通过一个通常是唯一的数字ID来区分。连接到一个代理即可将客户端引导至整个Kafka集群。它们接收来自生产者的消息,并允许消费者按主题、分区和偏移量(offset)获取消息。

一个主题在Kafka集群中分布为一个或多个分区的逻辑组。分区被定义为分布在多个代理上的有序消息序列。每个主题的分区数在创建时是可配置的。

生产者写入主题。消费者从主题读取。

<kafka-partition>

Kafka使用日志数据结构来管理其消息。日志数据结构是一组有序的,段是消息的集合。每个段都有文件,用于定位消息。

  1. 日志文件 – 存储消息。
  2. 索引文件 – 存储消息偏移量及其在日志文件中的起始位置。

Kafka将来自生产者的记录追加到主题日志的末尾。消费者可以从任何已提交的偏移量读取,并且可以自由选择从任何偏移量点读取。只有当分区的所有ISR写入其日志后,记录才被认为是已提交的。

在多个分区中,有一个领导者,其余是副本/追随者以提供备份。如果领导者失败,将选择一个ISR作为新的领导者。领导者负责特定主题分区的全部读写操作。追随者被动地复制领导者。消费者只能从领导者分区读取。

分区的领导者和追随者永远不会位于同一节点上。

leader-follower2

Kafka也支持记录的日志压缩。通过此功能,Kafka将保留记录的最新版本并删除旧版本。这实现了一种精细化的保留机制,其中每个键的最后更新都将被保留。

偏移量管理器(Offset manager)负责存储、获取和维护消费者偏移量。每个活动的代理都有一个偏移量管理器实例。默认情况下,消费者配置为使用周期性间隔的自动提交策略。或者,消费者可以使用提交API进行手动偏移量管理。

Kafka使用一个特殊的__consumer_offsets主题来保存消费者偏移量。此偏移量记录了每个组中每个消费者的读取位置。这有助于消费者在需要时追溯其最后位置。通过将偏移量提交到代理,消费者不再依赖ZooKeeper。

引用

较早版本的Kafka(0.9之前)仅在ZooKeeper中存储偏移量,而较新版本的Kafka默认将偏移量存储在内部Kafka主题__consumer_offsets中。

consumer-groups

Kafka允许消费者组从主题并行读取数据。组内的所有消费者具有相同的组ID。在任何时候,一个组中的只有一个消费者可以从一个分区消费消息,以保证从分区读取消息的顺序。一个消费者可以读取多个分区。

Windows上的Kafka设置

先决条件
设置文件
  1. 安装JRE – 默认设置即可。
  2. 将Kafka文件解压到C:\Installs(可选择其他位置)。所有用于Kafka数据管道设置的脚本文件将位于:C:\Installs\kafka_2.12-2.5.0\bin\windows
  3. 根据Windows需求进行配置更改
    • 为Kafka日志设置 – 在C:\Installs\kafka_2.12-2.5.0位置创建一个名为‘logs’的文件夹。
    • 在Kafka配置文件C:\Installs\kafka_2.12-2.5.0\config\server.properties中将此logs文件夹位置设置为log.dirs=C:\Installs\kafka_2.12-2.5.0\logs。
    • 为ZooKeeper数据设置 – 在C:\Installs\kafka_2.12-2.5.0位置创建一个名为‘data’的文件夹。
    • 在ZooKeeper配置文件C:\Installs\kafka_2.12-2.5.0\config\zookeeper.properties中将此数据文件夹位置设置为dataDir=C:\Installs\kafka_2.12-2.5.0\data。
Execute
  1. ZooKeeper – 使用已与Kafka文件打包的便捷脚本获取一个快速的单节点ZooKeeper实例。
    • 打开命令提示符,并导航到位置:C:\Installs\kafka_2.12-2.5.0\bin\windows
    • 执行脚本。
      zookeeper-server-start.bat C:\Installs\kafka_2.12-2.5.0\config\zookeeper.properties
    • ZooKeeper已在localhost:2181启动。保持运行。

      demo-zookeeper

  2. Kafka服务器 – 获取一个单节点Kafka实例。
    • 打开另一个命令提示符,并导航到位置:C:\Installs\kafka_2.12-2.5.0\bin\windows
    • ZooKeeper已在属性文件zookeeper.connect=localhost:2181中配置。
    • 执行脚本。
      kafka-server-start.bat C:\Installs\kafka_2.12-2.5.0\config\server.properties
    • Kafka服务器已在localhost: 9092启动。保持运行。

      demo-kafka

      现在可以创建主题并存储消息了。我们可以从任何客户端生产和消费数据。目前我们将使用命令提示符。

  3. 主题 – 创建一个名为‘testkafka’的主题。
    • 鉴于我们设置的是单个节点实例,请使用复制因子为1,分区为1。
    • 打开另一个命令提示符,并导航到位置:C:\Installs\kafka_2.12-2.5.0\bin\windows。
    • 执行脚本。
      kafka-topics.bat --create --bootstrap-server localhost:9092 
                       --replication-factor 1 --partitions 1 --topic testkafka
    • 执行脚本以查看创建的主题。
      kafka-topics.bat --list --bootstrap-server localhost:9092

      demo-topic

    • 保持命令提示符打开,以备不时之需。
  4. 生产者 – 设置以向服务器发送消息。
    • 打开另一个命令提示符,并导航到位置:C:\Installs\kafka_2.12-2.5.0\bin\windows
    • 执行脚本。
      kafka-console-producer.bat --bootstrap-server localhost:9092 --topic testkafka
    • 它将显示一个‘>’作为输入消息的提示符。输入:“Kafka demo – Message from server”。

    • 保持命令提示符打开。稍后我们将回来推送更多消息。
  5. 消费者 – 设置以从服务器接收消息。
    • 打开另一个命令提示符,并导航到位置:C:\Installs\kafka_2.12-2.5.0\bin\windows
    • 执行脚本。
      kafka-console-consumer.bat --bootstrap-server localhost:9092 
                                 --topic testkafka --from-beginning
    • 您将在该命令提示符窗口中看到生产者发送的消息 – “Kafka demo – Message from server”。

      demo-consumer

    • 返回生产者命令提示符,输入任何其他消息,您将看到它们实时出现在消费者命令提示符中。

      kafka-demo

  6. 检查/观察 – 后台的一些关键变化。
    • 已创建主题下的文件 – 它们用于跟踪给定主题的消息推送情况。

      topic-files

    • 日志文件中的数据 – 所有由生产者推送的消息都存储在这里。

      topic-log

    • Kafka中的主题 – 一旦消费者开始读取主题中的消息,__consumer_offsets就会自动创建为一个主题。

      topic-present

注意:如果您想选择Zookeeper来存储主题而不是Kafka服务器,则需要以下脚本命令:

  • 创建主题。
    kafka-topics.bat --create --zookeeper localhost:2181 
                     --replication-factor 1 --partitions 1 --topic testkafka
  • 查看主题。
    kafka-topics.bat --list --zookeeper localhost:2181

通过以上步骤,我们能够通过Kafka设置看到生产者发送的消息以及消费者接收的消息。

在我尝试设置Kafka时,遇到了一些问题。我已将它们记录下来供参考学习。如果其他人遇到类似问题,这应该也能有所帮助:故障排除:Windows上的Kafka设置

使用下面共享的文件和上述步骤/命令,您应该不会遇到任何问题。欢迎在下方或我的博客这里发布您的评论/问题。

参考文献

历史

  • 2020年8月2日:初始版本。
© . All rights reserved.