Skip to content

架构与存储模型

核心对象

对象作用
Broker保存分区副本并处理生产、消费请求
Controller管理集群元数据、Broker 状态和分区 Leader
Topic事件的逻辑分类
Partition有序追加日志,也是并行与复制的基本单位
ReplicaPartition 的副本,分为 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。开发环境可以合并角色,但不代表生产最佳实践。

properties
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=PLAINTEXT

Leader、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 命令

bash
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 events

Kafka 4.x 命令不再使用 --zookeeper,Producer/Consumer 统一使用 --bootstrap-server

参考资料