Apache Kafka 学习笔记

一、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 创建与分区机制

bash 复制代码
kafka-topics.sh --create \
--bootstrap-server localhost:9092 \
--replication-factor 2 \
--partitions 3 \
--topic user-action
  • 分区(Partition)用于并行化数据存储和消费。
  • 每个分区的数据是有序的(append-only)。
  • 消息写入哪个分区:可指定 Key(哈希分配),或轮询自动分配。

四、Producer 原理与参数调优

4.1 生产流程

  1. 构造消息:指定 topic、key、value
  2. 序列化:将对象转为字节数组
  3. 分区器:选择写入分区
  4. 发送请求:异步投递至 Kafka Broker
  5. Broker 写磁盘:写入日志文件
  6. 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 常用命令

bash 复制代码
# 查看 Topic 列表
kafka-topics.sh --list --bootstrap-server localhost:9092

# 查看 Topic 详情
kafka-topics.sh --describe --topic user-action --bootstrap-server localhost:9092

# 创建 Topic
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 管理 & 消费)