news 2026/10/25 20:21:06

Kafka单机搭建(二)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kafka单机搭建(二)

Kafka改为system模式

要将 Kafka(KRaft 模式)以systemd 服务(system 模式)方式运行,可以创建一个 systemd unit 文件,实现开机自启、日志管理、自动重启等功能。以下是详细步骤:


前提条件

  • 已完成 Kafka 的 KRaft 模式初始化(包括生成 UUID、格式化存储目录)
  • 已配置好config/kraft/server.properties
  • 如需 SASL 认证,JAAS 配置文件已就绪
  • 使用非 root 用户运行 Kafka(推荐新建专用用户,如kafka)

一、创建专用用户

# 创建Kafka用户与密码sudouseradd-r -s /sbin/nologin kafka# 将Kafka的目录移至非root目录下mv/root/kafka_2.13-3.7.0 /opt/# 将kafka用户此文件的权限sudochown-R kafka:kafka /opt/kafka_2.13-3.7.0

将/opt/kafka_2.13-3.7.0替换为你的实际 Kafka 安装路径,例如/opt/kafka


二、创建 systemd 服务文件

sudovi/etc/systemd/system/kafka.service

内容如下(根据是否启用 SASL 调整):

情况 A:未启用 SASL(纯 PLAINTEXT)
[Unit] Description=Apache Kafka Server (KRaft mode) After=network.target [Service] Type=simple User=kafka Group=kafka WorkingDirectory=/opt/kafka_2.13-3.7.0 ExecStart=/opt/kafka_2.13-3.7.0/bin/kafka-server-start.sh /opt/kafka_2.13-3.7.0/config/kraft/server.properties Restart=on-failure RestartSec=10 StandardOutput=journal StandardError=journal SyslogIdentifier=kafka [Install] WantedBy=multi-user.target
情况 B:启用了 SASL/PLAIN 认证
[Unit] Description=Apache Kafka Server (KRaft + SASL/PLAIN) After=network.target [Service] Type=simple User=kafka Group=kafka WorkingDirectory=/opt/kafka_2.13-3.7.0 Environment="KAFKA_OPTS=-Djava.security.auth.login.config=/etc/kafka/security/kafka_server_jaas.conf" ExecStart=/opt/kafka_2.13-3.7.0/bin/kafka-server-start.sh /etc/kafka/server.properties Restart=on-failure RestartSec=5 StandardOutput=journal StandardError=journal SyslogIdentifier=kafka [Install] WantedBy=multi-user.target

注意:

  • 所有路径请替换为你实际的 Kafka 安装路径(建议统一放在/opt/kafka)
  • 确保kafka_server_jaas.conf文件权限安全:chmod 600 config/security/kafka_server_jaas.conf,且属主为kafka

三、重载 systemd 并启用服务

# 重载配置sudosystemctl daemon-reload# 启动 Kafkasudosystemctl start kafka# 设置开机自启sudosystemctlenablekafka# 查看状态sudosystemctl status kafka# 查看日志sudojournalctl -u kafka -f

这里停掉之前的Kafka服务,再启动会报错

Dec 16 11:02:15 VM-16-12-centos kafka[28282]: [2025-12-16 11:02:15,524] ERROR Encountered fatal fault: caught exception (org.apache.kafka.server.fault.ProcessTerminatingFaultHandler) Dec 16 11:02:15 VM-16-12-centos kafka[28282]: java.io.IOException: Could not read file /tmp/kraft-combined-logs/__cluster_metadata-0/00000000000000114142-0000000005.checkpoint Dec 16 11:02:15 VM-16-12-centos kafka[28282]: at kafka.log.LogLoader.$anonfun$removeTempFilesAndCollectSwapFiles$2(LogLoader.scala:225) Dec 16 11:02:15 VM-16-12-centos kafka[28282]: at scala.collection.ArrayOps$WithFilter.foreach(ArrayOps.scala:73)

问题:

Kafka 试图从/tmp/kraft-combined-logs/加载元数据,但其中的 checkpoint 文件损坏或无法读取。

默认的数据目录/tmp 是临时目录,系统可能随时清理(尤其重启后)所以这里要做日志文件与数据文件的分离

四、日志文件与数据文件的分离(如果没出问题就选做)

1. 停止服务并清理临时数据

sudo systemctl stop kafka sudo rm -rf /tmp/kraft-combined-logs /tmp/kafka-logs

这会清空所有数据(因之前存在损坏),但这是修复的前提。


2. 创建持久化目录并授权

# 创建用户(如果尚未创建) sudo useradd -r -s /sbin/nologin kafka # 创建数据目录 sudo mkdir -p /var/lib/kafka/data # 创建应用日志目录 sudo mkdir -p /var/log/kafka # 授权给 kafka 用户 sudo chown -R kafka:kafka /var/lib/kafka /var/log/kafka sudo chmod 750 /var/lib/kafka/data sudo chmod 750 /var/log/kafka

3. 迁移并修正配置文件

1. 移动关键配置文件到/etc/kafka/
sudo mkdir -p /etc/kafka/security sudo cp /opt/kafka_2.13-3.7.0/config/kraft/server.properties /etc/kafka/ sudo cp /opt/kafka_2.13-3.7.0/config/security/kafka_server_jaas.conf /etc/kafka/security/ sudo chown -R kafka:kafka /etc/kafka sudo chmod 600 /etc/kafka/security/kafka_server_jaas.conf
2. 编辑/etc/kafka/server.properties
vi /etc/kafka/server.properties

内容如下:

# KRaft 模式 process.roles=broker,controller node.id=1 controller.quorum.voters=1@localhost:9093 # Listener 配置(根据你的网络调整 advertised.listeners) listeners=SASL_PLAINTEXT://:9092,CONTROLLER://:9093 advertised.listeners=SASL_PLAINTEXT://<你的服务器内网IP>:9092 inter.broker.listener.name=SASL_PLAINTEXT controller.listener.names=CONTROLLER # 核心:数据目录(不再是 /tmp!) log.dirs=/var/lib/kafka/data # SASL 认证 sasl.enabled.mechanisms=PLAIN sasl.mechanism.inter.broker.protocol=PLAIN

替换<你的服务器内网IP>为实际 IP(如10.0.16.12),不要用localhost(除非仅本机访问)

如果是跟着前一篇博客搭建的话,可以只修改log.dirs=/var/lib/kafka/data


4. 重新格式化存储(关键)

sudo -u kafka /opt/kafka_2.13-3.7.0/bin/kafka-storage.sh format \ -t $(sudo -u kafka /opt/kafka_2.13-3.7.0/bin/kafka-storage.sh random-uuid) \ -c /etc/kafka/server.properties

成功输出:

Formatting /var/lib/kafka/data with metadata.version 3.7-IV4.

5. 更新 systemd 服务文件

编辑/etc/systemd/system/kafka.service:

vi /etc/systemd/system/kafka.service

内容如下:

[Unit] Description=Apache Kafka Server (KRaft + SASL/PLAIN) After=network.target [Service] Type=simple User=kafka Group=kafka Environment="KAFKA_OPTS=-Djava.security.auth.login.config=/etc/kafka/security/kafka_server_jaas.conf -Dkafka.logs.dir=/var/log/kafka" ExecStart=/opt/kafka_2.13-3.7.0/bin/kafka-server-start.sh /etc/kafka/server.properties Restart=on-failure RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target

重载配置:

sudo systemctl daemon-reload

6. 启动并验证

# 启动 sudo systemctl start kafka # 检查状态 sudo systemctl status kafka # 查看实时日志 sudo journalctl -u kafka -f --since "1 min ago" # 验证数据目录是否生成 ls -l /var/lib/kafka/data/ # 应包含 meta.properties 和 __cluster_metadata-0/ # 验证应用日志 tail -f /var/log/kafka/server.log

成功标志:

[KafkaRaftServer nodeId=1] Kafka Server started (kafka.server.KafkaRaftServer)


总结

项目路径说明
Kafka 数据(Topic + 元数据)/var/lib/kafka/data由log.dirs指定,必须持久化
Kafka 应用日志(server.log)/var/log/kafka/由log4j.properties控制
配置文件/etc/kafka/符合 Linux 规范,便于管理
安装包/opt/kafka_2.13-3.7.0/只读,不存运行时数据

完全分离:数据、日志、配置、程序四者独立,安全、可维护、可备份。


建议(生产环境)

  1. 磁盘挂载:将/var/lib/kafka挂载到独立高性能磁盘(如 SSD)
  2. 日志轮转:配置logrotate管理/var/log/kafka/*.log
  3. 监控:监控/var/lib/kafka/data磁盘使用率
  4. 备份:定期快照/var/lib/kafka/data

五、验证服务是否正常

# 创建测试 topic/opt/kafka_2.13-3.7.0/bin/kafka-topics.sh --create --topic test-systemd\--bootstrap-server localhost:9092 --partitions1--replication-factor1# 列出 topics/opt/kafka_2.13-3.7.0/bin/kafka-topics.sh --list --bootstrap-server localhost:9092

若启用 SASL,需在客户端命令中添加认证参数(或使用配置文件),没有启用则可以直接使用上面的验证命令。

1.客户端创建

1.1. 确认服务端 SASL 用户名和密码

(前面已创建,略过)

用户名(username)密码(password)用途建议
adminStrongPassword123!管理员(全权限)
producerStrongPassword456!仅用于生产消息
consumerStrongPassword789!仅用于消费消息
1.2. 创建客户端 JAAS 配置文件
sudo mkdir -p /etc/kafka/security sudo vi /etc/kafka/security/kafka_admin_client_jaas.conf

这里设置管理员用户的客户端,内容如下:

KafkaClient { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="StrongPassword123!"; };
1.3. 设置权限(仅 kafka 用户可读)
sudo chown kafka:kafka /etc/kafka/security/kafka_admin_client_jaas.conf sudo chmod 600 /etc/kafka/security/kafka_admin_client_jaas.conf
1.4. 创建客户端配置文件
sudo vi /etc/kafka/client.properties

内容如下:

security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN

2.客户端使用

使用认证信息执行命令(通过环境变量指定 JAAS)

# 切换到 kafka 用户(避免权限问题) sudo -u kafka bash # 执行命令(注意路径) # 创建测试 topic KAFKA_OPTS="-Djava.security.auth.login.config=/etc/kafka/security/kafka_admin_client_jaas.conf" \ /opt/kafka_2.13-3.7.0/bin/kafka-topics.sh \ --bootstrap-server localhost:9092 \ --command-config /etc/kafka/client.properties \ --create --topic test-systemd --partitions 1 --replication-factor 1 # 列出 topics KAFKA_OPTS="-Djava.security.auth.login.config=/etc/kafka/security/kafka_admin_client_jaas.conf" \ /opt/kafka_2.13-3.7.0/bin/kafka-topics.sh \ --command-config /etc/kafka/client.properties \ --list --bootstrap-server localhost:9092


六、安全建议(生产环境)

  1. 不要使用 root 运行 Kafka
  2. 限制advertised.listeners为内网 IP 或通过反向代理暴露
  3. SASL/PLAIN 仅用于内网;公网必须配合 SSL(SASL_SSL)
  4. 防火墙限制 9092 端口仅允许可信 IP 访问
  5. 定期备份元数据(KRaft 的 snapshot 和 log 目录)

至此,Kafka 已成功转为systemd 管理的服务模式,具备自动启动、崩溃恢复、集中日志等能力,适合生产部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/25 14:10:33

原神祈愿数据分析完整指南:告别手动记录,精准掌握抽卡概率

作为原神玩家&#xff0c;你是否曾为这些问题困扰&#xff1a;抽卡时记不清离保底还有多少发&#xff1f;想回顾某个五星角色什么时候抽到的&#xff1f;换设备后所有抽卡历史都丢失了&#xff1f;现在&#xff0c;genshin-wish-export工具将彻底解决这些烦恼&#xff0c;让你真…

作者头像 李华
网站建设 2026/10/23 13:27:11

基于Java的超市购物商城采购销存系统41f0q511

目录已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/10/25 0:06:49

写给学弟学妹的编程心语:不是捷径,是心路

写给学弟学妹的编程心语&#xff1a;不是捷径&#xff0c;是心路凌晨三点&#xff0c;屏幕的光还亮着。这是第几次对着一段报错代码陷入沉思&#xff1f;那些看似简单的教程&#xff0c;为什么一到自己手里就变得如此陌生&#xff1f;如果你也曾这样怀疑过自己&#xff0c;请相…

作者头像 李华
网站建设 2026/10/25 8:49:17

01-Ansible 自动化介绍

文章目录 01-Ansible 自动化介绍Ansible 自动化介绍手动执行任务和自动化执行任务基础架构即代码Ansible 与 DevOps什么是 ANSIBLE&#xff1f;Ansible 特点Ansible 概念和架构Ansible WayAnsible 用例 Ansible 部署准备实验环境控制节点受管节点LinuxWindows网络设备网络设备 …

作者头像 李华
网站建设 2026/10/26 7:20:35

窗口置顶神器:如何让重要窗口永远保持在最前端?

窗口置顶神器&#xff1a;如何让重要窗口永远保持在最前端&#xff1f; 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 在日常电脑使用中&#xff0c;你是否经常为了找到被其他窗…

作者头像 李华