Linux系统中Kafka如何扩容
小樊
44
2025-12-30 19:24:25
Linux系统中Kafka扩容实操指南
一 扩容方式与前置检查
- 扩容方式
- 水平扩容:新增 Broker 节点,通过分区再平衡把数据/负载分摊到新节点。
- 垂直扩容:为现有 Broker 新增磁盘,更新 log.dirs 后重启,再做数据均衡。
- 前置检查
- 集群健康:所有 Broker 在线,Under-Replicated 分区=0,无异常告警。
- 冗余安全:Topic 的 副本因子≥2(建议 3),避免迁移/故障导致数据丢失。
- 资源与窗口:评估 CPU/磁盘/网络,选择业务低峰期执行;建议 10Gbps 以上网络用于数据迁移。
- 版本建议:Kafka 2.8+(推荐 3.4+);KRaft 模式无需 ZooKeeper,ZooKeeper 模式需 3.6+。
二 新增 Broker 节点
- 安装与权限
- 安装 OpenJDK 11+,创建 kafka 用户与数据目录(如 /kafka-logs),设置目录属主。
- 配置 server.properties(关键项)
- 唯一 broker.id(如已有 1,2,3,新增用 4)。
- 监听地址:listeners/advertised.listeners 配置为实际 IP:9092。
- 存储路径:log.dirs 指向数据盘目录。
- 模式差异:
- KRaft:设置 process.roles=broker,controller、controller.quorum.voters=1@host1:9093,2@host2:9093,3@host3:9093,4@host4:9093、listeners=CONTROLLER://…;PLAINTEXT://…、inter.broker.listener.name=PLAINTEXT、listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT、controller.listener.names=CONTROLLER。
- ZooKeeper:设置 zookeeper.connect=zk1:2181,zk2:2181,zk3:2181/kafka。
- 启动与纳管
- 启动新 Broker:bin/kafka-server-start.sh config/server.properties。
- 验证加入:bin/kafka-broker-api-versions.sh --bootstrap-server <任一现有Broker:9092> | grep -E “^[0-9]+”,应能看到新 Broker ID。
三 分区再平衡与限流
- 生成迁移计划
- 全量均衡(推荐):生成包含全部 Topic 的计划 JSON。
- KRaft:bin/kafka-reassign-partitions.sh --bootstrap-server <任一Broker:9092> --generate --topics-to-move-json-file topics.json --broker-list “0,1,2,3,4”
- ZooKeeper:bin/kafka-reassign-partitions.sh --zookeeper ZK:2181/kafka --generate --topics-to-move-json-file topics.json --broker-list “0,1,2,3,4”
- 指定 Topic:先在 topics.json 中列出目标 topics,再生成计划。
- 执行与限流(避免影响业务)
- 在生成的 reassignment.json 中为每个分区指定目标 replicas 列表。
- 执行并限速(示例将复制限流为 100MB/s):
- KRaft:bin/kafka-reassign-partitions.sh --bootstrap-server <任一Broker:9092> --reassignment-json-file reassignment.json --execute --throttle 104857600
- ZooKeeper:bin/kafka-reassign-partitions.sh --zookeeper ZK:2181/kafka --reassignment-json-file reassignment.json --execute --throttle 104857600
- 监控与完成验证
- 实时监控:bin/kafka-reassign-partitions.sh --verify …;观察 Under-Replicated 分区=0、Consumer Lag 稳定。
- 完成后可取消限流(避免长期影响正常复制):
- KRaft:bin/kafka-reassign-partitions.sh --bootstrap-server <任一Broker:9092> --reassignment-json-file reassignment.json --verify
- ZooKeeper:bin/kafka-reassign-partitions.sh --zookeeper ZK:2181/kafka --reassignment-json-file reassignment.json --verify
- 时间预估
- 迁移时间(小时) ≈ 需迁移数据量(GB) / (迁移带宽(MB/s) × 3600) × 1.5(系数考虑追赶与重均衡)。
四 单 Broker 磁盘扩容(不新增节点)
- 操作步骤
- 挂载新磁盘到如 /data2,在 server.properties 中更新 log.dirs:log.dirs=/data1/kafka-logs,/data2/kafka-logs。
- 按顺序重启 Broker(逐个滚动重启),避免同时重启导致不可用。
- 均衡数据
- 新磁盘加入后,使用 kafka-reassign-partitions.sh 生成并执行再平衡计划,将分区副本分布到新磁盘,均衡磁盘使用率。
五 常见问题与最佳实践
- 常见问题
- 新节点未承载数据:新增 Broker 不会自动分配分区,必须执行 分区再平衡。
- 迁移影响业务:务必设置 –throttle,并在低峰期执行;全程监控 Under-Replicated 分区 与 Consumer Lag。
- 版本与模式差异:KRaft 与 ZooKeeper 的参数与命令入口不同,注意 –bootstrap-server 与 –zookeeper 的区分。
- 最佳实践
- 目标副本因子 ≥3,跨机架/可用区部署,提升容灾能力。
- 规划 分区数量 与 Key 分布,避免热点;必要时对热点 Topic 单独再平衡。
- 使用 Cruise Control 或监控平台做持续均衡与容量预警;每次只变更少量节点,逐步推进。