什么是 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 从可用的追随者中选举一个新的领导者
- 即使在领导者转换期间,系统也能保持一致性
