什么是 Kafka

Kafka 是一个分布式流处理平台。 可以将其视为一个高吞吐量、容错的消息队列。 它专为处理实时数据流而设计。

概念

  1. 主题(Topic):

    发布记录的类别或馈送名称。

  2. 分区(Partition):

    一个主题被分成多个分区,这些分区是有序的、不可变的记录序列。分区实现了并行性和可伸缩性。

  3. 生产者(Producer):

    将记录发布到 Kafka 主题的应用程序。

  4. 消费者(Consumer):

    订阅一个或多个主题并处理记录的应用程序。

  5. 代理(Broker):

    Kafka 服务器。代理存储数据。

  6. 集群(Cluster):

    一起工作的代理组。

  7. 副本(Replica):

    每个分区可以跨多个代理进行复制,以实现容错。

  8. 领导者(Leader):

    分区的一个副本被指定为领导者,处理所有读写请求。

  9. 追随者(Follower):

    分区的其他副本是追随者,从领导者复制数据。

  10. 偏移量(Offset):

    分配给分区内每个记录的唯一、顺序 ID。消费者使用偏移量跟踪它们在分区中的位置。

  11. 消费者组(Consumer Group):

    一组消费者一起从一个主题消费记录。每个分区被分配给一个组内的一个消费者。

  12. 保留策略(Retention Policy):

    定义 Kafka 在删除记录之前保留记录的时间。

  13. ZooKeeper:

    用于管理和协调 Kafka 集群(尽管较新版本正在摆脱 ZooKeeper)。

常见应用场景

  1. 实时数据管道:

    从各种来源摄取和处理数据流。

  2. 日志聚合:

    将来自多个服务器的日志收集到一个中心位置。

  3. 流处理:

    构建分析和响应数据流的实时应用程序。

  4. 事件溯源:

    存储表示应用程序状态更改的事件序列。

  5. 消息传递:

    应用程序之间可靠、高吞吐量的消息传递。

  6. 活动跟踪:

    实时跟踪网站或应用程序上的用户活动。

  7. 提交日志:

    用作分布式数据库的提交日志。

Kafka 在系统设计中的作用

  1. 解耦:

    Kafka 解耦了生产者和消费者,允许它们独立发展。

  2. 可伸缩性:

    Kafka 可以处理大量数据,并通过添加更多代理进行水平扩展。

  3. 可靠性:

    容错确保数据不会丢失。

  4. 缓冲:

    Kafka 充当生产者和消费者之间的缓冲区,平滑流量峰值。

  5. 数据集成:

    Kafka 可以将来自各种来源的数据集成到一个平台中。

关于 ZooKeeper

关键的发展是随着 KRaft 的引入,摆脱了 ZooKeeper。

什么是 KRaft(Kafka Raft)

摆脱 ZooKeeper:

KRaft 是一种共识协议,允许 Kafka 在内部管理其元数据,无需外部 ZooKeeper 集群。

它本质上是将元数据管理直接集成到 Kafka 本身中。

为什么要转变?

  • 简化操作:

    管理 ZooKeeper 会增加 Kafka 部署的复杂性。移除它可以简化操作。

  • 提高可伸缩性:

    ZooKeeper 在非常大的 Kafka 集群中可能成为瓶颈。KRaft 旨在提高可伸缩性。

  • 统一架构:

    一个独立的 Kafka 系统更容易理解和管理。

时间线

Kafka 社区一直在逐步努力使 KRaft 达到生产就绪状态。

Kafka 3.x 版本已经看到了 KRaft 成熟度的提高。 预计未来的 Kafka 主要版本,如 4.0,将完全消除对 ZooKeeper 的依赖。

主要优势

  • 简化部署。
  • 增强可伸缩性。
  • 提高弹性。

本质上:

Kafka 的未来重点是成为一个更自给自足、更易于管理的分布式系统。KRaft 是朝着这个方向迈出的重要一步。

图表

架构图

flowchart TD
    classDef producer fill:#92D050,color:#000,stroke:#92D050
    classDef broker fill:#0072C6,color:#fff,stroke:#0072C6
    classDef consumer fill:#B4A0FF,color:#000,stroke:#B4A0FF
    classDef zk fill:#FFC000,color:#000,stroke:#FFC000

    subgraph Producers["生产者"]
        P1[生产者 1]:::producer
        P2[生产者 2]:::producer
    end

    subgraph Brokers["Kafka 集群"]
        B1[代理 1
领导者]:::broker B2[代理 2
追随者]:::broker B3[代理 3
追随者]:::broker subgraph Partitions["主题分区"] TP1[P0]:::broker TP2[P1]:::broker TP3[P2]:::broker end end subgraph Consumers["消费者组"] CG1[组 1]:::consumer CG2[组 2]:::consumer end ZK[ZooKeeper]:::zk P1 & P2 --> B1 & B2 & B3 B1 & B2 & B3 --> CG1 & CG2 ZK -.-> B1 & B2 & B3 ZK -.-> CG1 & CG2 %% 图例 subgraph Legend["图例"] L1[生产者]:::producer L2[代理]:::broker L3[消费者]:::consumer L4[ZooKeeper]:::zk end

架构图解释

  • 实线表示生产者、代理和消费者之间的直接数据流
  • 虚线显示 ZooKeeper 的协调作用(管理集群状态和消费者组)
  • 每个代理可以托管多个分区(显示为 P0、P1、P2)
  • 消费者组允许多个应用程序独立使用相同的主题

数据流图

graph LR
    A[生产者] -->|发布| B(主题);
    B --> C{分区};
    C --> D[分区 1];
    C --> E[分区 2];
    C --> F[分区 N];
    D --> G(代理 1);
    E --> H(代理 2);
    F --> I(代理 N);
    G --> J[领导者副本];
    H --> K[追随者副本];
    I --> L[领导者副本];
    J --> M{偏移量};
    K --> M;
    L --> M;
    N[消费者组] --> O[消费者 1];
    N --> P[消费者 2];
    N --> Q[消费者 N];
    O --> D;
    P --> E;
    Q --> F;
    R[ZooKeeper] -- 管理 --> G;
    R -- 管理 --> H;
    R -- 管理 --> I;
    S[保留策略] --> B;
    T[数据源] --> A;
    M --> O;
    M --> P;
    M --> Q;
    subgraph Kafka 集群
    G;H;I;J;K;L;
    end
    subgraph 主题和分区
    B;C;D;E;F;
    end
    subgraph 消费者组
    N;O;P;Q;
    end


    

数据流图解释

  • 生产者:

    将消息发布到特定主题。

  • 主题:

    被分成多个分区。

  • 分区:

    分布在多个代理上。

  • 代理:

    每个代理可以有多个分区,每个分区都有一个领导者副本和追随者副本。

  • 偏移量:

    分区内的每条消息都被分配一个唯一的偏移量。

  • 消费者组:

    由多个消费者组成。

  • 消费者:

    订阅一个主题并从分区读取消息,使用偏移量跟踪它们的位置。

  • ZooKeeper:

    管理 Kafka 集群,协调代理和领导者选举。

  • 保留策略:

    确定消息在主题中存储的时间。

  • 数据源:

    提供生产者发送到 Kafka 的数据。

连接

  • 该图说明了数据通过主题和分区从生产者到消费者的流动。
  • 它显示了代理和副本如何确保容错。
  • 它突出了偏移量在跟踪消息消费中的作用。
  • 它显示了消费者组和消费者之间的关系。
  • 它显示了 ZooKeeper 管理代理。
  • 它显示了保留策略适用于主题。
  • 它显示了数据源连接到生产者。

复制机制和领导者选择图表


sequenceDiagram
    participant P as 生产者
    participant L as 领导者代理
    participant F1 as 追随者代理 1
    participant F2 as 追随者代理 2
    participant ZK as ZooKeeper
    participant B3 as 代理 3
    
    Note over P,ZK: 正常操作
    P->>+L: 发送消息
    L->>L: 写入日志
    L->>-P: 确认
    
    par 复制
        L->>F1: 复制消息
        F1->>F1: 写入日志
        L->>F2: 复制消息
        F2->>F2: 写入日志
    end
    
    Note over L,ZK: 检测到领导者故障
    ZK->>F1: 选举为新领导者
    P->>+F1: 发送新消息
    F1->>F1: 写入日志
    F1->>-P: 确认
    
    par 恢复
        F1->>B3: 复制消息
        B3->>B3: 写入日志
    end

    

复制机制和领导者选择图解释

  • 平行线显示同时复制到多个追随者
  • 当领导者失败时,ZooKeeper 从可用的追随者中选举一个新的领导者
  • 即使在领导者转换期间,系统也能保持一致性