环境准备:Linux 基础环境配置、JDK 安装、ZooKeeper 集群搭建、Kafka 二进制包下载与解压
说实话,搭建数据平台这件事,很多人一上来就急着装 Kafka。我见过不少团队,Kafka 装好了,跑了两天挂了,查了半天发现是 JDK 版本不对,或者 ZooKeeper 集群没配好。嗯,基础打不牢,后面全是坑。
这一章,咱们就把地基夯实。我会带着你一步步搞定 Linux 环境、JDK、ZooKeeper 集群,最后把 Kafka 的二进制包准备好。别急,每一步我都会告诉你为什么这么做,以及我踩过的坑。
本章核心目标:搭建一个可运行的 Kafka 实验环境。你不需要生产级的高可用,但必须保证所有组件能正常启动、互相通信。
2.1 Linux 基础环境配置
我习惯用 CentOS 7.9 或者 Ubuntu 20.04。如果你用别的发行版,差别不大,就是包管理命令不一样。这里我以 CentOS 7.9 为例。
2.1.1 关闭防火墙(实验环境)
生产环境当然不能关防火墙,但咱们现在只是搭实验环境。你想想看,如果防火墙没关,Kafka 连不上 ZooKeeper,你排查半天还以为是配置写错了,多冤。
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 查看状态
systemctl status firewalld
注意:这只是实验环境操作。生产环境请按安全规范配置防火墙规则,只开放必要端口。
2.1.2 配置主机名与 hosts
集群环境里,主机名解析特别重要。我曾经遇到过因为 /etc/hosts 没配好,ZooKeeper 集群互相找不到对方,折腾了大半天。
# 修改主机名
hostnamectl set-hostname kafka-node1
# 配置 hosts 文件
cat >> /etc/hosts << EOF
192.168.1.101 kafka-node1
192.168.1.102 kafka-node2
192.168.1.103 kafka-node3
EOF
2.1.3 创建专用用户
我个人习惯不用 root 跑服务。创建一个 kafka 用户,权限隔离,安全又干净。
useradd kafka
passwd kafka
# 或者直接设置无密码登录(实验环境)
echo "kafka ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
2.2 JDK 安装
Kafka 是 Java 写的,所以 JDK 是必须的。版本方面,Kafka 3.x 要求 JDK 11 以上。我推荐用 JDK 17,稳定且长期支持。
2.2.1 下载与安装
别用 yum 装 OpenJDK,版本太老。去 Oracle 官网或者用 Adoptium 的包,干净利落。
# 下载 JDK 17(以 tar.gz 为例)
wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.9_9.tar.gz
# 解压到 /usr/local
tar -zxvf OpenJDK17U-jdk_x64_linux_hotspot_17.0.9_9.tar.gz -C /usr/local/
mv /usr/local/jdk-17.0.9+9 /usr/local/jdk17
2.2.2 配置环境变量
cat >> /etc/profile << 'EOF'
export JAVA_HOME=/usr/local/jdk17
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
EOF
source /etc/profile
java -version
看到类似 openjdk version "17.0.9" 的输出,就说明装好了。
小技巧:配置完环境变量后,最好用 echo $JAVA_HOME 确认一下。我遇到过 source 没生效的情况,重启终端或者重新登录就好了。
2.3 ZooKeeper 集群搭建
Kafka 从 2.8 版本开始可以脱离 ZooKeeper 运行(KRaft 模式),但 3.x 版本依然支持 ZooKeeper 模式。我个人建议初学者还是从 ZooKeeper 模式入手,理解架构更透彻。
2.3.1 集群规划
ZooKeeper 集群推荐奇数台节点,最少 3 台。为什么?因为选举需要半数以上节点存活。3 台挂 1 台还能跑,2 台挂 1 台就废了。
| 节点 | IP 地址 | 角色 | myid |
|---|---|---|---|
| kafka-node1 | 192.168.1.101 | Leader/Follower | 1 |
| kafka-node2 | 192.168.1.102 | Follower | 2 |
| kafka-node3 | 192.168.1.103 | Follower | 3 |
2.3.2 下载与配置
# 下载 ZooKeeper(以 3.8.3 为例)
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.3/apache-zookeeper-3.8.3-bin.tar.gz
tar -zxvf apache-zookeeper-3.8.3-bin.tar.gz -C /usr/local/
mv /usr/local/apache-zookeeper-3.8.3-bin /usr/local/zookeeper
# 创建数据目录
mkdir -p /data/zookeeper
# 配置 zoo.cfg
cat > /usr/local/zookeeper/conf/zoo.cfg << 'EOF'
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
server.1=kafka-node1:2888:3888
server.2=kafka-node2:2888:3888
server.3=kafka-node3:2888:3888
EOF
这里解释一下三个端口:2181 是客户端连接端口,2888 是集群内部通信端口,3888 是选举端口。别搞混了。
2.3.3 设置 myid
每个节点都要有一个唯一的 myid 文件,内容就是上面表格里的数字。
# 在 kafka-node1 上
echo "1" > /data/zookeeper/myid
# 在 kafka-node2 上
echo "2" > /data/zookeeper/myid
# 在 kafka-node3 上
echo "3" > /data/zookeeper/myid
踩坑提醒:myid 文件不能有空格,不能有换行符以外的字符。我曾经手抖加了个空格,ZooKeeper 启动后一直报错,查了半天才发现。
2.3.4 启动与验证
# 启动 ZooKeeper(三台节点都要执行)
/usr/local/zookeeper/bin/zkServer.sh start
# 查看状态
/usr/local/zookeeper/bin/zkServer.sh status
# 用客户端连接测试
/usr/local/zookeeper/bin/zkCli.sh -server kafka-node1:2181
如果看到 Mode: leader 或 Mode: follower,就说明集群搭好了。
2.4 Kafka 二进制包下载与解压
终于到 Kafka 了。别急,咱们只是下载和解压,先别启动。
2.4.1 选择版本
Kafka 版本号里有个 Scala 版本后缀,比如 kafka_2.13-3.5.1.tgz。2.13 是编译 Kafka 用的 Scala 版本,跟你没关系,选最新的稳定版就行。
# 下载 Kafka 3.5.1
wget https://archive.apache.org/dist/kafka/3.5.1/kafka_2.13-3.5.1.tgz
# 解压
tar -zxvf kafka_2.13-3.5.1.tgz -C /usr/local/
mv /usr/local/kafka_2.13-3.5.1 /usr/local/kafka
# 创建数据目录
mkdir -p /data/kafka/logs
2.4.2 目录结构说明
解压完后,咱们看看 Kafka 的目录长什么样:
| 目录/文件 | 说明 |
|---|---|
| bin/ | 启动脚本,包括 Kafka 服务端、客户端、工具类 |
| config/ | 配置文件,server.properties、producer.properties 等 |
| libs/ | 依赖的 JAR 包 |
| logs/ | 运行日志目录(默认) |
个人习惯:我会把数据目录和日志目录都放到 /data 下,跟安装目录分开。这样以后升级 Kafka 版本时,直接换安装目录,数据不会丢。
2.5 本章知识体系总览
下面这张图把咱们这一章做的事情串起来了。你可以看到,从 Linux 底层环境,到 JDK 运行时,再到 ZooKeeper 集群,最后才是 Kafka 本体。每一层都依赖下面一层。
2.6 验证环境
所有东西都装好后,我习惯跑一个快速验证脚本,确保每个组件都正常。
# 1. 验证 JDK
java -version
# 2. 验证 ZooKeeper 集群
echo "ruok" | nc kafka-node1 2181
# 返回 imok 表示正常
# 3. 验证 ZooKeeper 选举状态
/usr/local/zookeeper/bin/zkServer.sh status
# 4. 查看 Kafka 目录结构
ls -la /usr/local/kafka/