Kafka 基础与架构理解

目录

前言

[Kafka 基础概念](#Kafka 基础概念)

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

[Kafka 的组件](#Kafka 的组件)

[Kafka 的工作原理:消息的生产、分发、消费流程](#Kafka 的工作原理:消息的生产、分发、消费流程)

[Kafka 系统架构](#Kafka 系统架构)

[Kafka 的分布式架构设计](#Kafka 的分布式架构设计)

[Leader-Follower 机制与数据复制](#Leader-Follower 机制与数据复制)

[Log-based Storage 和持久化](#Log-based Storage 和持久化)

[Broker 间通信协议](#Broker 间通信协议)

[Zookeeper 在 Kafka 中的角色](#Zookeeper 在 Kafka 中的角色)

总结


前言

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

Kafka 基础概念

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

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

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

特性 Kafka RabbitMQ ActiveMQ
架构类型 分布式、日志存储、流式处理 基于 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 选举和配置管理提供了基础支持。

相关推荐
Mephisto.java3 小时前
【大数据学习 | Spark】Spark的改变分区的算子
大数据·elasticsearch·oracle·spark·kafka·memcache
KevinAha11 小时前
Kafka 3.5 源码导读
kafka
求积分不加C11 小时前
-bash: ./kafka-topics.sh: No such file or directory--解决方案
分布式·kafka
nathan052911 小时前
javaer快速上手kafka
分布式·kafka
激流丶14 小时前
【Kafka 实战】Kafka 如何保证消息的顺序性?
java·后端·kafka
天冬忘忧19 小时前
Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
大数据·分布式·kafka
工业甲酰苯胺21 小时前
Python脚本消费多个Kafka topic
开发语言·python·kafka
B站计算机毕业设计超人1 天前
计算机毕业设计SparkStreaming+Kafka新能源汽车推荐系统 汽车数据分析可视化大屏 新能源汽车推荐系统 汽车爬虫 汽车大数据 机器学习
数据仓库·爬虫·python·数据分析·kafka·数据可视化·推荐算法
谷大羽1 天前
Kafka Stream实战教程
spring boot·后端·中间件·kafka·stream
求积分不加C1 天前
Kafka怎么发送JAVA对象并在消费者端解析出JAVA对象--示例
java·分布式·kafka·linq