
1. Kafka 3.9.1单机部署概述最近在折腾Kafka 3.9.1的单机部署发现Kraft模式真是个好东西。相比传统的ZooKeeper依赖模式Kraft模式让Kafka能够独立运行不仅减少了外部依赖还提升了集群的稳定性和性能。对于想要快速搭建一个安全可靠的Kafka环境的开发者来说这个方案特别实用。我这次部署的重点是SASL认证这是Kafka提供的一种安全机制可以确保只有经过认证的客户端才能访问服务。在实际项目中数据安全至关重要特别是在单机环境下如果没有适当的安全措施很容易被恶意攻击。通过SASL认证我们可以实现服务端和客户端的双向认证确保数据传输的安全性。整个部署过程包括几个关键步骤环境准备、Kafka安装、Kraft模式配置、SASL认证设置以及客户端连接测试。我会尽量用通俗易懂的语言来解释每个步骤确保即使是没有太多Kafka经验的朋友也能跟着操作。如果你之前被Kafka的复杂配置吓到过不妨跟着我的步骤再试一次这次应该会顺利很多。2. 环境准备与Kafka安装2.1 安装Java环境Kafka是基于Java开发的所以第一步就是安装Java环境。我推荐使用OpenJDK 11这是目前比较稳定的版本也是Kafka官方推荐的JDK版本。根据你的操作系统不同安装命令也会有所区别。对于CentOS/RHEL系统可以使用以下命令安装yum install -y java-11-openjdk-devel如果是Ubuntu/Debian系统则用这个命令apt install -y openjdk-11-jdk安装完成后别忘了验证一下Java是否安装成功java -version如果看到类似openjdk version 11.0.xx的输出说明安装成功了。2.2 下载并安装Kafka接下来是下载Kafka 3.9.1的安装包。我习惯使用阿里云的镜像站速度比较快wget https://mirrors.aliyun.com/apache/kafka/3.9.1/kafka_2.12-3.9.1.tgz下载完成后解压到/usr/local目录tar -zxvf kafka_2.12-3.9.1.tgz -C /usr/local为了方便后续操作我建议创建一个软链接ln -s /usr/local/kafka_2.12-3.9.1 /usr/local/kafka这样以后升级版本时只需要修改软链接指向新版本即可不用改动其他配置。这个小技巧在实际运维中特别有用。3. Kraft模式配置3.1 生成集群IDKraft模式下每个Kafka集群都需要一个唯一的ID。这个ID可以通过Kafka自带的工具生成/usr/local/kafka/bin/kafka-storage.sh random-uuid这个命令会输出一个类似IAtPev4fQu6b_OkrXGpciw的字符串记下它后面会用到。在集群环境中所有节点都要使用相同的集群ID。3.2 格式化存储目录有了集群ID后我们需要格式化Kafka的存储目录/usr/local/kafka/bin/kafka-storage.sh format -t 你的集群ID -c /usr/local/kafka/config/kraft/server.properties这个步骤相当于初始化Kafka的存储系统。如果以后要重建集群记得要先删除logs目录下的内容再重新执行格式化操作。3.3 修改server.properties接下来是配置的核心部分 - 修改server.properties文件。这个文件位于config/kraft目录下。我们需要设置几个关键参数# 监听器配置 listenersSASL_PLAINTEXT://:9092,CONTROLLER://:9093 inter.broker.listener.nameSASL_PLAINTEXT advertised.listenersSASL_PLAINTEXT://你的服务器IP:9092,CONTROLLER://localhost:9093 # SASL认证配置 sasl.enabled.mechanismsPLAIN sasl.mechanism.inter.broker.protocolPLAIN # 安全相关配置 allow.everyone.if.no.acl.foundfalse auto.create.topics.enabletrue delete.topic.enabletrue这里有几个容易踩坑的地方advertised.listeners中的IP地址一定要设置正确客户端会通过这个地址连接Kafka如果是在本地测试可以用127.0.0.1代替服务器IPallow.everyone.if.no.acl.foundfalse这个配置很重要它确保没有ACL规则时默认拒绝所有访问4. SASL认证配置4.1 服务端认证配置SASL认证需要先在服务端配置认证信息。我们创建一个JAAS配置文件vim /usr/local/kafka/config/kraft/kafka_server_jaas.conf内容如下KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required usernameadmin passwordadmin-secret user_adminadmin-secret user_alicealice-secret; };这个配置定义了两个用户admin用户密码是admin-secretalice用户密码是alice-secretusername和password是用于broker间通信的凭证而user_开头的条目是客户端可以使用的账号。4.2 修改启动脚本为了让Kafka加载我们的JAAS配置需要修改启动脚本vim /usr/local/kafka/bin/kafka-server-start.sh在脚本开头附近添加if [ x$KAFKA_OPTS ]; then export KAFKA_OPTS-Djava.security.auth.login.config/usr/local/kafka/config/kraft/kafka_server_jaas.conf fi这个修改确保Kafka启动时会加载我们配置的认证信息。4.3 启动Kafka服务现在可以启动Kafka服务了/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/kraft/server.properties启动后可以查看日志确认是否成功tail -f /usr/local/kafka/logs/server.log如果看到started (kafka.server.KafkaServer)这样的日志说明启动成功了。5. 客户端配置与测试5.1 客户端认证配置客户端也需要配置认证信息。创建一个客户端JAAS文件vim /usr/local/kafka/config/kraft/kafka_client_jaas.conf内容如下KafkaClient { org.apache.kafka.common.security.plain.PlainLoginModule required usernamealice passwordalice-secret; };这个配置告诉客户端使用alice用户进行认证。5.2 修改客户端配置文件我们需要修改生产者和消费者的配置文件添加安全协议配置。生产者配置vim /usr/local/kafka/config/producer.properties添加security.protocol: SASL_PLAINTEXT sasl.mechanism: PLAIN消费者配置vim /usr/local/kafka/config/consumer.properties添加相同的内容。5.3 修改客户端启动脚本为了让客户端加载JAAS配置还需要修改生产者和消费者的启动脚本。生产者脚本vim /usr/local/kafka/bin/kafka-console-producer.sh添加if [ x$KAFKA_OPTS ]; then export KAFKA_OPTS-Xmx512M -Djava.security.auth.login.config/usr/local/kafka/config/kraft/kafka_client_jaas.conf fi消费者脚本也做同样的修改。5.4 创建Topic并测试现在我们可以创建一个测试Topic/usr/local/kafka/bin/kafka-topics.sh --bootstrap-server 127.0.0.1:9092 \ --command-config /usr/local/kafka/config/kraft/kafka_client_jaas.properties \ --create --topic test-topic --partitions 1 --replication-factor 1启动生产者发送消息/usr/local/kafka/bin/kafka-console-producer.sh --broker-list 127.0.0.1:9092 \ --producer.config /usr/local/kafka/config/producer.properties \ --topic test-topic在另一个终端启动消费者接收消息/usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 \ --consumer.config /usr/local/kafka/config/consumer.properties \ --topic test-topic --from-beginning如果能看到生产者发送的消息被消费者接收说明整个系统工作正常。6. 常见问题与解决方案在实际部署过程中可能会遇到各种问题。这里分享几个我踩过的坑和解决方法。6.1 认证失败问题如果遇到认证失败的错误比如Failed authentication with /127.0.0.1首先检查服务端和客户端的JAAS配置文件中的用户名密码是否匹配server.properties中的sasl.enabled.mechanisms是否设置正确客户端配置的安全协议是否是SASL_PLAINTEXT6.2 连接被拒绝问题如果客户端无法连接到服务端检查advertised.listeners配置的IP和端口是否正确防火墙是否开放了9092端口Kafka服务是否正常启动查看server.log6.3 Topic操作权限问题如果无法创建或删除Topic检查allow.everyone.if.no.acl.found是否设置为false是否使用了正确的认证用户进行操作可能需要配置ACL规则7. 性能优化建议虽然这是单机部署但合理的配置还是能提升性能。这里给出几个优化建议调整log.dirs参数将日志目录放在高性能磁盘上根据硬件配置调整num.io.threads和num.network.threads适当增加socket.request.max.bytes以适应大消息考虑开启压缩compression.typesnappy或gzip减少网络传输在实际使用中我发现Kraft模式下的单机Kafka性能已经相当不错能够满足大多数开发和测试需求。对于生产环境还是建议使用集群部署以获得更好的可靠性和扩展性。