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 集群(外部协调模式)
- 下载解压 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
- 各节点在 dataDir 下创建 myid,内容分别为 1/2/3;
- 启动并检查状态:bin/zkServer.sh start/status。
- 安装与配置 Kafka 集群
- 下载解压 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
- 创建日志目录并赋权;
- 启动: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,controller、controller.quorum.voters、listeners、log.dirs 等,按官方步骤完成引导与数据目录迁移。
- 优势与注意:部署与运维简化、故障域更集中;但首次迁移需严格按官方步骤执行,确保元数据一致性与副本放置策略正确。