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

相关推荐
Mr.朱鹏15 小时前
SQL深度分页问题案例实战
java·数据库·spring boot·sql·spring·spring cloud·kafka
山沐与山1 天前
【MQ】Kafka与RocketMQ深度对比
分布式·kafka·rocketmq
yumgpkpm1 天前
Cloudera CDP7、CDH5、CDH6 在华为鲲鹏 ARM 麒麟KylinOS做到无缝切换平缓迁移过程
大数据·arm开发·华为·flink·spark·kafka·cloudera
树下水月1 天前
Easyoole 使用rdkafka 进行kafka的创建topic创建 删除 以及数据发布 订阅
分布式·kafka
Cat God 0071 天前
基于Docker搭建kafka集群
docker·容器·kafka
Cat God 0071 天前
基于 Docker 部署 Kafka(KRaft + SASL/PLAIN 认证)
docker·容器·kafka
KD1 天前
设计模式——责任链模式实战,优雅处理Kafka消息
后端·设计模式·kafka
原神启动12 天前
Kafka详解
分布式·kafka
一只懒鱼a2 天前
搭建kafka集群(安装包 + docker方式)
运维·容器·kafka