架构与存储模型
核心对象
| 对象 | 作用 |
|---|---|
| Broker | 保存分区副本并处理生产、消费请求 |
| Controller | 管理集群元数据、Broker 状态和分区 Leader |
| Topic | 事件的逻辑分类 |
| Partition | 有序追加日志,也是并行与复制的基本单位 |
| Replica | Partition 的副本,分为 Leader 和 Follower |
| Producer | 向 Topic Partition 追加 Record |
| Consumer Group | 作为一个逻辑订阅者协同消费 Partition |
Kafka 只保证单个 Partition 内的顺序,不保证 Topic 跨 Partition 的全局顺序。
KRaft 元数据架构
Kafka 4.x 使用 KRaft Controller Quorum 管理集群元数据。Controller 通过 Raft 日志形成一致视图,Broker 从 Controller 获取 Topic、Partition、ACL 和配置等元数据。
生产环境通常将 Controller 与 Broker 角色分离,并部署奇数个 Controller。开发环境可以合并角色,但不代表生产最佳实践。
process.roles=broker,controller
node.id=1
controller.quorum.bootstrap.servers=node1:9093
listeners=PLAINTEXT://node1:9092,CONTROLLER://node1:9093
controller.listener.names=CONTROLLER
inter.broker.listener.name=PLAINTEXTLeader、Follower 与 ISR
每个 Partition 同一时刻只有一个 Leader 处理常规读写,Follower 从 Leader 拉取日志。ISR 是与 Leader 保持在允许滞后范围内的副本集合。
- AR:该 Partition 的全部副本;
- ISR:当前满足同步条件的副本;
- OSR:不在 ISR 中的副本;
- Leader 故障时通常从 ISR 选举新 Leader;
- 开启 Unclean Leader Election 可能提升可用性,但存在数据丢失风险。
早期笔记把 Leader 与 Follower 定义写反,正确关系是 Leader 主导读写,Follower 复制 Leader。
日志与 Segment
Partition 在磁盘上是追加日志,并拆分为多个 Segment。常见文件包括 Log、Offset Index、Time Index 和事务索引。Offset 是 Partition 内 Record 的逻辑位置,不是物理文件字节偏移。
索引是稀疏索引:先定位候选位置,再顺序扫描到目标 Record。Segment 文件名使用该 Segment 的 Base Offset。
保留与清理
| 策略 | 语义 | 适用场景 |
|---|---|---|
| Delete | 按时间或大小删除旧 Segment | 日志、事件保留窗口 |
| Compact | 为每个 Key 保留较新的值,并保留 Tombstone 一段时间 | Changelog、状态恢复 |
| Delete + Compact | 同时应用两类规则 | 既需按 Key 收敛又限制总历史 |
消费完成不会自动删除 Kafka 消息;保留策略与各 Consumer Group 的 Offset 相互独立。
高吞吐来源
Kafka 的性能来自追加写、页缓存、批量压缩、Partition 并行、顺序 I/O 和减少数据复制路径等组合,而不是单一“零拷贝”。TLS、压缩、云磁盘和远程存储会改变具体 I/O 路径。
常用 KRaft 命令
KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
bin/kafka-storage.sh format --standalone \
-t "$KAFKA_CLUSTER_ID" -c config/server.properties
bin/kafka-server-start.sh config/server.properties
bin/kafka-topics.sh --bootstrap-server node1:9092 --list
bin/kafka-topics.sh --bootstrap-server node1:9092 \
--create --topic events --partitions 6 --replication-factor 3
bin/kafka-topics.sh --bootstrap-server node1:9092 \
--describe --topic eventsKafka 4.x 命令不再使用 --zookeeper,Producer/Consumer 统一使用 --bootstrap-server。