温馨提示×

Kafka在Linux上的高可用配置是什么

小樊
41
2025-12-21 01:44:49
栏目: 智能运维

Kafka 在 Linux 上的高可用配置

一 架构与前提

  • 使用至少 3 台 Linux 服务器构建集群,推荐 3 个 ZooKeeper 节点 + 3 个 Kafka Broker,以实现元数据与分区副本的多数派容错(避免脑裂需保证 ZooKeeper 为奇数节点)。
  • 安装 Java 8+,并统一 主机名/IP 解析NTP 时间同步防火墙/SELinux策略(开放或关闭相应端口,确保节点互通)。
  • 版本建议:Kafka 3.5.x 及以上支持内置 KRaft 模式(可替代 ZooKeeper);若使用旧版本,采用 ZooKeeper 外部集群模式。

二 两种高可用部署模式

  • KRaft 模式(Kafka 3.5+,去 ZooKeeper)
    • 配置要点(每个 Broker 的 server.properties):
      • 启用 KRaft:process.roles=broker,controller
      • 节点标识:node.id=<唯一ID(1..N)>
      • 集群内通信:controller.quorum.voters=1@host1:9093,2@host2:9093,3@host3:9093
      • 监听地址:listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
      • 对外地址:advertised.listeners=PLAINTEXT://<本机IP或域名>:9092
      • 日志目录:log.dirs=/var/lib/kafka
      • 版本兼容:inter.broker.protocol.versionlog.message.format.version 按升级策略设置
    • 生成集群 ID:bin/kafka-storage.sh random-uuid
    • 格式化存储:bin/kafka-storage.sh format -t <ClusterID> -c config/server.properties
    • 启动:bin/kafka-server-start.sh config/server.properties
  • ZooKeeper 模式(Kafka ≤3.4 或兼容旧生态)
    • ZooKeeper 集群(zoo.cfg):
      • tickTime=2000initLimit=10syncLimit=5
      • dataDir=/var/lib/zookeeper
      • clientPort=2181
      • 集群成员:server.1=host1:2888:3888server.2=host2:2888:3888server.3=host3:2888:3888
      • 各节点在 dataDir 下创建 myid 文件,内容分别为 1/2/3
    • Kafka Broker(server.properties):
      • broker.id=<唯一ID>
      • listeners=PLAINTEXT://0.0.0.0:9092
      • advertised.listeners=PLAINTEXT://<本机IP或域名>:9092
      • log.dirs=/var/lib/kafka
      • zookeeper.connect=host1:2181,host2:2181,host3:2181

三 关键高可用参数

  • 复制与容错
    • 主题副本数:建议 replication.factor ≥ 3,分区数按吞吐与并行度规划
    • 最小同步副本:min.insync.replicas=2(配合 acks=all 实现写入高可靠)
    • 默认副本与内部主题:
      • default.replication.factor=3
      • offsets.topic.replication.factor=3
      • transaction.state.log.replication.factor=3
      • transaction.state.log.min.isr=2
  • 网络与 I/O
    • num.network.threadsnum.io.threads 按 CPU 核数调优
    • socket.send.buffer.bytessocket.receive.buffer.bytes 适配带宽与延迟
    • socket.request.max.bytes 防止过大请求 OOM
  • 日志与存储
    • log.retention.hours / log.retention.bytes / log.segment.bytes 控制保留与滚动
    • 多磁盘:log.dirs=/data1/kafka,/data2/kafka(分散 I/O)
  • 生产者可靠性
    • acks=allretriesenable.idempotence=true(幂等生产者)、max.in.flight.requests.per.connection≤5
  • 消费者容错
    • 合理设置 session.timeout.msheartbeat.interval.ms,避免不必要的再均衡
  • 启动顺序
    • KRaft:先启动 controller.quorum.voters 多数派,再启动全部 Broker
    • ZooKeeper:先启动 ZooKeeper 集群,再启动所有 Broker

四 验证与日常运维

  • 集群健康检查
    • 查看 Broker:bin/kafka-broker-api-versions.sh --bootstrap-server <任一节点IP>:9092
    • 查看 Topic 分布:bin/kafka-topics.sh --describe --bootstrap-server <任一节点IP>:9092 --topic <topic>
  • 高可用验证
    • 创建测试主题:bin/kafka-topics.sh --create --bootstrap-server <任一节点IP>:9092 --replication-factor 3 --partitions 3 --topic ha-test
    • 生产者/消费者连通性:
      • 生产:bin/kafka-console-producer.sh --bootstrap-server <任一节点IP>:9092 --topic ha-test
      • 消费:bin/kafka-console-consumer.sh --bootstrap-server <任一节点IP>:9092 --topic ha-test --from-beginning
    • 故障演练:停止 1 个 Broker,确认生产无报错(acks=all 时写入仍成功)、消费不受影响;再停止第 2 个验证可用性边界(只剩 1 个副本时不可写)
  • 监控与告警
    • 指标采集:JMX + Prometheus + Grafana,关注 UnderReplicatedPartitions、RequestHandlerAvgIdlePercent、NetworkProcessorAvgIdlePercent、Disk Usage
    • 日志轮转与磁盘阈值告警,定期巡检 log.retentionlog.dirs 空间
  • 安全加固(可选)
    • 传输加密:TLS/SSL
    • 认证授权:SASL/SCRAMSASL/PLAIN,配合 ACL 控制 Topic/Group/Cluster 资源访问

五 常见坑与建议

  • 对外访问一定要正确配置 listenersadvertised.listeners,否则会出现“能生产不能消费”或客户端解析错误。
  • ZooKeeper 与 KRaft 的 端口与 quorum 配置要与实际网络接口一致,避免仅绑定 127.0.0.1。
  • 生产环境建议关闭 auto.create.topics.enable,由平台/运维统一创建与治理 Topic。
  • 合理设置 min.insync.replicasacks,在可靠性与延迟之间取得平衡。
  • 谨慎调整 num.partitionsdefault.replication.factor,变更前评估对 ISR、再均衡与存储的影响。

0