2、Kafka集群搭建:环境准备与安装配置

好,咱们正式开始动手。这一章我会带你从零搭一套Kafka环境出来。说实话,很多初学者在Kafka栽跟头,不是Kafka本身多难,而是环境准备阶段就埋了坑。我见过不少同事,JDK版本不对、ZooKeeper没配好,折腾半天连个Hello World都跑不起来。

所以这一章,咱们稳扎稳打。先准备好地基,再盖楼。

2.1 环境准备:JDK与ZooKeeper

Kafka依赖JVM运行,所以JDK是必须的。我个人习惯用JDK 8或11,这两个版本在Kafka生态里验证得最充分。你问我为什么不用最新的?嗯,生产环境求稳,不是追新。

2.1.1 JDK安装

步骤很简单,我列一下:

  1. 下载JDK(推荐Oracle JDK 8u202或OpenJDK 11)
  2. 解压到指定目录,比如 /usr/local/jdk
  3. 配置环境变量 JAVA_HOME 和 PATH
  4. 验证:java -version
# 以CentOS为例
tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/
vi /etc/profile
# 在文件末尾添加
export JAVA_HOME=/usr/local/jdk1.8.0_202
export PATH=$JAVA_HOME/bin:$PATH
# 生效
source /etc/profile
java -version
小提示: 我曾经遇到过一台机器上装了多个JDK版本,结果Kafka启动时用了错误的JVM。建议用 which java 和 java -version 双重确认,确保你配的路径生效了。

2.1.2 ZooKeeper安装与配置

Kafka从2.8版本开始支持KRaft模式,可以不依赖ZooKeeper。但说实话,目前生产环境里ZooKeeper模式还是主流。我建议初学者先学ZooKeeper模式,理解架构后再接触KRaft。

ZooKeeper本身是一个分布式协调服务,Kafka用它来管理集群元数据、选举Controller等。说白了,它就是Kafka的「管家」。

# 下载并解压ZooKeeper
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz -C /usr/local/
cd /usr/local/apache-zookeeper-3.6.3-bin/conf
cp zoo_sample.cfg zoo.cfg

ZooKeeper的配置文件 zoo.cfg 核心参数就几个:

参数 默认值 说明
dataDir /tmp/zookeeper 数据存储目录,建议改到非临时目录
clientPort 2181 客户端连接端口
tickTime 2000 心跳间隔,单位毫秒
注意: 千万别用默认的 /tmp/zookeeper 作为dataDir。系统重启后/tmp目录会被清空,你的ZooKeeper数据就丢了。我曾经帮一个同事排查过这个问题,他折腾了一下午,最后发现是数据目录没改。

启动ZooKeeper:

cd /usr/local/apache-zookeeper-3.6.3-bin/bin
./zkServer.sh start
# 检查状态
./zkServer.sh status

看到 Mode: standalone 就说明启动成功了。

2.2 单机版Kafka安装与配置

单机版说白了就是所有组件跑在一台机器上。虽然生产环境不会这么干,但学习和开发调试非常方便。

# 下载Kafka
wget https://archive.apache.org/dist/kafka/2.8.1/kafka_2.12-2.8.1.tgz
tar -zxvf kafka_2.12-2.8.1.tgz -C /usr/local/
cd /usr/local/kafka_2.12-2.8.1

核心配置文件是 config/server.properties。单机版只需要改几个地方:

# broker.id 唯一标识,单机版用0
broker.id=0
# 监听地址
listeners=PLAINTEXT://localhost:9092
# 日志存储目录
log.dirs=/usr/local/kafka_2.12-2.8.1/data/kafka-logs
# ZooKeeper连接地址
zookeeper.connect=localhost:2181
关键点: log.dirs 是Kafka存储消息的地方,一定要确保磁盘空间充足。我见过有人把日志目录放在系统盘,结果磁盘写满导致Kafka崩溃。

启动Kafka:

bin/kafka-server-start.sh -daemon config/server.properties
# 检查进程
jps -l | grep kafka

看到 kafka.Kafka 进程就说明启动成功了。

2.3 集群版Kafka安装与配置

单机版玩明白了,咱们上集群。集群至少需要3台机器,为什么是3台?你想想看,ZooKeeper集群要求奇数台才能选举,3台是最小的高可用配置。

假设我们有3台机器:

  • node1: 192.168.1.101
  • node2: 192.168.1.102
  • node3: 192.168.1.103

2.3.1 ZooKeeper集群配置

每台机器上都要安装ZooKeeper,然后配置 zoo.cfg:

# 在zoo.cfg末尾添加集群节点
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888

然后在每台机器的 dataDir 目录下创建 myid 文件:

# node1上
echo "1" > /usr/local/zookeeper/data/myid
# node2上
echo "2" > /usr/local/zookeeper/data/myid
# node3上
echo "3" > /usr/local/zookeeper/data/myid
避坑指南: 我曾经在配置ZooKeeper集群时,忘了创建myid文件,结果ZooKeeper启动后一直报错。这个文件虽然小,但缺了它集群就起不来。

2.3.2 Kafka集群配置

每台机器上的Kafka配置类似,只有 broker.id 不同:

# node1的server.properties
broker.id=1
listeners=PLAINTEXT://192.168.1.101:9092
log.dirs=/usr/local/kafka/data/kafka-logs
zookeeper.connect=192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181

# node2的server.properties
broker.id=2
listeners=PLAINTEXT://192.168.1.102:9092
# 其他配置相同

# node3的server.properties
broker.id=3
listeners=PLAINTEXT://192.168.1.103:9092
# 其他配置相同

启动顺序:先启动所有ZooKeeper,再启动所有Kafka。

2.4 启动与验证

集群启动后,怎么验证它是不是正常?我一般用三步:

  1. 检查进程:jps 看有没有 QuorumPeerMain 和 Kafka 进程
  2. 创建Topic:创建一个测试Topic,看集群是否响应
  3. 生产消费:发一条消息,再消费出来
# 创建Topic
bin/kafka-topics.sh --create \
  --bootstrap-server 192.168.1.101:9092,192.168.1.102:9092,192.168.1.103:9092 \
  --replication-factor 3 \
  --partitions 3 \
  --topic test-topic

# 查看Topic详情
bin/kafka-topics.sh --describe \
  --bootstrap-server 192.168.1.101:9092 \
  --topic test-topic

如果看到类似下面的输出,说明集群正常:

Topic: test-topic  PartitionCount: 3  ReplicationFactor: 3
  Topic: test-topic  Partition: 0  Leader: 1  Replicas: 1,2,3  Isr: 1,2,3
  Topic: test-topic  Partition: 1  Leader: 2  Replicas: 2,3,1  Isr: 2,3,1
  Topic: test-topic  Partition: 2  Leader: 3  Replicas: 3,1,2  Isr: 3,1,2

然后测试生产消费:

# 启动生产者
bin/kafka-console-producer.sh \
  --bootstrap-server 192.168.1.101:9092 \
  --topic test-topic
> hello kafka

# 启动消费者(另一个终端)
bin/kafka-console-consumer.sh \
  --bootstrap-server 192.168.1.101:9092 \
  --topic test-topic \
  --from-beginning
hello kafka

看到消息被消费出来,就说明整个集群搭建成功了。

总结一下: 集群搭建的核心就三件事——JDK环境、ZooKeeper集群、Kafka集群。每一步都有坑,但按我的步骤来,基本不会出问题。如果启动失败,先看日志,大部分问题都能在 logs/server.log 里找到线索。
Kafka集群搭建流程 1. 环境准备 2. ZooKeeper集群 3. Kafka集群 JDK安装 环境变量配置 版本验证 zoo.cfg配置 myid文件创建 集群启动 server.properties broker.id配置 多节点启动 4. 启动与验证 进程检查 创建Topic 生产消费测试 查看日志

嗯,到这里,Kafka集群搭建这部分就讲完了。你跟着走一遍,应该能跑起来。如果遇到问题,别慌,先看日志,大部分错误信息都写得很清楚。