在 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
常见问题排查
-
Java 版本错误 :确保
java -version输出为 17+,且JAVA_HOME正确设置。 -
端口冲突:检查 9092(Broker)和 9093(Controller)端口是否被占用。
-
权限问题 :确保
log.dirs指定目录对运行 Kafka 的用户可写。 -
防火墙 :若需远程访问,开放相应端口:
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 的连接机制分为两步:
- 初始连接:客户端使用你提供的地址(例如 Kafka 服务器的真实 IP)连接到 Broker。
- 元数据返回 :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
验证方法
-
修改配置后重启 Kafka。
-
在另一台机器 上使用
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
如果能正常发送消息,说明配置正确。