找回密码
 立即注册
首页 业界区 业界 Kafka2.13-3.3.2 安装部署+最后报错处理全过程(CentOS ...

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

言晓莉 2025-8-13 13:11:54
目录

  • 查看环境,寻找安装包

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

  • 安装和部署

    • 一、提前确认
    • 二、解压并更名
    • 三、建数据 / 日志目录
    • 四、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” 区域即可看到
    1. 3.3.2
    2. 3.3.1
    3. 3.3.0
    复制代码
    任选其一即可下载,例如:
    1. kafka_2.13-3.3.2.tgz  (asc, sha512)
    复制代码
  • 校验文件(官方唯一验证方法)
    ① 下载同名的 .sha512 文件
    1. wget https://archive.apache.org/dist/kafka/3.3.2/kafka_2.13-3.3.2.tgz.sha512
    复制代码
    ② Linux/Mac 终端执行
    1. 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 分钟落地步骤

  • 前置依赖
    1. sudo yum install -y java-11-openjdk-devel wget
    2. java -version   # 确认 11+
    复制代码
  • 目录规划
    1. sudo mkdir -p /opt/kafka-cluster
    2. cd /opt/kafka-cluster
    复制代码
  • 下载并解压 3.3.2
    1. wget https://archive.apache.org/dist/kafka/3.3.2/kafka_2.13-3.3.2.tgz
    2. tar -xzf kafka_2.13-3.3.2.tgz
    3. mv kafka_2.13-3.3.2 kafka
    4. # 建 3 份配置
    5. cp -r kafka kafka-1 kafka-2 kafka-3
    复制代码
  • 起 Zookeeper(单节点)
    1. # 用自带脚本即可
    2. 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
    1. nohup kafka-1/bin/kafka-server-start.sh kafka-1/config/server.properties > k1.log 2>&1 &
    2. nohup kafka-2/bin/kafka-server-start.sh kafka-2/config/server.properties > k2.log 2>&1 &
    3. nohup kafka-3/bin/kafka-server-start.sh kafka-3/config/server.properties > k3.log 2>&1 &
    复制代码
  • 验证 3 副本 topic
    1. # 建 topic,3 副本 3 分区
    2. kafka/bin/kafka-topics.sh --create --topic test-ha \
    3.   --bootstrap-server localhost:9092 \
    4.   --partitions 3 --replication-factor 3
    5. # 查看分区分布
    6. kafka/bin/kafka-topics.sh --describe --topic test-ha --bootstrap-server localhost:9092
    复制代码
    应当看到每个分区都有 Leader, Replicas: 1,2,3, Isr: 1,2,3。
  • 简单生产/消费测试
    1. # 生产
    2. kafka/bin/kafka-console-producer.sh --topic test-ha --bootstrap-server localhost:9092
    3. # 消费
    4. 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
一、提前确认
  1. java -version   # 需 11 以上
  2. #输出
  3. [root@localhost redis6.2.14]# java -version
  4. java version "17.0.15" 2025-04-15 LTS
  5. Java(TM) SE Runtime Environment (build 17.0.15+9-LTS-241)
  6. Java HotSpot(TM) 64-Bit Server VM (build 17.0.15+9-LTS-241, mixed mode, sharing)
  7. [root@localhost redis6.2.14]#
复制代码
二、解压并更名
  1. sudo mkdir -p /opt/kafka3.3.2
  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

三、建数据 / 日志目录
  1. sudo mkdir -p /opt/kafka3.3.2/data/zookeeper
  2. sudo mkdir -p /opt/kafka3.3.2/data/kafka-logs-1 \
  3.                /opt/kafka3.3.2/data/kafka-logs-2 \
  4.                /opt/kafka3.3.2/data/kafka-logs-3
  5. sudo chown -R $USER:$USER /opt/kafka3.3.2
复制代码
四、Zookeeper 单节点配置
  1. cp /opt/kafka3.3.2/config/zookeeper.properties /opt/kafka3.3.2/config/zookeeper.properties.bak
复制代码
编辑 /opt/kafka3.3.2/config/zookeeper.properties 只改两项(其余默认):
  1. dataDir=/opt/kafka3.3.2/data/zookeeper
  2. clientPort=2181
复制代码
五、准备 3 份 broker 配置
  1. for i in 1 2 3; do
  2.   cp /opt/kafka3.3.2/config/server.properties /opt/kafka3.3.2/config/server-$i.properties
  3. 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. # 1 号 broker
  2. sed -ri \
  3.   -e 's/^broker.id=.*/broker.id=1/' \
  4.   -e 's|^listeners[[:space:]]*=.*|listeners=PLAINTEXT://:9092|' \
  5.   -e 's|^log.dirs[[:space:]]*=.*|log.dirs=/opt/kafka3.3.2/data/kafka-logs-1|' \
  6.   -e 's|^#?advertised.listeners[[:space:]]*=.*|advertised.listeners=PLAINTEXT://localhost:9092|' \
  7.   /opt/kafka3.3.2/config/server-1.properties
  8. # 2 号 broker
  9. sed -ri \
  10.   -e 's/^broker.id=.*/broker.id=2/' \
  11.   -e 's|^listeners[[:space:]]*=.*|listeners=PLAINTEXT://:9093|' \
  12.   -e 's|^log.dirs[[:space:]]*=.*|log.dirs=/opt/kafka3.3.2/data/kafka-logs-2|' \
  13.   -e 's|^#?advertised.listeners[[:space:]]*=.*|advertised.listeners=PLAINTEXT://localhost:9093|' \
  14.   /opt/kafka3.3.2/config/server-2.properties
  15. # 3 号 broker
  16. sed -ri \
  17.   -e 's/^broker.id=.*/broker.id=3/' \
  18.   -e 's|^listeners[[:space:]]*=.*|listeners=PLAINTEXT://:9094|' \
  19.   -e 's|^log.dirs[[:space:]]*=.*|log.dirs=/opt/kafka3.3.2/data/kafka-logs-3|' \
  20.   -e 's|^#?advertised.listeners[[:space:]]*=.*|advertised.listeners=PLAINTEXT://localhost:9094|' \
  21.   /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)让 ?、`把上面脚本一次性粘进终端即可,无需再手工编辑。
执行完后,三份配置就全部改好,无需再打开任何编辑器。
六、创建并启动脚本(一次性复制即可用)

​        下面给你一条命令一条命令的「复制-粘贴」版完整步骤,连脚本内容都帮你一次性生成,不用手写,跟着敲即可。
① 一键生成启动脚本(包含全部内容)
  1. cat > ~/start-kafka.sh <<'EOF'  #这一步直接是创建脚本,就是把下面的代码保存成脚本'~/start-kafka.sh'
  2. #!/bin/bash
  3. # 启动 Zookeeper
  4. nohup /opt/kafka3.3.2/bin/zookeeper-server-start.sh \
  5.   -daemon /opt/kafka3.3.2/config/zookeeper.properties \
  6.   > /opt/kafka3.3.2/zk.log 2>&1 &
  7. sleep 5   # 等 Zookeeper 完全起来
  8. # 启动 3 个 broker
  9. for i in 1 2 3; do
  10.   nohup /opt/kafka3.3.2/bin/kafka-server-start.sh \
  11.     -daemon /opt/kafka3.3.2/config/server-$i.properties \
  12.     > /opt/kafka3.3.2/broker-$i.log 2>&1 &
  13. done
  14. echo "Zookeeper + 3 brokers started. Logs under /opt/kafka3.3.2/"
  15. EOF
复制代码
② 赋可执行权限
  1. chmod +x ~/start-kafka.sh
复制代码
③ 运行脚本
  1. ~/start-kafka.sh
  2. #运行结果
  3. Zookeeper + 3 brokers started. Logs under /opt/kafka3.3.2/#
复制代码
④ 验证是否都起来了
  1. jps | egrep 'QuorumPeerMain|Kafka'
复制代码
应看到 1 个 QuorumPeerMain(Zookeeper)+ 3 个 Kafka 进程。
  1. #运行结果(有偏差)
  2. 27940 Kafka
  3. 26891 QuorumPeerMain
复制代码
有偏差:你只看到 1 个 Kafka 进程,说明 3 个 broker 并没有全部成功启动(后面有我的解决和修改过程可以直接跳过,你也可以在这里逐步排查,可能问题不一样)

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

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

  • 一键补齐缺失目录 & 权限
  1. mkdir -p /opt/kafka3.3.2/data/{kafka-logs-1,kafka-logs-2,kafka-logs-3}
  2. chown -R $(whoami):$(whoami) /opt/kafka3.3.2
复制代码

  • 先停后启(干净重启)
  1. # 如果还有残存进程
  2. pkill -f 'kafka\.Kafka'    # 杀 Kafka
  3. pkill -f QuorumPeerMain    # 杀 Zookeeper
  4. # 重新启动
  5. ~/start-kafka.sh
  6. # 再验证
  7. sleep 5
  8. 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、修复步骤(复制即用)


  • 杀干净所有残留进程
  1. pkill -9 -f 'kafka\.Kafka'
  2. pkill -f QuorumPeerMain
复制代码

  • 一次性建目录 + 删 .lock
  1. mkdir -p /opt/kafka3.3.2/data/{kafka-logs-1,kafka-logs-2,kafka-logs-3}
  2. 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
  1. for i in 1 2 3; do
  2.   port=$((9190+i))
  3.   cfg="/opt/kafka3.3.2/config/server-$i.properties"
  4.   sed -ri \
  5.     -e "s#^listeners[[:space:]]*=.*#listeners=PLAINTEXT://:${port}#" \
  6.     -e "s#^advertised.listeners[[:space:]]*=.*#advertised.listeners=PLAINTEXT://localhost:${port}#" \
  7.     -e "s#^broker.id[[:space:]]*=.*#broker.id=$i#" \
  8.     "$cfg"
  9. done
复制代码

  • 启动并验证
  1. ~/start-kafka.sh
  2. sleep 5 && jps | egrep 'QuorumPeerMain|Kafka'
复制代码
实际输出结果,终于成功:
  1. [root@localhost ~]# ~/start-kafka.sh
  2. Zookeeper + 3 brokers started. Logs under /opt/kafka3.3.2/
  3. [root@localhost ~]# sleep 5 && jps | egrep 'QuorumPeerMain|Kafka'
  4. 36151 Kafka
  5. 36152 Kafka
  6. 36186 Kafka
  7. 26891 QuorumPeerMain
  8. 30317 Kafka
  9. [root@localhost ~]#
  10. [root@localhost ~]# ss -lntup | grep :9092
  11. tcp    LISTEN     0      50     [::]:9092               [::]:*                   users:(("java",pid=30317,fd=125))
  12. [root@localhost ~]# # 会看到 PID 30317
  13. [root@localhost ~]# kill -9 30317
  14. [root@localhost ~]# sleep 2 && jps | egrep 'QuorumPeerMain|Kafka'
  15. 26891 QuorumPeerMain
  16. [root@localhost ~]# for p in 9191 9192 9193; do echo "== $p =="; ss -lntup | grep ":$p"; done
  17. == 9191 ==
  18. == 9192 ==
  19. == 9193 ==
复制代码

  • 确认 9092 已释放
  1. ss -lntup | grep :9092   # 应无结果
复制代码
3、后续不再踩坑的 3 条建议


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

如果想一次性关闭,再做一个 ~/stop-kafka.sh:
[code]cat > ~/stop-kafka.sh
您需要登录后才可以回帖 登录 | 立即注册