Kafka 集群 Broker 节点扩缩容完整操作
核心概念 Kafka 新增/下线 Broker 不会自动迁移分区,必须使用 kafka-reassign-partitions.sh 手动重分配,全程支持限流不中断。
1. 核心前置原理
- Kafka新增/下线Broker不会自动迁移分区副本,新节点空负载、待下线节点会残留分区,必须使用
kafka-reassign-partitions.sh手动重分配; - 分区迁移必须两步生成JSON方案:topics清单JSON → 生成分配计划JSON,先预览校验再执行,防止集群IO风暴、副本同机丢数据;
- 扩容目标:把存量Topic副本打散到新节点均衡负载;缩容目标:把待下线节点上所有分区全部迁出,无残留后再停机;
- 全程支持限流,业务低峰操作,不中断生产消费、零消息丢失。
2. 集群扩容(新增Broker节点)完整流程
场景:现有broker.id=1、2、3,新增节点broker.id=4
2.1. 步骤1:新节点配置、启动并加入集群
- 修改
server.properties核心配置(id全局唯一,不可重复)
broker.id=4
listeners=PLAINTEXT://0.0.0.0:9092
log.dirs=/data/kafka-logs
zookeeper.connect=zk1:2181,zk2:2181,zk3:2181
# KRaft集群替换为controller.quorum.bootstrap.servers
- 后台启动kafka
bin/kafka-server-start.sh -daemon config/server.properties
- 校验节点成功加入集群
# 查看集群全部broker列表,能看到4即加入成功
bin/kafka-broker-api-versions.sh --bootstrap-server 1:9092
重点:此时节点4无任何分区,完全空闲,扩容只完成一半,必须迁移分区均衡负载。
2.2. 步骤2:生成迁移JSON方案(两步JSON机制)
2.2.1. ① 编写待迁移Topic清单 topics-to-move.json
定义需要打散扩容的业务Topic,工具读取此文件确定迁移范围
{"topics": [{"topic": "order_topic"},{"topic": "log_topic"}], "version":1}
2.2.2. ② —generate 生成正式分区分配计划 reassignment.json
指定全部集群broker列表(包含新节点4),工具自动计算均衡副本分布,输出完整迁移方案
bin/kafka-reassign-partitions.sh \
--bootstrap-server 1:9092 \
--topics-to-move-json-file topics-to-move.json \
--broker-list "1,2,3,4" \
--generate > reassignment.json
输出的reassignment.json精确记录每个分区、每一份副本分配到哪些broker,可手动编辑优化:
- 规避副本落在同一机架/同一机器;
- 热点分区优先分配到SSD高速新节点;
- 拆分分批迁移,控制单次同步流量。
2.3. 步骤3:执行分区迁移,同步副本到新节点
增加--throttle限流,限制同步带宽,避免抢占业务IO(示例10MB/s)
bin/kafka-reassign-partitions.sh \
--bootstrap-server 1:9092 \
--reassignment-json-file reassignment.json \
--execute \
--throttle 10485760
后台自动同步副本:新broker4成为follower,完整同步分区日志加入ISR,旧节点副本保留至迁移完成。
2.4. 步骤4:校验迁移全部完成
bin/kafka-reassign-partitions.sh \
--bootstrap-server 1:9092 \
--reassignment-json-file reassignment.json \
--verify
输出completed successfully代表所有分区同步完毕;可查看Topic分区分布,确认副本均匀分布到1/2/3/4四个节点。
2.5. 步骤5:扩容收尾优化
- 清除限流:迁移完成后取消带宽限制,恢复正常副本同步速度
bin/kafka-reassign-partitions.sh --bootstrap-server 1:9092 --verify --throttle -1
- 新创建Topic自动均衡:后续新建topic会自动分配到全部4台broker。
3. 集群缩容(安全下线Broker节点)完整流程
场景:集群broker.id=1、2、3、4,下线broker.id=4,最终保留1、2、3
3.1. 核心红线:严禁直接停机节点
直接下线会导致该节点上所有分区副本缺失,集群进入非健康状态、读写报错、数据丢失风险;必须先把节点4上所有分区全部迁出,无任何残留分区再停机。
3.2. 步骤1:生成缩容迁移JSON方案
3.2.1. ① 编写topics-to-move.json(所有业务topic清单)
{"topics": [{"topic": "order_topic"},{"topic": "log_topic"}], "version":1}
3.2.2. ② generate生成缩容分配计划
--broker-list只填写最终保留的节点1,2,3,工具自动将所有分区从broker4迁出
bin/kafka-reassign-partitions.sh \
--bootstrap-server 1:9092 \
--topics-to-move-json-file topics-to-move.json \
--broker-list "1,2,3" \
--generate > shrink.json
打开shrink.json可校验:所有partition的replicas数组中无4,副本全部迁移至剩余节点。
3.3. 步骤2:执行缩容分区迁移(限流保护业务)
bin/kafka-reassign-partitions.sh \
--bootstrap-server 1:9092 \
--reassignment-json-file shrink.json \
--execute \
--throttle 10485760
迁移逻辑:把broker4上所有副本同步到1/2/3,同步完成后自动删除broker4本地分区日志。
3.4. 步骤3:反复校验迁移完成,节点4无任何分区
- 执行verify确认迁移全部完成
bin/kafka-reassign-partitions.sh \
--bootstrap-server 1:9092 \
--reassignment-json-file shrink.json \
--verify
- 核查所有topic分区分布,确认broker.id=4不存在任何副本
bin/kafka-topics.sh --bootstrap-server 1:9092 --describe
3.5. 步骤4:优雅下线Broker节点
- 取消同步限流
bin/kafka-reassign-partitions.sh --bootstrap-server 1:9092 --verify --throttle -1
- 优雅停止kafka进程(禁止kill -9)
bin/kafka-server-stop.sh
# 或 kill -15 进程PID
- 校验集群broker列表,4已从集群中移除
bin/kafka-broker-api-versions.sh --bootstrap-server 1:9092
3.6. 多节点缩容规范
一次只下线一台broker,完成全量分区迁移、验证无残留后,再重复流程下线下一台,禁止一次性多台同时缩容。
4. 为什么扩缩容必须先走generate生成两份JSON(结合之前对话总结)
4.1. 两份JSON分工完全独立,缺一不可
topics-to-move.json:输入清单,仅定义需要迁移的Topic范围,不包含分区分配规则;- 生成输出
reassignment.json/shrink.json:迁移执行计划书,精确绑定每个分区副本对应的目标broker,是execute阶段唯一执行依据。
4.2. 安全设计:先预览校验,再执行,规避线上重大故障
工具拆分--generate计算、--execute执行两步,依靠JSON做隔离:
- generate仅做内存计算,不改动集群任何数据,运维可人工核对副本分布;
- 自动生成方案存在缺陷(扩容副本扎堆新节点、缩容副本同机架),可手动编辑JSON修正分配规则;
- 确认方案完全符合高可用要求后,才发起跨节点副本同步;
若跳过JSON预览直接执行,极易出现副本同机、集群IO风暴、分区副本不足引发读写不可用。
4.3. JSON标准化适配运维自动化
- 批量管控:JSON数组支持一次性管理数十个Topic,适配脚本批量扩容/缩容;
- 变更留痕:迁移方案文件存档,用于故障追溯、运维变更审计;
- 可编程处理:Shell/Python脚本解析修改JSON,实现分批迁移、冷热节点分区隔离,纯命令行参数无法精细化控制。
4.4. 工具无自主调度能力
kafka-reassign-partitions.sh仅为执行工具,无法自动分析集群负载、自动规划分区放置,必须依靠结构化JSON文件明确每个分区的目标broker,才能完成副本同步搬迁。
5. 生产扩缩容通用最佳实践&避坑
5.1. 操作时间窗口
全部分区迁移操作放在凌晨业务低峰,集群CPU、磁盘IO占用低于50%执行。
5.2. 限流必开
迁移同步带宽抢占正常生产消费IO,--throttle限制同步速度,迁移完成后关闭限流。
5.3. 分批迁移Topic
集群Topic上千个时,不要一次性全量迁移,拆分多批执行,防止瞬时大量副本同步打满网卡。
5.4. 副本高可用约束
扩容/缩容生成JSON后必须校验:每个分区副本分散在不同机架、不同物理机器,保证单节点宕机不丢失数据。
5.5. 缩容致命禁忌
未迁出节点上所有分区就停机broker,会直接导致对应分区副本数不足,集群状态变黄、生产报错NotEnoughReplicas。
5.6. 监控配套
迁移过程监控指标:磁盘IO、网卡流量、ISR同步状态、集群健康状态,出现延迟暴涨立即降低限流带宽。
5.7. 自动均衡工具补充
大规模集群可使用Cruise Control自动均衡分区,无需手动生成JSON,适合长期负载自动调平;小规模集群仍使用原生reassign脚本可控性更强。
6. 扩缩容完整流程速记
6.1. 扩容
新增节点配置启动加入集群 → 编写topic清单json → generate生成均衡分配json → execute限流迁移 → verify校验完成 → 取消限流
6.2. 缩容
编写topic清单json → generate生成迁出分配json(broker-list不含待下线节点)→ execute限流迁移 → verify确认节点无残留分区 → 优雅停机broker
6.3. 核心统一底层逻辑
无论扩容、缩容、单集群内分区迁移,底层均依赖kafka-reassign-partitions.sh双JSON方案,通过预生成分配计划保障集群数据安全与负载均衡。