一、Kafka 简介
1.1 Kafka 是什么?
Kafka 是一个高吞吐、可扩展、分布式的消息发布-订阅系统,主要用于:
- 日志收集与处理
- 流式数据处理
- 事件驱动架构
- 实时分析管道
最初由 LinkedIn 开发,后捐赠给 Apache 基金会。
1.2 Kafka 的核心特性
特性 | 描述 |
---|
高吞吐 | 每秒百万级消息处理能力,依赖顺序写磁盘、批量处理 |
分布式 | 支持水平扩展,多个 Broker 组成集群 |
持久化 | 消息写入磁盘(通过 segment files + offset 索引) |
可伸缩 | 支持动态添加分区与 Broker,无需停机 |
高可用 | 分区副本机制 + controller 选主机制 |
解耦与异步通信 | 生产者与消费者解耦,支持异步投递 |
二、Kafka 架构与核心组件
2.1 架构总览图
Producer --> [Broker1 | Broker2 | Broker3] --> Consumer Group↑ ↑Controller Zookeeper / KRaft
2.2 核心组件说明
组件 | 描述 |
---|
Producer | 消息生产者,向指定 topic 写入消息 |
Consumer | 消息消费者,订阅 topic 并消费消息 |
Broker | Kafka 节点,负责存储和转发消息 |
Topic | 消息分类,每个 topic 可分为多个分区(partition) |
Partition | Kafka 的并发和容错单元,每个分区在磁盘中为一个文件队列 |
Offset | 消费位置偏移量,表示某消费者读取到的位置 |
Consumer Group | 消费者组,每组共享消息消费(同组内消费者消费分区唯一) |
Zookeeper | Kafka 早期使用的协调组件,用于选举 controller、存储元数据 |
Controller | Kafka 集群的“领导者”,负责元数据管理、分区分配、故障恢复 |
KRaft | Kafka 自带的共识协议(Kafka 2.8+),用以替代 Zookeeper(单集群化) |
三、Topic 与 Partition
3.1 Topic 创建与分区机制
kafka-topics.sh --create \
--bootstrap-server localhost:9092 \
--replication-factor 2 \
--partitions 3 \
--topic user-action
- 分区(Partition)用于并行化数据存储和消费。
- 每个分区的数据是有序的(append-only)。
- 消息写入哪个分区:可指定 Key(哈希分配),或轮询自动分配。
四、Producer 原理与参数调优
4.1 生产流程
- 构造消息:指定 topic、key、value
- 序列化:将对象转为字节数组
- 分区器:选择写入分区
- 发送请求:异步投递至 Kafka Broker
- Broker 写磁盘:写入日志文件
- Producer 回调通知(成功或失败)
4.2 常用参数
参数 | 含义 | 默认值 |
---|
acks | 写入确认级别(0, 1, all) | 1 |
retries | 失败重试次数 | 0 |
batch.size | 批量发送消息大小(字节) | 16384 |
linger.ms | 批量等待时间 | 0 |
compression.type | 消息压缩算法(gzip, lz4, snappy) | none |
buffer.memory | Producer 缓冲区总大小 | 32MB |
五、Consumer 原理与分组机制
5.1 消费者模型
- 同一个 Consumer Group 内的多个消费者 分区独占消费。
- 不同 Group 可重复消费同一 Topic。
5.2 Rebalance(再平衡)
- 组成员变化(新增、崩溃)时,Kafka 会重新分配分区。
- 通过 协调器 协调分配。
- 消费过程中会发生短暂中断。
5.3 消费 offset 管理
模式 | 说明 |
---|
自动提交 | 自动定期提交(enable.auto.commit=true ) |
手动提交 | 开发者主动调用 commitSync/Async() |
外部存储 | 可存于 DB、Redis 等 |
六、Kafka 存储机制
6.1 数据文件结构
每个分区对应一组 Segment 文件:
/kafka-logs/user-action-0/- 00000000000000000000.log- 00000000000000000000.index- 00000000000000000000.timeindex
.log
:存储数据.index
:offset 到物理位置的映射.timeindex
:时间戳索引
6.2 存储优化机制
技术 | 描述 |
---|
零拷贝(zero-copy) | 使用 sendfile() 系统调用,减少内核与用户态切换 |
页缓存(page cache) | 依赖操作系统缓存机制,避免频繁磁盘 I/O |
顺序写入 | 顺序写磁盘,性能远高于随机写入 |
七、Kafka 的高可用机制
7.1 分区副本
- 每个分区可以配置多个副本(replica)。
- Leader 副本 提供读写服务,Follower 副本 同步数据。
- 默认仅 Leader 可读写,Follower 仅作为备份。
7.2 副本同步机制
-
ISR(In-Sync Replicas):
- 表示“跟上 Leader 进度”的副本列表。
- Producer 设置
acks=all
时需 ISR 全部成功才算成功。
7.3 控制器机制
- Kafka 集群中选举一个 Controller,负责副本管理、分区迁移等操作。
- 若 Controller 挂了,会自动重新选举(依赖 Zookeeper / KRaft)。
八、Kafka 实践指南
8.1 性能优化建议
优化项 | 建议 |
---|
Producer | 批量发送 + 压缩 + 异步发送 |
Consumer | 合理设置 poll() 周期,批量处理消息 |
Broker | 使用 SSD、高 IO 网卡,调优 segment 参数 |
Topic 分区数 | 增加分区提升并发度(过多影响性能) |
8.2 消息丢失与重复的处理策略
问题 | 原因 | 解决方式 |
---|
消息丢失 | ack=0,未持久化 | 设置 acks=all ,启用副本同步机制 |
消息重复 | 重试发送,Consumer 未提交偏移 | 使用幂等设计、去重 ID 或外部事务控制 |
8.3 Kafka 与其他组件整合
系统 | 用途 |
---|
Flink | 实时数据流处理 |
Spark | 批处理/流处理 |
Elasticsearch | 实时搜索与分析 |
Hadoop/HDFS | 离线存储 |
Debezium | 数据库 CDC(变更捕获) |
九、Kafka 常用命令
kafka-topics.sh --list --bootstrap-server localhost:9092
kafka-topics.sh --describe --topic user-action --bootstrap-server localhost:9092
kafka-topics.sh --create --topic test --partitions 3 --replication-factor 2 --bootstrap-server localhost:9092
kafka-console-producer.sh --topic test --bootstrap-server localhost:9092
kafka-console-consumer.sh --topic test --from-beginning --bootstrap-server localhost:9092
十、Kafka 版本演进(简略)
版本 | 关键特性 |
---|
0.9+ | 引入权限控制(ACL) |
0.10+ | 加入时间戳、Kafka Streams |
0.11+ | 引入幂等 Producer、事务性消息(Exactly-once) |
2.x | Kafka Connect + KRaft(后期) |
3.x | 完全移除 Zookeeper,支持单集群管理(KRaft) |
十一、总结图表
Kafka 消息流动图:
Producer↓
Partitioner → Topic → Partition (offset-ordered log)↓
Broker (磁盘持久化)↓
Consumer Group (Offset 管理 & 消费)