【kafka 3.9.1】单机版KRaft模式部署与SASL/PLAIN认证实战指南
1. KRaft模式与SASL/PLAIN认证概述
Kafka从3.0版本开始正式支持KRaft模式(Kafka Raft Metadata Mode),这是一种用Kafka自身替代ZooKeeper来管理元数据的新架构。实测下来,KRaft模式不仅减少了外部依赖,还显著提升了集群的稳定性和扩展性。对于单机环境而言,KRaft模式部署更加轻量化,特别适合开发测试场景。
SASL/PLAIN认证则是Kafka最基础的用户名密码验证机制。虽然名称中有"PLAIN",但配合TLS加密后同样能满足生产环境的安全需求。我在实际项目中发现,90%的认证需求都可以通过这种简单方案实现,配置过程比Kerberos等复杂方案省心不少。
2. 环境准备与安装
2.1 系统要求
建议使用Linux环境(如Ubuntu 20.04+或CentOS 7+),配置至少2核CPU、4GB内存和10GB磁盘空间。我测试过在2核4GB的云服务器上运行KRaft模式,处理万级TPS毫无压力。
# 安装Java(Kafka 3.9.1需要Java 8/11/17) sudo apt update sudo apt install openjdk-11-jdk -y java -version # 验证安装2.2 下载与解压
wget https://archive.apache.org/dist/kafka/3.9.1/kafka_2.13-3.9.1.tgz tar -xzf kafka_2.13-3.9.1.tgz cd kafka_2.13-3.9.13. KRaft模式配置
3.1 生成集群ID
./bin/kafka-storage.sh random-uuid # 输出示例:x5XK1jZGTnqX9J6jY0JjVg3.2 修改server.properties
创建config/kraft/server.properties文件,关键配置如下:
# KRaft核心配置 process.roles=broker,controller node.id=1 controller.quorum.voters=1@localhost:9093 # 网络监听 listeners=PLAINTEXT://:9092,CONTROLLER://:9093 advertised.listeners=PLAINTEXT://localhost:9092 inter.broker.listener.name=PLAINTEXT # 数据存储 log.dirs=/tmp/kraft-combined-logs3.3 格式化存储目录
./bin/kafka-storage.sh format \ -t x5XK1jZGTnqX9J6jY0JjVg \ -c ./config/kraft/server.properties4. SASL/PLAIN认证配置
4.1 创建JAAS文件
新建config/kafka_server_jaas.conf:
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin123" user_admin="admin123" user_alice="alice123"; };4.2 修改server.properties
追加以下SASL配置:
# SASL配置 listeners=PLAINTEXT://:9092,CONTROLLER://:9093,SASL_PLAINTEXT://:9094 advertised.listeners=PLAINTEXT://localhost:9092,SASL_PLAINTEXT://localhost:9094 sasl.enabled.mechanisms=PLAIN sasl.mechanism.inter.broker.protocol=PLAIN security.inter.broker.protocol=SASL_PLAINTEXT listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT4.3 配置启动脚本
修改bin/kafka-server-start.sh,在最后一行exec之前添加:
export KAFKA_OPTS="-Djava.security.auth.login.config=./config/kafka_server_jaas.conf"5. 启动与验证
5.1 启动服务
./bin/kafka-server-start.sh -daemon ./config/kraft/server.properties5.2 创建测试Topic
./bin/kafka-topics.sh --create \ --topic sasl-test \ --bootstrap-server localhost:9094 \ --command-config config/client.properties在config/client.properties中添加认证信息:
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin123";5.3 生产消费测试
生产者:
./bin/kafka-console-producer.sh \ --topic sasl-test \ --bootstrap-server localhost:9094 \ --producer.config config/client.properties消费者:
./bin/kafka-console-consumer.sh \ --topic sasl-test \ --from-beginning \ --bootstrap-server localhost:9094 \ --consumer.config config/client.properties6. 常见问题排查
问题1:启动时报SASL configuration failed
- 检查JAAS文件路径是否正确
- 确认
kafka_server_jaas.conf权限为600
问题2:客户端连接超时
- 确认
advertised.listeners使用正确IP - 检查防火墙是否开放9094端口
问题3:认证失败
- 检查用户名密码是否与JAAS文件一致
- 确认client.properties中的机制为PLAIN
我在实际部署时遇到过controller节点选举失败的情况,后来发现是controller.quorum.voters配置格式错误。建议新手严格按照nodeid@host:port格式填写,避免使用特殊字符。
7. 性能优化建议
对于单机环境,可以调整以下参数:
# 减少线程数 num.network.threads=2 num.io.threads=4 # 调整内存 KAFKA_HEAP_OPTS="-Xmx2G -Xms2G" # 缩短元数据缓存 metadata.max.idle.ms=30000如果主要进行功能验证,可以把日志保留时间调短:
log.retention.hours=1 log.segment.bytes=1073741824