10.6.5 集群扩容与资源规划

在性能优化与容量规划的末段,集群扩容与资源规划需要围绕“可预测增长、无损扩展、成本可控”展开。扩容不仅是加机器,还要评估分区再平衡、网络与存储吞吐、控制器与元数据负载,以及运维窗口风险控制。

扩容原理草图(分区再平衡)

文章图片

扩容触发信号与评估维度
- 吞吐压力:生产/消费速率接近峰值,Broker 网络带宽利用率持续高于 70%。
- 存储压力:磁盘使用超过 70% 且保留策略无法再收缩;磁盘 I/O 延迟增大。
- 延迟压力:消费者积压持续增长、端到端延迟高于业务 SLA。
- 控制面压力:分区数量快速增长导致 Controller 负担加重、元数据传播延迟。

资源规划关键指标(含估算示例)
- CPU:与压缩算法、序列化、批量大小强相关,建议预留 30% 峰值余量。
- 内存:页缓存对吞吐影响显著,建议 60%~70% 物理内存给页缓存。
- 磁盘:SSD 优先,单机磁盘使用不超过 70%。
- 网络:复制流量 + 客户端流量,需核算峰值复制开销。

容量估算示例(带命令解释)

# 假设:日峰值写入 2TB,保留 7 天,副本因子 3,压缩率 0.5
# 总存储需求 = 日写入 * 保留天数 * 副本因子 * 压缩率
# = 2TB * 7 * 3 * 0.5 = 21TB

# 若单机可用磁盘 4TB,使用率不超过 70%,则单机有效容量=2.8TB
# 需要节点数 = 21TB / 2.8TB8

扩容流程(安装/加入/迁移)

1)新增 Broker 安装与基础配置

# 1) 安装(示例:tar包部署)
tar -xzf kafka_2.13-3.6.0.tgz -C /opt
ln -s /opt/kafka_2.13-3.6.0 /opt/kafka

# 2) 创建数据目录
mkdir -p /data/kafka-logs

# 3) 修改配置 /opt/kafka/config/server.properties
# 必须保证 broker.id 唯一,listeners/advertised.listeners 指向本机
cat <<'EOF' >/opt/kafka/config/server.properties
broker.id=4
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://10.0.0.14:9092
log.dirs=/data/kafka-logs
num.network.threads=6
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
log.retention.hours=168
zookeeper.connect=10.0.0.11:2181,10.0.0.12:2181,10.0.0.13:2181
EOF

# 4) 启动
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties

# 5) 验证新 Broker 注册
/opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server 10.0.0.14:9092

2)生成迁移计划并执行再平衡

# 1) 生成待迁移主题列表
cat <<'EOF' >/tmp/topics-to-move.json
{"topics":[{"topic":"order"},{"topic":"payment"}],"version":1}
EOF

# 2) 生成再平衡计划(--broker-list 包含新 broker)
/opt/kafka/bin/kafka-reassign-partitions.sh \
  --bootstrap-server 10.0.0.11:9092 \
  --topics-to-move-json-file /tmp/topics-to-move.json \
  --broker-list "1,2,3,4" \
  --generate > /tmp/reassign-plan.txt

# 3) 提取建议方案
awk '/Proposed partition reassignment configuration/{flag=1;next}/Current partition replica assignment/{flag=0}flag' \
  /tmp/reassign-plan.txt > /tmp/reassign.json

# 4) 执行迁移
/opt/kafka/bin/kafka-reassign-partitions.sh \
  --bootstrap-server 10.0.0.11:9092 \
  --reassignment-json-file /tmp/reassign.json \
  --execute

# 5) 查看迁移进度
/opt/kafka/bin/kafka-reassign-partitions.sh \
  --bootstrap-server 10.0.0.11:9092 \
  --reassignment-json-file /tmp/reassign.json \
  --verify

3)限制迁移速率(避免 I/O 抖动)

# 限制每个 broker 的迁移带宽(单位:字节/秒)
/opt/kafka/bin/kafka-configs.sh \
  --bootstrap-server 10.0.0.11:9092 \
  --alter --entity-type brokers --entity-name 4 \
  --add-config 'leader.replication.throttled.rate=52428800,follower.replication.throttled.rate=52428800'

# 解释:
# leader.replication.throttled.rate     限制leader向follower复制速度
# follower.replication.throttled.rate  限制follower拉取速度

关键命令速查与解释

# 查看主题分区与副本分配
/opt/kafka/bin/kafka-topics.sh --bootstrap-server 10.0.0.11:9092 --describe --topic order

# 查看消费者积压(lag)
/opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 10.0.0.11:9092 --describe --group order-group

# 查看集群元数据压力指标(JMX 示例)
# jmxterm -l 10.0.0.11:9999 -n
# > get -b kafka.controller:type=KafkaController,name=ActiveControllerCount

排错清单与处理
- 迁移卡住--verify 长时间无进度 → 检查 broker 网络与磁盘IO;必要时暂停迁移并降低速率。
- ISR 缩减kafka-topics --describe 中 ISR 长期小于副本数 → 检查慢盘、慢网或频繁 GC。
- Leader 偏斜:扩容后 leader 分布不均 → 使用 kafka-preferred-replica-election.sh 进行选举。

常见排错命令

# 查看分区 ISR 状态
/opt/kafka/bin/kafka-topics.sh --bootstrap-server 10.0.0.11:9092 --describe --topic order | grep ISR

# 触发优先副本选举(纠正 leader 偏斜)
/opt/kafka/bin/kafka-preferred-replica-election.sh --bootstrap-server 10.0.0.11:9092

练习题(带操作目标)
1. 容量估算练习:按“日写入 500GB、保留 14 天、副本 3、压缩率 0.6”计算所需节点数(单机有效容量 3TB)。
2. 扩容演练:新增一个 Broker,并对 order 主题执行再平衡;提交迁移前后 --describe 的变化。
3. 故障演练:人为降低迁移速率为 5MB/s,观察迁移完成时间变化并记录对生产延迟的影响。
4. Leader 均衡练习:扩容后执行优先副本选举,比较选举前后的 leader 分布。

通过明确触发条件、规范扩容流程与精细化资源规划,可确保 Kafka 集群在增长过程中保持稳定与高性能。