centos 8 使用 kafka_2.13-4.3.1.tgz 安装kafka

在 CentOS 8 上安装 Kafka 4.3.1(kafka_2.13-4.3.1.tgz)需要特别注意,因为从 Kafka 3.3.x 开始,官方已逐步弃用 ZooKeeper,并在后续版本中全面转向 ‌**KRaft(Kafka Raft)**‌ 模式。Kafka 4.x 版本默认且推荐以 KRaft 模式运行,不再依赖独立的 ZooKeeper 服务。

以下是基于 CentOS 8 环境的完整安装与配置指南:

1. 环境准备:安装 Java 17

Kafka 4.x 版本要求 ‌Java 17‌ 或更高版本。CentOS 8 默认的 OpenJDK 可能是 1.8 或 11,需升级。

复制代码
# 安装 Java 17
sudo yum install java-17-openjdk java-17-openjdk-devel -y

# 验证版本
java -version
# 应显示 openjdk version "17.0.x"

注意 ‌:若系统存在多个 Java 版本,请确保 JAVA_HOME 环境变量指向 Java 17。

复制代码
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH

2. 下载与解压 Kafka

假设你已将 kafka_2.13-4.3.1.tgz 上传至服务器,或直接从 Apache 镜像站下载。

复制代码
# 创建安装目录
sudo mkdir -p /opt/kafka
cd /opt/kafka

# 解压安装包
sudo tar -xzf kafka_2.13-4.3.1.tgz

# 进入解压后的目录(目录名可能为 kafka_2.13-4.3.1)
cd kafka_2.13-4.3.1

3. 配置 KRaft 模式(无 ZooKeeper)

Kafka 4.3.1 使用 KRaft 模式,需修改配置文件并格式化存储目录。

3.1 生成集群 UUID

每个 Kafka 集群需要一个唯一的 ID。

复制代码
KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
echo $KAFKA_CLUSTER_ID
# 记录此 ID,后续步骤会用到
3.2 修改配置文件

编辑 config/kraft/server.properties(注意:不是 server.properties,而是 kraft/ 子目录下的文件)。

复制代码
vim config/server.properties

关键配置项修改如下:

复制代码
# 节点角色:controller, broker, 或 controller+broker (单机测试建议设为 controller+broker)
process.roles=controller,broker

# 节点 ID,必须唯一,单机可设为 1
node.id=1

# 控制器节点地址,格式为 <node.id>@<host>:<port>
# 如果 process.roles 包含 controller,则必须配置此项
controller.quorum.voters=1@localhost:9093

# 监听器配置
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
inter.broker.listener.name=PLAINTEXT
advertised.listeners=PLAINTEXT://localhost:9092

# 日志存储目录(建议修改为独立数据盘路径,如 /data/kafka-logs)
log.dirs=/tmp/kraft-combined-logs

# 其他可选优化
num.partitions=1
default.replication.factor=1
3.3 格式化存储目录

使用之前生成的 KAFKA_CLUSTER_ID 格式化日志目录。‌此步骤只需执行一次‌。

复制代码
bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/server.properties  --standalone

4. 启动 Kafka

使用 KRaft 模式启动脚本

复制代码
# 前台启动(用于测试,观察日志)
bin/kafka-server-start.sh config/server.properties

# 后台守护进程启动(生产环境推荐)
bin/kafka-server-start.sh -daemon config/server.properties

5. 验证安装

创建测试主题并发送消息,验证 Kafka 是否正常工作。

复制代码
# 1. 创建测试主题
bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

# 2. 列出主题
bin/kafka-topics.sh --list --bootstrap-server localhost:9092

# 3. 启动生产者控制台
bin/kafka-console-producer.sh --topic test-topic --bootstrap-server localhost:9092
# 输入几条测试消息,如:
# Hello Kafka 4.3.1
# Test Message

# 4. 新开终端窗口,启动消费者控制台
bin/kafka-console-consumer.sh --topic test-topic --from-beginning --bootstrap-server localhost:9092
# 应能看到生产者发送的消息

6. 配置 systemd 服务(可选,推荐)

为方便管理,创建 systemd 服务文件。

复制代码
sudo vim /etc/systemd/system/kafka.service

内容如下:

复制代码
[Unit]
Description=Apache Kafka Server (KRaft Mode)
After=network.target

[Service]
Type=simple
User=root
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk"
WorkingDirectory=/opt/kafka/kafka_2.13-4.3.1
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

启用并启动服务:

复制代码
sudo systemctl daemon-reload
sudo systemctl enable kafka
sudo systemctl start kafka
sudo systemctl status kafka

常见问题排查

  1. ‌Java 版本错误 ‌:确保 java -version 输出为 17+,且 JAVA_HOME 正确设置。

  2. ‌端口冲突‌:检查 9092(Broker)和 9093(Controller)端口是否被占用。

  3. ‌权限问题 ‌:确保 log.dirs 指定目录对运行 Kafka 的用户可写。

  4. ‌防火墙 ‌:若需远程访问,开放相应端口:

    复制代码
    复制代码
    sudo firewall-cmd --permanent --add-port=9092/tcp
    sudo firewall-cmd --reload

至此,Kafka 4.3.1 已在 CentOS 8 上以 KRaft 模式成功安装并运行。



如果将 advertised.listeners 配置为 PLAINTEXT://localhost:9092,外部客户端(运行在其他机器上的生产者或消费者)在尝试连接时会失败。

❌ 为什么无法访问?

Kafka 的连接机制分为两步:

  1. ‌初始连接‌:客户端使用你提供的地址(例如 Kafka 服务器的真实 IP)连接到 Broker。
  2. ‌元数据返回 ‌:Broker 接受连接后,会向客户端返回集群的元数据信息,其中包含 advertised.listeners 配置的地址。‌**客户端后续的所有读写操作都会使用这个返回的地址进行通信。**‌

当 advertised.listeners=PLAINTEXT://localhost:9092 时:

  • 外部客户端成功建立初始连接后,Kafka 会告诉客户端:"请通过 localhost:9092 与我通信"。
  • 客户端收到指令后,会尝试连接‌它自己本机 ‌(Client 所在的机器)的 localhost:9092。
  • 由于 Kafka 服务并不运行在客户端机器上,连接必然失败,通常报错为 Connection to node -1 could not be established 或 TimeoutException。

正确配置方案

根据客户端与 Kafka 服务器的网络关系,选择以下一种配置:

场景 1:局域网内访问(推荐)

如果客户端和 Kafka 在同一局域网内,使用 Kafka 服务器的‌内网 IP 地址‌。

复制代码
# 假设 Kafka 服务器内网 IP 为 192.168.1.100
advertised.listeners=PLAINTEXT://192.168.1.100:9092
场景 2:公网/跨网络访问

如果客户端通过公网访问,且服务器有公网 IP(或通过 NAT 映射),使用‌公网 IP 或域名‌。

复制代码
# 假设公网 IP 为 203.0.113.5,或域名为 kafka.example.com
advertised.listeners=PLAINTEXT://203.0.113.5:9092
# 或者
advertised.listeners=PLAINTEXT://kafka.example.com:9092
场景 3:Docker 容器部署

如果 Kafka 运行在 Docker 中,且客户端在宿主机或其他容器:

  • ‌宿主机访问 ‌:使用 host.docker.internal(Docker Desktop)或宿主机的实际 IP。

  • ‌其他容器访问‌:使用 Docker 网络中的服务名或容器 IP。

    docker-compose 示例

    environment:
    KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://host.docker.internal:9092

配套配置检查

修改 advertised.listeners 时,请确保 listeners 配置正确,以便 Kafka 能实际接收请求:

复制代码
# listeners 定义 Kafka 实际监听的网卡接口
# 0.0.0.0 表示监听所有网卡,允许来自任何 IP 的连接请求
listeners=PLAINTEXT://0.0.0.0:9092

# advertised.listeners 定义对外公布的地址
# 必须替换为客户端可访问的真实 IP 或域名
advertised.listeners=PLAINTEXT://<你的服务器IP>:9092

验证方法

  1. 修改配置后重启 Kafka。

  2. 在‌另一台机器 ‌上使用 telnet 或 nc 测试连通性:

    telnet <Kafka服务器IP> 9092

3使用 Kafka 客户端工具(如 kafka-console-producer.sh)指定该 IP 进行测试:

复制代码
bin/kafka-console-producer.sh --bootstrap-server <Kafka服务器IP>:9092 --topic test

如果能正常发送消息,说明配置正确。

相关推荐
luo_guibin1 小时前
Linux系统下OpenSSL升级全流程,新旧版本切换
linux·运维·服务器
看着博客敲代码1 小时前
No space left on device:服务器被 SSH 爆破到日志写满的完整排查与止血
linux·运维·服务器·安全·ssh
明日清晨1 小时前
mobaxterm root身份登录Ubuntu
linux·ubuntu·postgresql
沫璃染墨1 小时前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构
guo_wen_qiang2 小时前
kafka一直restarting,报错InconsistentClusterIdException
分布式·kafka
Allocator2 小时前
彻底解决ubuntu上腾讯会议无法共享问题
linux·ubuntu·腾讯会议
程序员-Benothing2 小时前
Linux编码转换命令:iconv、dos2unix、base64、md5sum
linux·运维·服务器
重生之小比特2 小时前
【Linux系统】06 进程概念
linux
2402_882893863 小时前
Linux 进程概念详解(上)—— 从冯诺依曼体系到僵尸进程与孤儿进程
linux·运维·服务器