言晓莉 发表于 2025-8-13 13:11:54

Kafka2.13-3.3.2 安装部署+最后报错处理全过程(CentOS 7 虚拟机)

目录

[*]查看环境,寻找安装包

[*]官网寻找安装包
[*]版本选择,要求高可用

[*]安装和部署

[*]一、提前确认
[*]二、解压并更名
[*]三、建数据 / 日志目录
[*]四、Zookeeper 单节点配置
[*]五、准备 3 份 broker 配置
[*]六、创建并启动脚本(一次性复制即可用)

[*]① 一键生成启动脚本(包含全部内容)
[*]② 赋可执行权限
[*]③ 运行脚本
[*]④ 验证是否都起来了

[*]

[*]有偏差:你只看到 1 个 Kafka 进程,说明 3 个 broker 并没有全部成功启动(后面有我的解决和修改过程可以直接跳过,你也可以在这里逐步排查,可能问题不一样)


[*]下面是我的解决过程梳理和总结

[*]1、完整报错链路(按时间线)
[*]2、修复步骤(复制即用)
[*]3、后续不再踩坑的 3 条建议


[*]七、 一键关闭(可选备用脚本)
[*]八、开机自启(可选)

[*]① 创建 systemd 服务文件
[*]② 创建对应的 stop 脚本(如果还没有)
[*]③ 重载并设为开机自启
[*]④ 验证
[*]⑤慎重验证
[*]这里我报错:

[*]快速修复:

[*]

[*]① 第一次现象:只有 1 个 Kafka
[*]② 立即查看 3 份日志尾
[*]③ 前台启动 2 号 broker,现场报错
[*]④ 确认 9092 被谁占用
[*]⑤杀掉旧进程 & 清理锁文件
[*]⑥ 把 3 份配置端口改成不冲突的 9191/9192/9193
[*]⑦ 写死 JAVA_HOME 到所有 systemd 单元
[*]⑧ 一键创建 4 个独立 systemd 单元(复制即用)

[*]8.1 Zookeeper
[*]8.2 3 个 Kafka broker

[*]⑨ 重载 & 自启
[*]⑩ 最终验证

[*]最后这里成功!!!

[*]⑪ 重启整机测试(可选)




查看环境,寻找安装包

官网寻找安装包


[*]打开官方“存档”页面
3.3 系列已从首页的 Supported 区域下架,进入了 Archived releases。
直接访问:https://kafka.apache.org/downloads
在页面最下方 “Archived releases” 区域即可看到
3.3.2
3.3.1
3.3.0任选其一即可下载,例如:
kafka_2.13-3.3.2.tgz(asc, sha512)
[*]校验文件(官方唯一验证方法)
① 下载同名的 .sha512 文件
wget https://archive.apache.org/dist/kafka/3.3.2/kafka_2.13-3.3.2.tgz.sha512② Linux/Mac 终端执行
sha512sum -c kafka_2.13-3.3.2.tgz.sha512输出 OK 即通过验证。
附:官方 3.3 文档固定入口
https://kafka.apache.org/33/documentation.html
版本选择,要求高可用

一句话结论
只用 3.3.2(Scala 2.13 版),不要再纠结 3.3.0/3.3.1;单机 CentOS 7 也能跑“伪分布式三副本”,只是三副本≠高可用——一台虚拟机挂了所有副本一起挂。下面给你完整可落地的“单机 3.3.2 三副本”步骤,先跑通,再考虑以后多机扩展。
一、3.3.2 为什么更合适

[*]3.3.2 是 3.3 线的最后一个补丁版,修掉 20 个 bug(含潜在数据丢失/稳定性问题)。
[*]Scala 2.13 比 2.12 体积小一点点,官方也写 “建议使用 2.13”。
[*]以后真要扩容到多机,同一版本直接复制配置即可,避免混版本。
二、CentOS 7 单机跑“伪分布式 3 副本”思路

[*]用同一台机器开 3 个 Kafka 进程,每个进程一个 broker.id 和独立端口/目录,Zookeeper 仍用同一实例。
[*]只能验证功能/调试用,真正高可用必须 ≥3 台物理机。
三、10 分钟落地步骤

[*]前置依赖
sudo yum install -y java-11-openjdk-devel wget
java -version   # 确认 11+
[*]目录规划
sudo mkdir -p /opt/kafka-cluster
cd /opt/kafka-cluster
[*]下载并解压 3.3.2
wget https://archive.apache.org/dist/kafka/3.3.2/kafka_2.13-3.3.2.tgz
tar -xzf kafka_2.13-3.3.2.tgz
mv kafka_2.13-3.3.2 kafka
# 建 3 份配置
cp -r kafka kafka-1 kafka-2 kafka-3
[*]起 Zookeeper(单节点)
# 用自带脚本即可
nohup kafka/bin/zookeeper-server-start.sh kafka/config/zookeeper.properties > zk.log 2>&1 &
[*]为 3 个 broker 准备配置文件
把下面三段分别写进 kafka-1/config/server.properties、kafka-2/config/server.properties、kafka-3/config/server.properties,只改差异项:
配置项broker 1broker 2broker 3broker.id123listenersPLAINTEXT://:9092PLAINTEXT://:9093PLAINTEXT://:9094log.dirs/tmp/kafka-logs-1/tmp/kafka-logs-2/tmp/kafka-logs-3zookeeper.connectlocalhost:2181localhost:2181localhost:2181其余保持默认即可。
[*]启动 3 个 broker
nohup kafka-1/bin/kafka-server-start.sh kafka-1/config/server.properties > k1.log 2>&1 &
nohup kafka-2/bin/kafka-server-start.sh kafka-2/config/server.properties > k2.log 2>&1 &
nohup kafka-3/bin/kafka-server-start.sh kafka-3/config/server.properties > k3.log 2>&1 &
[*]验证 3 副本 topic
# 建 topic,3 副本 3 分区
kafka/bin/kafka-topics.sh --create --topic test-ha \
--bootstrap-server localhost:9092 \
--partitions 3 --replication-factor 3

# 查看分区分布
kafka/bin/kafka-topics.sh --describe --topic test-ha --bootstrap-server localhost:9092应当看到每个分区都有 Leader, Replicas: 1,2,3, Isr: 1,2,3。
[*]简单生产/消费测试
# 生产
kafka/bin/kafka-console-producer.sh --topic test-ha --bootstrap-server localhost:9092
# 消费
kafka/bin/kafka-console-consumer.sh --topic test-ha --bootstrap-server localhost:9092 --from-beginning
四、单机“三副本”的局限

[*]高可用:❌ 一台机器挂了,三个进程一起死。
[*]功能验证:✅ 可以跑通多副本、Leader 切换、ISR 列表变化。
[*]后续扩容:把配置里的 listeners 改成各自主机名/IP,log.dirs 换成独立磁盘即可。
一句话总结
下载 kafka_2.13-3.3.2.tgz,单机起 3 个 broker 就能跑 3 副本测试;真正高可用还需再加两台机器。
注:/usr/local 是给“本地手工编译”或“包管理器之外的系统级软件”留的;Kafka 官方只提供二进制压缩包,解压即用,既不属于系统自带,也不走 make install,所以社区习惯放到 /opt(专门放大型第三方独立软件),避免日后系统升级或包管理器误碰。
安装和部署

下面给你一份面向 CentOS 7、虚拟机单机的“一行不落”复制粘贴教程。
目标目录:/opt/kafka3.3.2
源包路径:/root/kafka_2.13-3.3.2.tgz
一、提前确认

java -version   # 需 11 以上

#输出
# java -version
java version "17.0.15" 2025-04-15 LTS
Java(TM) SE Runtime Environment (build 17.0.15+9-LTS-241)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.15+9-LTS-241, mixed mode, sharing)
#二、解压并更名

sudo mkdir -p /opt/kafka3.3.2
sudo tar -xzf /root/kafka_2.13-3.3.2.tgz -C /opt/kafka3.3.2 --strip-components=1解压后目录结构应为:
/opt/kafka3.3.2/bin
/opt/kafka3.3.2/config

三、建数据 / 日志目录

sudo mkdir -p /opt/kafka3.3.2/data/zookeeper
sudo mkdir -p /opt/kafka3.3.2/data/kafka-logs-1 \
               /opt/kafka3.3.2/data/kafka-logs-2 \
               /opt/kafka3.3.2/data/kafka-logs-3
sudo chown -R $USER:$USER /opt/kafka3.3.2四、Zookeeper 单节点配置

cp /opt/kafka3.3.2/config/zookeeper.properties /opt/kafka3.3.2/config/zookeeper.properties.bak编辑 /opt/kafka3.3.2/config/zookeeper.properties 只改两项(其余默认):
dataDir=/opt/kafka3.3.2/data/zookeeper
clientPort=2181五、准备 3 份 broker 配置

for i in 1 2 3; do
cp /opt/kafka3.3.2/config/server.properties /opt/kafka3.3.2/config/server-$i.properties
done分别编辑 3 个文件,只改以下 4 行(操作在之后代码块):
文件broker.idlistenerslog.dirsadvertised.listenersserver-1.properties1PLAINTEXT://:9092/opt/kafka3.3.2/data/kafka-logs-1PLAINTEXT://localhost:9092server-2.properties2PLAINTEXT://:9093/opt/kafka3.3.2/data/kafka-logs-2PLAINTEXT://localhost:9093server-3.properties3PLAINTEXT://:9094/opt/kafka3.3.2/data/kafka-logs-3PLAINTEXT://localhost:9094其余保持默认(尤其 zookeeper.connect=localhost:2181)。
不需要手动打开图形编辑器。
用一条 sed 或 echo 命令就能一次改好,下面给出复制即用的三行脚本,把 4 个关键配置一次性写入对应文件:
下面给出一次可直接复制/粘贴的 修正版脚本,并逐条指出与旧脚本的区别。
可直接执行的脚本(已修复换行/引号问题)
# 1 号 broker
sed -ri \
-e 's/^broker.id=.*/broker.id=1/' \
-e 's|^listeners[[:space:]]*=.*|listeners=PLAINTEXT://:9092|' \
-e 's|^log.dirs[[:space:]]*=.*|log.dirs=/opt/kafka3.3.2/data/kafka-logs-1|' \
-e 's|^#?advertised.listeners[[:space:]]*=.*|advertised.listeners=PLAINTEXT://localhost:9092|' \
/opt/kafka3.3.2/config/server-1.properties

# 2 号 broker
sed -ri \
-e 's/^broker.id=.*/broker.id=2/' \
-e 's|^listeners[[:space:]]*=.*|listeners=PLAINTEXT://:9093|' \
-e 's|^log.dirs[[:space:]]*=.*|log.dirs=/opt/kafka3.3.2/data/kafka-logs-2|' \
-e 's|^#?advertised.listeners[[:space:]]*=.*|advertised.listeners=PLAINTEXT://localhost:9093|' \
/opt/kafka3.3.2/config/server-2.properties

# 3 号 broker
sed -ri \
-e 's/^broker.id=.*/broker.id=3/' \
-e 's|^listeners[[:space:]]*=.*|listeners=PLAINTEXT://:9094|' \
-e 's|^log.dirs[[:space:]]*=.*|log.dirs=/opt/kafka3.3.2/data/kafka-logs-3|' \
-e 's|^#?advertised.listeners[[:space:]]*=.*|advertised.listeners=PLAINTEXT://localhost:9094|' \
/opt/kafka3.3.2/config/server-3.properties与旧脚本的区别逐条说明(注意之前的报错,因为出现转义字符的问题,上面代码已经修改过。)
序号旧问题修正做法说明1单引号里跨行反斜杠续行直接拆成 多段 -e 表达式避免 sed 报 “未终止的正则”2分隔符 / 与路径 /opt/... 冲突统一用 `` 作分隔符3正则 ^listeners=.* 可能匹配不到空格写成 ^listeners[[:space:]]*=兼容 key=value 或 key = value4只处理 #advertised.listeners 的注释行改成 #?同时匹配已取消注释或仍注释的行5无 -r 扩展正则加 -r(GNU sed)让 ?、`把上面脚本一次性粘进终端即可,无需再手工编辑。
执行完后,三份配置就全部改好,无需再打开任何编辑器。
六、创建并启动脚本(一次性复制即可用)

​        下面给你一条命令一条命令的「复制-粘贴」版完整步骤,连脚本内容都帮你一次性生成,不用手写,跟着敲即可。
① 一键生成启动脚本(包含全部内容)

cat > ~/start-kafka.sh <<'EOF'#这一步直接是创建脚本,就是把下面的代码保存成脚本'~/start-kafka.sh'
#!/bin/bash
# 启动 Zookeeper
nohup /opt/kafka3.3.2/bin/zookeeper-server-start.sh \
-daemon /opt/kafka3.3.2/config/zookeeper.properties \
> /opt/kafka3.3.2/zk.log 2>&1 &

sleep 5   # 等 Zookeeper 完全起来

# 启动 3 个 broker
for i in 1 2 3; do
nohup /opt/kafka3.3.2/bin/kafka-server-start.sh \
    -daemon /opt/kafka3.3.2/config/server-$i.properties \
    > /opt/kafka3.3.2/broker-$i.log 2>&1 &
done

echo "Zookeeper + 3 brokers started. Logs under /opt/kafka3.3.2/"
EOF② 赋可执行权限

chmod +x ~/start-kafka.sh③ 运行脚本

~/start-kafka.sh

#运行结果
Zookeeper + 3 brokers started. Logs under /opt/kafka3.3.2/#④ 验证是否都起来了

jps | egrep 'QuorumPeerMain|Kafka'应看到 1 个 QuorumPeerMain(Zookeeper)+ 3 个 Kafka 进程。
#运行结果(有偏差)
27940 Kafka
26891 QuorumPeerMain有偏差:你只看到 1 个 Kafka 进程,说明 3 个 broker 并没有全部成功启动(后面有我的解决和修改过程可以直接跳过,你也可以在这里逐步排查,可能问题不一样)

你只看到 1 个 Kafka 进程,说明 3 个 broker 并没有全部成功启动。
按下面 3 步排查并一次性修复:

[*]立即查日志定位原因,然后这里我的是空目录
# 看看每个 broker 日志末尾 20 行
tail -n 20 /opt/kafka3.3.2/broker-*.log常见报错:端口被占用、目录权限不足、log.dirs 不存在、JMX 端口冲突等。

[*]一键补齐缺失目录 & 权限
mkdir -p /opt/kafka3.3.2/data/{kafka-logs-1,kafka-logs-2,kafka-logs-3}
chown -R $(whoami):$(whoami) /opt/kafka3.3.2
[*]先停后启(干净重启)
# 如果还有残存进程
pkill -f 'kafka\.Kafka'    # 杀 Kafka
pkill -f QuorumPeerMain    # 杀 Zookeeper

# 重新启动
~/start-kafka.sh

# 再验证
sleep 5
jps | egrep 'QuorumPeerMain|Kafka'正常应看到 1 个 QuorumPeerMain + 3 个 Kafka。
如果日志里出现 “Address already in use”
说明 9092/9093/9094 端口被系统占用,改脚本里的端口即可;
如果日志里出现 “No space left on device” 或 权限 denied,就回到第 2 步继续修正目录/权限。
下面是我的解决过程梳理和总结

【一句话总结错误原因】
“9092 被旧 broker 死死占着,导致 2、3 号 broker 起不来;把旧进程杀掉、把 3 台 broker 端口一次性改成 9191/9192/9193,再清掉 .lock 文件,就彻底 OK。”
1、完整报错链路(按时间线)

时间现象根因日志关键行T0jps 只有 1 个 Kafka2、3 号没起来—T1broker-2.log 报错端口 9092 被占用Socket server failed to bind to 0.0.0.0:9092: 地址已在使用T2ls -l /opt/kafka3.3.2/data 目录缺log.dirs 没提前建—T3.lock 已存在旧进程没停干净Failed to acquire lock on file .lock2、修复步骤(复制即用)


[*]杀干净所有残留进程
pkill -9 -f 'kafka\.Kafka'
pkill -f QuorumPeerMain
[*]一次性建目录 + 删 .lock
mkdir -p /opt/kafka3.3.2/data/{kafka-logs-1,kafka-logs-2,kafka-logs-3}
chown -R $(whoami):$(whoami) /opt/kafka3.3.2/datafor i in 1 2 3; do rm -f /opt/kafka3.3.2/data/kafka-logs-$i/.lock; done
[*]把 3 份配置端口全部改成 9191/9192/9193
for i in 1 2 3; do
port=$((9190+i))
cfg="/opt/kafka3.3.2/config/server-$i.properties"
sed -ri \
    -e "s#^listeners[[:space:]]*=.*#listeners=PLAINTEXT://:${port}#" \
    -e "s#^advertised.listeners[[:space:]]*=.*#advertised.listeners=PLAINTEXT://localhost:${port}#" \
    -e "s#^broker.id[[:space:]]*=.*#broker.id=$i#" \
    "$cfg"
done
[*]启动并验证
~/start-kafka.sh
sleep 5 && jps | egrep 'QuorumPeerMain|Kafka'实际输出结果,终于成功:
# ~/start-kafka.sh

Zookeeper + 3 brokers started. Logs under /opt/kafka3.3.2/
# sleep 5 && jps | egrep 'QuorumPeerMain|Kafka'

36151 Kafka
36152 Kafka
36186 Kafka
26891 QuorumPeerMain
30317 Kafka
#
# ss -lntup | grep :9092
tcp    LISTEN   0      50   [::]:9092               [::]:*                   users:(("java",pid=30317,fd=125))
# # 会看到 PID 30317
# kill -9 30317
# sleep 2 && jps | egrep 'QuorumPeerMain|Kafka'
26891 QuorumPeerMain
# for p in 9191 9192 9193; do echo "== $p =="; ss -lntup | grep ":$p"; done
== 9191 ==
== 9192 ==
== 9193 ==
[*]确认 9092 已释放
ss -lntup | grep :9092   # 应无结果3、后续不再踩坑的 3 条建议


[*]永远先杀干净旧进程再启动新配置。
[*]端口批量错开(如 9191/9192/9193),避免手动改漏。
[*]日志为空或报错时立即 tail -n 30,定位关键字只用 10 秒。
七、 一键关闭(可选备用脚本)

如果想一次性关闭,再做一个 ~/stop-kafka.sh:
cat > ~/stop-kafka.sh
页: [1]
查看完整版本: Kafka2.13-3.3.2 安装部署+最后报错处理全过程(CentOS 7 虚拟机)