目录
- 查看环境,寻找安装包
- 安装和部署
- 一、提前确认
- 二、解压并更名
- 三、建数据 / 日志目录
- 四、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” 区域即可看到任选其一即可下载,例如:- 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 以上
- #输出
- [root@localhost redis6.2.14]# 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)
- [root@localhost redis6.2.14]#
复制代码 二、解压并更名
- 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
复制代码- 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'
复制代码 实际输出结果,终于成功:- [root@localhost ~]# ~/start-kafka.sh
- Zookeeper + 3 brokers started. Logs under /opt/kafka3.3.2/
- [root@localhost ~]# sleep 5 && jps | egrep 'QuorumPeerMain|Kafka'
- 36151 Kafka
- 36152 Kafka
- 36186 Kafka
- 26891 QuorumPeerMain
- 30317 Kafka
- [root@localhost ~]#
- [root@localhost ~]# ss -lntup | grep :9092
- tcp LISTEN 0 50 [::]:9092 [::]:* users:(("java",pid=30317,fd=125))
- [root@localhost ~]# # 会看到 PID 30317
- [root@localhost ~]# kill -9 30317
- [root@localhost ~]# sleep 2 && jps | egrep 'QuorumPeerMain|Kafka'
- 26891 QuorumPeerMain
- [root@localhost ~]# for p in 9191 9192 9193; do echo "== $p =="; ss -lntup | grep ":$p"; done
- == 9191 ==
- == 9192 ==
- == 9193 ==
复制代码- ss -lntup | grep :9092 # 应无结果
复制代码 3、后续不再踩坑的 3 条建议
- 永远先杀干净旧进程再启动新配置。
- 端口批量错开(如 9191/9192/9193),避免手动改漏。
- 日志为空或报错时立即 tail -n 30,定位关键字只用 10 秒。
七、 一键关闭(可选备用脚本)
如果想一次性关闭,再做一个 ~/stop-kafka.sh:
[code]cat > ~/stop-kafka.sh |