10.1.1 Kafka架构组成与角色

Kafka架构由多个角色协同构成:Broker、Controller、Producer、Consumer、Topic、Partition、Replica、ZooKeeper/KRaft,以及可选的Schema Registry与Connect组件。理解各角色职责与交互,是构建高可用、高吞吐消息系统的基础。

1. 架构原理草图(角色与数据流)

文章图片

2. 核心角色与职责(含关键点)
- Broker:接收、持久化、转发消息;管理分区副本与日志段。
- Controller:分区Leader选举、ISR管理、元数据变更协调。
- Producer:按分区策略写入消息,支持批量、压缩、幂等/事务。
- Consumer:按消费组拉取消息与提交偏移量。
- Topic/Partition:并行与存储的最小单元;分区内有序。
- Replica/ISR:Leader写、Follower同步,ISR保证一致性。
- ZooKeeper/KRaft:元数据与选举;KRaft替代ZooKeeper。

3. 最小可运行示例(单机KRaft,含角色理解)

# 1) 下载并解压
wget https://downloads.apache.org/kafka/3.7.0/kafka_2.13-3.7.0.tgz
tar -xzf kafka_2.13-3.7.0.tgz && cd kafka_2.13-3.7.0

# 2) 生成KRaft集群ID
KAFKA_CLUSTER_ID=$("bin/kafka-storage.sh" random-uuid)

# 3) 初始化日志目录(默认配置:单节点同时作为Broker+Controller)
bin/kafka-storage.sh format -t "$KAFKA_CLUSTER_ID" -c config/kraft/server.properties

# 4) 启动Kafka(KRaft模式)
bin/kafka-server-start.sh -daemon config/kraft/server.properties

# 5) 创建Topic与分区/副本
bin/kafka-topics.sh --bootstrap-server localhost:9092 \
  --create --topic demo --partitions 3 --replication-factor 1

# 6) 生产与消费验证数据流
bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic demo
# 输入:
# hello
# kafka

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic demo \
  --from-beginning --group g1

预期效果:消费者输出 hellokafka,说明 Producer → Leader → Broker 落盘 → Consumer 拉取链路正常。

4. 关键配置示例与命令解释

# 文件: config/kraft/server.properties
process.roles=broker,controller      # 该节点同时担任Broker与Controller
node.id=1                            # 节点唯一ID
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
controller.listener.names=CONTROLLER # Controller通信通道
log.dirs=/tmp/kraft-combined-logs     # 日志存储目录
num.partitions=3                     # 默认分区数
  • process.roles:决定节点角色。
  • controller.listener.names:Controller专用监听。
  • log.dirs:持久化目录,影响性能与容量规划。

5. 运维排错要点(含命令)

# 1) 查看Broker是否存活
bin/kafka-broker-api-versions.sh --bootstrap-server localhost:9092

# 2) 查看Topic元数据与分区Leader分布
bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic demo

# 3) 常见故障:端口被占用或目录无权限
ss -lntp | grep 9092
ls -ld /tmp/kraft-combined-logs

# 4) 查看Controller日志(排查选举/元数据异常)
tail -n 200 logs/controller.log

典型问题与处理
- 启动失败log.dirs无权限 → chown -R $USER /tmp/kraft-combined-logs
- 无法选主:Controller通信不通 → 检查controller.listener.names与端口9093。
- 消费无数据:确认Topic存在且Producer写入成功。

6. 练习
1) 创建orders主题,分区数为4,副本因子为1,验证分区Leader分布。
2) 开启两个消费者加入同一组g1,观察分区再均衡。
3) 修改num.partitions后新增Topic,观察与旧Topic分区差异。

7. 架构理解小结(与角色对应)
- 数据链路:Producer → Leader Broker → ISR同步 → Consumer拉取。
- 控制链路:Controller负责元数据变更与选主,KRaft/ZK持久化元数据。
- 运维关注:分区规划、ISR稳定、Controller健康、磁盘与网络性能。