Kafka 集群
Kafka 集群由多个 Broker 节点组成,它们共同承担:
- 数据写入(Producer)
- 数据读取(Consumer)
- 存储数据(Log Segment)
- 分区副本同步
- Leader 选举
- 元数据管理
- 高可用与容错
一个生产级 Kafka 集群一般包含:
3–9 台 Broker(最小生产规格:3)
+ Zookeeper(或 KRaft 模式)
一台 Kafka 服务实例就是一个 Broker。
功能:
- 保存分区数据
- 响应 Producer 写请求
- 响应 Consumer 读请求
- 管理日志文件、段文件(segment)
- 根据 Controller 指令完成 leader 迁移
一般建议至少 3–5 个 Broker。
Kafka 有两种模式:
- 目前企业使用最多
- ZK 管理元数据(ISR、ACL、Broker 列表、Topic 配置)
- Kafka 依赖 ZK 进行 Leader 选举
- 从 Kafka 2.8 开始引入
- Kafka 自己存储元数据
- 使用 Raft 协议保证一致性
- 新版本未来将完全替代 ZK
若你准备新建集群,推荐直接使用 KRaft。
一个 Topic 是数据的逻辑分类,如:
- order
- trade
- user-login
Topic 会被拆分为多个分区,以提升吞吐和并发。
例如:
Topic A = 6 partitions
数据分布在不同 Broker:
| Partition | Broker |
|---|---|
| p0 | 1 |
| p1 | 2 |
| p2 | 3 |
| p3 | 1 |
| p4 | 2 |
| p5 | 3 |
每个分区可以有多个副本:
replication-factor=3 # 3 副本
副本分为:
- Leader 副本(唯一)
- Follower 副本(1 或多个)
Leader 处理:
- 写
- 读
- offset 提交
Follower 只能拉取数据同步。
Kafka 保证数据可靠性的关键:
- Leader 写入数据后
- Follower 会异步拉取同步
- 只有同步“足够快”的 Follower 才能进入 ISR
例如 replication=3:
p0 leader = broker1
p0 followers = broker2, broker3
ISR = {1,2,3}
若 broker3 同步太慢,会被踢出 ISR:
ISR = {1,2}
acks=all + min.insync.replicas=2
至少 2 个副本写成功,消息才算成功写入,从而实现高可靠。
Kafka 集群中:
- 每个分区只有 1 个 Leader
- Leader 负责收发数据
- Follower 同步
如果某个 broker 挂掉:
- Controller 选择新 Leader(从 ISR 中选)
- Consumer / Producer 自动重定向请求
Leader 选举是 Kafka 保证高可用的核心能力。
整个集群中只有一个 Controller(由多个 Broker 选举产生),负责:
- 分区 Leader 选举
- Broker 上线/下线检测
- ISR 变更管理
- 分区重新分配
- 处理节点故障
控制器故障时:
- 另一个 Broker 会迅速成为新的 Controller
- 不影响数据读写
3–9 台 Broker:
broker1, broker2, broker3
副本会均匀分布。
常见策略:
跨机房复制 Topic:
- A -> B
- B -> A
实现灾备或者异地多活。
更稳定,但收费。
按业务拆:
- 订单集群
- 日志集群
- 实时计算集群
优点:
- 不会互相影响
- 更易扩容
流程:
- 增加 Broker 节点
- 运行 kafka-reassign-partitions.sh 迁移分区
- Confirm reassign 完成
Kafka 不会自动均衡,企业一般定期执行 rebalance 工具。
- 迁移该 Broker 的所有分区
- 将该 Broker 设为“停用”
- 安全下线
不能直接停,否则可能造成:
- 分区不可用
- ISR 变小
- 性能下降
集群中必须监控:
URP > 0 立即报警(副本不同步)
分区不可用,严重问题
消费堆积最重要指标
磁盘压力决定吞吐。
Kafka 依赖 OS page cache 提升读写。
Producer
acks=all
enable.idempotence=true
retries=∞
batch.size=64KB
linger.ms=10ms
compression.type=zstd
Broker
num.partitions=3
default.replication.factor=3
min.insync.replicas=2
Consumer
enable.auto.commit=false
max.poll.interval.ms=300000
fetch.min.bytes=1MB
文字版结构:
+------------+
Producer -----> | Broker 1 | <---- Consumer
| (Leader) |
+------------+
| ↑
| |
Replication |
| |
+------------+
| Broker 2 | (Follower)
+------------+
|
+------------+
| Broker 3 | (Follower)
+------------+
Zookeeper/KRaft 负责:
- 集群元数据
- Leader 选举
- Broker 状态
- ISR 维护