Kafka 集群部署实战与SASL安全认证配置详解

张开发
2026/4/21 11:46:37 15 分钟阅读

分享文章

Kafka 集群部署实战与SASL安全认证配置详解
1. Kafka集群部署前的环境规划第一次搭建Kafka生产环境时我在三台云服务器上折腾了整整两天。最深刻的教训就是没有提前规划好部署架构后期改配置会让人崩溃。建议先画张简单的拓扑图标注清楚每台服务器的角色和网络配置。比如我们团队用的方案是3台ZooKeeper节点构成仲裁集群搭配3台Kafka broker形成高可用架构所有机器都在同一个可用区但不同机架上。硬件配置方面给Kafka节点分配资源时要特别注意磁盘优先选用SSD我们测试过机械硬盘在高吞吐场景下延迟会飙升3倍。如果预算有限至少保证日志目录挂载到独立磁盘内存Kafka的堆内存建议4-8GB通过KAFKA_HEAP_OPTS设置太小容易频繁GC太大会导致操作系统缓存不足CPU网络线程(network.threads)和IO线程(io.threads)数要根据核心数调整我们的16核机器配置了8个IO线程网络配置有个容易踩的坑如果服务器有多个网卡务必在server.properties里用具体IP而非0.0.0.0。有次我们遇到跨机房流量走错网卡排查了半天才发现是监听地址配置模糊导致的。建议这样写listenersPLAINTEXT://192.168.1.101:9092 advertised.listenersPLAINTEXT://192.168.1.101:90922. ZooKeeper集群的避坑指南虽然Kafka 2.8开始支持不用ZooKeeper的模式KRaft但现阶段生产环境还是建议用ZooKeeper集群。部署时要注意这几个关键点首先是myid文件的玄学问题这个文件必须放在dataDir目录下且内容只能是纯数字ID。我们遇到过服务器重启后ZooKeeper无法选举最后发现是myid文件被误删了。建议用这个命令加固echo 1 /data/zookeeper/myid chmod 400 /data/zookeeper/myid集群配置文件中这些参数需要特别关注# 同步超时时间单位是tickTime的倍数 syncLimit5 # 初始化连接时的最长心跳等待 initLimit10 # 事务日志存储目录建议与dataDir分盘存放 dataLogDir/data/zookeeper/logs启动顺序也有讲究应该先启动所有ZooKeeper节点等集群选举完成用zkServer.sh status查看角色后再启动Kafka。有次我们同时启动所有服务结果Kafka一直报连接拒绝其实就是ZooKeeper还没完成选举。3. Kafka集群的核心参数调优安装完Kafka后别急着启动先调整这些生产级参数日志存储相关# 单个日志段文件大小根据消息量调整 log.segment.bytes1073741824 # 日志保留策略我们采用大小时间双保险 log.retention.bytes107374182400 log.retention.hours168 # 日志目录建议用逗号分隔多个路径 log.dirs/data1/kafka-logs,/data2/kafka-logs副本与ISR机制# 新建topic的默认分区数 num.partitions3 # 每个分区的副本数建议2-3 default.replication.factor3 # ISR最小存活副本数 min.insync.replicas2 # 副本拉取线程数根据分区数调整 num.replica.fetchers4有个真实案例某次机房网络抖动导致ISR频繁收缩扩张最终发现是replica.lag.time.max.ms默认30秒设置太敏感。我们调整到2分钟后集群稳定性明显提升。4. SASL/PLAIN认证全流程配置给Kafka加安全认证就像给房子装防盗门虽然步骤多点但非常必要。下面是具体操作服务端配置创建JAAS认证文件kafka_server_jaas.confKafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required usernameadmin passwordadmin-secret user_adminadmin-secret user_producerproducer-pass user_consumerconsumer-pass; };修改server.properties启用SASLlistenersSASL_PLAINTEXT://:9093 security.inter.broker.protocolSASL_PLAINTEXT sasl.mechanism.inter.broker.protocolPLAIN sasl.enabled.mechanismsPLAIN authorizer.class.namekafka.security.authorizer.AclAuthorizer super.usersUser:admin启动时加载JAAS配置export KAFKA_OPTS-Djava.security.auth.login.config/path/to/kafka_server_jaas.conf bin/kafka-server-start.sh config/server.properties客户端配置需要创建client.properties文件security.protocolSASL_PLAINTEXT sasl.mechanismPLAIN sasl.jaas.configorg.apache.kafka.common.security.plain.PlainLoginModule required \ usernameproducer \ passwordproducer-pass;测试时发现个典型问题如果客户端和服务端的SASL机制不匹配比如一边用PLAIN一边用SCRAM会报Authentication failed错误但日志不明确。这时候可以开启DEBUG日志log4j.logger.kafkaDEBUG5. 生产环境验证与监控部署完成后建议用kafka-producer-perf-test做压力测试bin/kafka-producer-perf-test.sh \ --topic test-topic \ --num-records 1000000 \ --record-size 1024 \ --throughput -1 \ --producer.config client.properties关键监控指标要配置告警UnderReplicatedPartitions持续大于0说明副本同步有问题RequestHandlerAvgIdlePercent低于70%需要考虑扩容NetworkProcessorAvgIdlePercent反映网络线程负载我们团队用PrometheusGrafana搭建的监控看板重点关注这些指标分区Leader分布是否均衡各Broker的磁盘使用量生产/消费的延迟百分位值最后提醒下修改任何配置都要滚动重启先逐个停Broker再启动直接全停会导致所有分区重新选举。曾经有次全集群重启ZooKeeper的watch数量暴涨导致内存溢出这个坑希望大家别重蹈覆辙。

更多文章