温馨提示×

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,controllercontroller.quorum.voters=1@host1:9093,2@host2:9093,3@host3:9093,4@host4:9093listeners=CONTROLLER://…;PLAINTEXT://…inter.broker.listener.name=PLAINTEXTlistener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXTcontroller.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 分区=0Consumer 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 或监控平台做持续均衡与容量预警;每次只变更少量节点,逐步推进。

0