Kafka 学习笔记
基于 3 台云服务器集群实战整理(7 课,文中 IP 均为示例,已脱敏)
版本:3.6.2 (华为云镜像安装)
文档目录:
docs/kafka-学习笔记.md(博客发布时拷贝docs/目录即可)
示例 IP 对照表
| 节点 | 公网 IP | 内网 IP | broker.id |
|---|---|---|---|
| Server 1 | 203.0.113.11 | 10.0.1.11 | 1 |
| Server 2 | 203.0.113.12 | 10.0.1.12 | 2 |
| Server 3 | 203.0.113.13 | 10.0.1.13 | 3 |
一、Kafka 是什么?
白话 :高吞吐的 分布式消息队列 / 事件流平台 ------生产者 发消息到 Topic ,消费者 按组订阅 处理。
比喻:
- Topic = 快递分拣中心里的「货架区」
- Partition = 货架上的「格子」,并行处理靠它
- Offset = 每个格子里的「取件序号」
- Consumer Group = 取件小组,组内分工、组间各拿一份
与 Dubbo 对比:
| Kafka | Dubbo | |
|---|---|---|
| 通信模式 | 异步 消息 | 同步 RPC |
| 调用方 | 发完即走,不等处理结果 | 等 Provider 返回 |
| 解耦 | 生产者不关心谁消费 | 必须知道接口 |
二、本集群环境
2.1 三台 Broker
| 名称 | 公网 IP | 内网 IP | broker.id |
|---|---|---|---|
| Server 1 | 203.0.113.11 | 10.0.1.11 | 1 |
| Server 2 | 203.0.113.12 | 10.0.1.12 | 2 |
| Server 3 | 203.0.113.13 | 10.0.1.13 | 3 |
2.2 安装与路径
| 项目 | 路径 |
|---|---|
| 程序 | /opt/kafka |
| 日志数据 | /var/lib/kafka/logs |
| 服务 | systemctl start/stop/status kafka |
2.3 Bootstrap 连接串
10.0.1.11:9092,10.0.1.12:9092,10.0.1.13:9092
2.4 关键集群参数(本集群)
| 参数 | 值 | 含义 |
|---|---|---|
default.replication.factor |
2 | 每条消息默认 2 副本 |
min.insync.replicas |
1 | 至少 1 副本写入成功即可 ack |
listeners / advertised.listeners |
内网 9092 | 客户端连 advertised 地址 |
三、七课知识地图
| 课次 | 主题 | 核心要点 |
|---|---|---|
| 第 1 课 | 集群配置 | listeners、advertised.listeners、RF=2 |
| 第 2 课 | Topic / Partition / Offset | 消息存在哪、序号怎么算 |
| 第 3 课 | Consumer Group | 组内分摊 Partition,组间独立消费 |
| 第 4 课 | Leader / ISR / 容错 | 停一台 Broker,副本顶上 |
| 第 5 课 | acks / 至少一次 / 幂等 | 可靠性 vs 性能 |
| 第 6 课 | 迷你订单系统 | order-events + 多 Consumer Group |
| (综合) | 与 Dubbo 组合 | 见 Dubbo 第 5 课 |
四、核心概念
4.1 Topic 与 Partition
- Topic :逻辑分类(如
order-events) - Partition :物理分片,顺序写、并行读
- 本集群示例 Topic:
| Topic | 分区 | 副本 | 用途 |
|---|---|---|---|
lesson1-hello |
默认 | 2 | 入门 |
lesson2-demo |
3 | 2 | 分区实验 |
order-events |
3 | 2 | 订单事件(Kafka 第 6 课 + Dubbo 第 5 课) |
4.2 Offset
- 每条消息在 Partition 内有 递增 Offset
- Consumer 通过 Offset 记录 读到哪了
- 可
earliest(从头)或latest(只读新消息)
4.3 Consumer Group
Topic order-events (3 partitions)
│
├── Group: notification-service → 消费全部 3 分区
├── Group: inventory-service → 独立再消费 3 分区
└── Group: audit-service → 再消费 3 分区
- 同 Group 内:一个 Partition 同一时刻只给一个 Consumer
- 不同 Group :各自维护 Offset,互不影响
4.4 Leader 与 ISR
- 每个 Partition 有 1 个 Leader(读写入口)
- ISR(In-Sync Replicas):与 Leader 同步的副本集合
- Leader 挂了 → ISR 里某副本 选举为新 Leader(第 4 课停 Broker 实验)
4.5 可靠性:acks 与幂等
| acks | 含义 | 可靠性 |
|---|---|---|
0 |
不等 Broker 确认 | 最低 |
1 |
Leader 写入即成功 | 中等 |
all |
ISR 全部确认 | 最高(本课 Dubbo+Kafka Producer 用 all) |
- At least once :可能重复,需 幂等(业务去重或 Kafka 幂等 Producer)
- Exactly once:端到端最难,需事务或幂等 + 去重
五、常用命令
5.1 服务
bash
systemctl status kafka
systemctl restart kafka
5.2 Topic 管理
bash
# 列出 Topic
/opt/kafka/bin/kafka-topics.sh \
--bootstrap-server 10.0.1.11:9092 --list
# 查看详情
/opt/kafka/bin/kafka-topics.sh \
--bootstrap-server 10.0.1.11:9092 \
--describe --topic order-events
# 创建 Topic(示例)
/opt/kafka/bin/kafka-topics.sh \
--bootstrap-server 10.0.1.11:9092 \
--create --topic my-topic \
--partitions 3 --replication-factor 2
5.3 生产 / 消费消息
bash
# 控制台生产者
/opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server 10.0.1.11:9092 \
--topic order-events
# 控制台消费者(从头读)
/opt/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server 10.0.1.11:9092 \
--topic order-events \
--from-beginning
# 指定 Consumer Group
/opt/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server 10.0.1.11:9092 \
--topic order-events \
--group my-group
5.4 查看 Consumer Group
bash
/opt/kafka/bin/kafka-consumer-groups.sh \
--bootstrap-server 10.0.1.11:9092 \
--list
/opt/kafka/bin/kafka-consumer-groups.sh \
--bootstrap-server 10.0.1.11:9092 \
--describe --group my-group
六、第 6 课:order-events 迷你系统
场景:订单创建后发事件,多个下游独立消费。
Producer → order-events → Group: notification(发短信)
→ Group: inventory(扣库存)
→ Group: audit(写日志)
消息示例(Dubbo 第 5 课写入):
ORDER_CREATED|orderId=ORD-xxx, product=lesson5-product-1, amount=99.0, provider=10.0.1.11
七、listeners 为什么要配 advertised?
listeners:Broker 绑定 哪个地址/portadvertised.listeners:告诉客户端 应该连哪里
云服务器常见坑:Broker 绑内网,若 advertised 配成 localhost 或错 IP,外网/其他机器连不上。
本集群:统一用内网 IP + 9092,三台 ECS 内网互通。
八、故障实验回顾(第 4 课)
- 正常:
kafka-topics.sh --describe看 Leader 分布 - 停一台 Broker(如 Server 3)
- 再 describe:部分 Partition Leader 切到其他 Broker
- Producer/Consumer 仍可工作(RF=2 保证有副本)
- 恢复 Broker,重新加入 ISR
九、与 Dubbo 组合(第 5 课)
用户请求 → Dubbo Consumer → Dubbo Provider(同步创建订单、返回 orderId)
│
└── Kafka Producer → order-events
│
库存 / 短信 / 审计 ← Consumer Groups
- Dubbo:同步、要结果
- Kafka:异步、通知下游、易扩展
十、运维要点
- 磁盘 :日志目录
/var/lib/kafka/logs要监控空间 - RF 与 Broker 数:RF=2 至少 2 台 Broker 存活才安全
- 9092 一般内网访问,公网需安全组 + 正确 advertised
- 不要与 独立 ZK 抢 2181(本集群 ZK 与 Kafka 分离)
- 生产消息建议
acks=all+ 合理retries+ 幂等设计
十一、一句话总结
Kafka = 分布式日志 / 消息流 :Topic 分类、Partition 并行、Consumer Group 分工;适合 异步、解耦、高吞吐 ;与 Dubbo 组合时负责 事件通知,不负责同步返回业务结果。