什么是 Kafka
Kafka 是一个分布式流处理平台。 可以将其视为一个高吞吐量、容错的消息队列。 它专为处理实时数据流而设计。
概念
主题(Topic):
发布记录的类别或馈送名称。
分区(Partition):
一个主题被分成多个分区,这些分区是有序的、不可变的记录序列。分区实现了并行性和可伸缩性。
生产者(Producer):
将记录发布到 Kafka 主题的应用程序。
消费者(Consumer):
订阅一个或多个主题并处理记录的应用程序。
代理(Broker):
Kafka 服务器。代理存储数据。
集群(Cluster):
一起工作的代理组。
副本(Replica):
每个分区可以跨多个代理进行复制,以实现容错。
领导者(Leader):
分区的一个副本被指定为领导者,处理所有读写请求。
追随者(Follower):
分区的其他副本是追随者,从领导者复制数据。
偏移量(Offset):
分配给分区内每个记录的唯一、顺序 ID。消费者使用偏移量跟踪它们在分区中的位置。
消费者组(Consumer Group):
一组消费者一起从一个主题消费记录。每个分区被分配给一个组内的一个消费者。
保留策略(Retention Policy):
定义 Kafka 在删除记录之前保留记录的时间。
ZooKeeper:
用于管理和协调 Kafka 集群(尽管较新版本正在摆脱 ZooKeeper)。
常见应用场景
实时数据管道:
从各种来源摄取和处理数据流。
日志聚合:
将来自多个服务器的日志收集到一个中心位置。
流处理:
构建分析和响应数据流的实时应用程序。
事件溯源:
存储表示应用程序状态更改的事件序列。
消息传递:
应用程序之间可靠、高吞吐量的消息传递。
活动跟踪:
实时跟踪网站或应用程序上的用户活动。
提交日志:
用作分布式数据库的提交日志。
Kafka 在系统设计中的作用
解耦:
Kafka 解耦了生产者和消费者,允许它们独立发展。
可伸缩性:
Kafka 可以处理大量数据,并通过添加更多代理进行水平扩展。
可靠性:
容错确保数据不会丢失。
缓冲:
Kafka 充当生产者和消费者之间的缓冲区,平滑流量峰值。
数据集成:
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 从可用的追随者中选举一个新的领导者
- 即使在领导者转换期间,系统也能保持一致性