温馨提示×

centos环境下kafka高可用性如何配置

小樊
40
2025-12-31 06:45:32
栏目: 智能运维

总体架构与前提

  • 建议至少准备3台 CentOS 7/8 服务器,每台部署1个 Kafka Broker;若采用外部协调,再准备3台 ZooKeeper(或升级到 Kafka 3.5.1+ 的 KRaft 模式以去除 ZooKeeper 依赖)。
  • 安装 Java 11+(推荐),并创建专用用户(如 kafka)运行进程;为 Kafka 调高文件句柄与内存映射限制(如 ulimit -n ≥ 100000、vm.max_map_count 调优)。
  • 配置 /etc/hosts 或 DNS,确保节点间可解析;开放或放行端口:9092(Kafka)2181(ZooKeeper),以及 ZooKeeper 集群通信端口 2888/3888
  • 时间同步(如 chrony)与基础监控(JMX/脚本)建议一并就绪。

部署步骤

  • 安装与配置 ZooKeeper 集群(外部协调模式)
    1. 下载解压 ZooKeeper,编辑 conf/zoo.cfg
      tickTime=2000;initLimit=10;syncLimit=5;dataDir=/opt/zookeeper/data;clientPort=2181
      集群节点:server.1=kafka1:2888:3888;server.2=kafka2:2888:3888;server.3=kafka3:2888:3888
    2. 各节点在 dataDir 下创建 myid,内容分别为 1/2/3
    3. 启动并检查状态:bin/zkServer.sh start/status。
  • 安装与配置 Kafka 集群
    1. 下载解压 Kafka(如 3.8.x),编辑 config/server.properties(每个节点唯一 broker.id):
      listeners=PLAINTEXT://:9092
      advertised.listeners=PLAINTEXT://<本机IP或FQDN>:9092
      log.dirs=/var/lib/kafka/logs
      num.network.threads=3;num.io.threads=8
      socket.send.buffer.bytes=102400;socket.receive.buffer.bytes=102400;socket.request.max.bytes=104857600
      若使用外部 ZooKeeper:zookeeper.connect=kafka1:2181,kafka2:2181,kafka3:2181
    2. 创建日志目录并赋权;
    3. 启动:bin/kafka-server-start.sh -daemon config/server.properties。
  • 防火墙放行(示例):firewall-cmd --permanent --add-port=9092/tcp;firewall-cmd --permanent --add-port=2181/tcp;firewall-cmd --reload。
  • 验证:创建测试主题(见下节),并做生产/消费连通性验证。

高可用关键配置

  • 主题与副本
    • 创建 Topic 时设置 –replication-factor ≥ 3–partitions ≥ 3,并将副本分布在不同 Broker;若跨机架,配置 broker.rack 实现机架感知,提升容灾能力。
  • 服务端关键参数(server.properties)
    • 可用性优先:
      • unclean.leader.election.enable=true(允许非 ISR 副本被选举为 Leader,可能丢数据,但减少不可用窗口)
      • auto.leader.rebalance.enable=true(自动均衡 Leader)
      • min.insync.replicas=1(配合 acks=all 时放宽一致性)
    • 可靠性优先:
      • unclean.leader.election.enable=false(避免脏 Leader,宁可暂时不可用)
      • min.insync.replicas=2(至少 2 个同步副本才允许写入)
      • 注意:需满足 min.insync.replicas ≤ replication.factor
  • 客户端关键参数(producer.properties)
    • acks=0:不等待确认,性能最高、丢数据风险最大;
    • acks=1:仅 Leader 确认,折中;
    • acks=all(或 -1):等待 ISR 全部副本确认,最可靠但时延最高。
  • 典型组合建议
    • 高可用:acks=1,min.insync.replicas=1,unclean.leader.election.enable=true;
    • 高可靠:acks=all,min.insync.replicas=2(或 3),unclean.leader.election.enable=false。
  • 动态生效与生效范围
    • 上述参数大多支持 Topic 级覆盖(可在创建/变更时指定),部分服务级参数需重启生效。

验证与日常运维

  • 验证集群健康
    • 创建测试主题:
      ./kafka-topics.sh --create --bootstrap-server kafka1:9092 --topic test-ha --partitions 3 --replication-factor 3
    • 查看分布:
      ./kafka-topics.sh --describe --bootstrap-server kafka1:9092 --topic test-ha
    • 生产/消费验证:
      ./kafka-console-producer.sh --bootstrap-server kafka1:9092 --topic test-ha
      ./kafka-console-consumer.sh --bootstrap-server kafka2:9092 --topic test-ha --from-beginning
  • 监控与告警
    • 通过 JMX 与命令行工具持续观察:UnderReplicatedPartitions、IsrShrinks、LeaderElectionRateAndTimeMs、RequestHandlerAvgIdlePercent 等关键指标;异常时优先排查网络、磁盘、ZooKeeper/KRaft 状态与副本同步滞后。
  • 维护与变更
    • 变更 服务级参数(如 unclean.leader.election.enable、min.insync.replicas)需在维护窗口进行并重启;Topic 级参数可用 kafka-topics.sh --alter 在线调整。

KRaft 模式可选方案

  • 适用版本:Kafka 3.5.1+ 支持内置 KRaft(Kafka Raft Metadata)模式,去除外部 ZooKeeper 依赖,元数据与一致性由 Kafka 自身管理。
  • 基本思路:部署 3/5 个 Controller 节点 + 若干 Broker 节点,生成并分发 cluster.id 与节点 ID,配置 process.roles=broker,controllercontroller.quorum.voterslistenerslog.dirs 等,按官方步骤完成引导与数据目录迁移。
  • 优势与注意:部署与运维简化、故障域更集中;但首次迁移需严格按官方步骤执行,确保元数据一致性与副本放置策略正确。

0