2、Kafka集群搭建:环境准备与安装配置
好,咱们正式开始动手。这一章我会带你从零搭一套Kafka环境出来。说实话,很多初学者在Kafka栽跟头,不是Kafka本身多难,而是环境准备阶段就埋了坑。我见过不少同事,JDK版本不对、ZooKeeper没配好,折腾半天连个Hello World都跑不起来。
所以这一章,咱们稳扎稳打。先准备好地基,再盖楼。
2.1 环境准备:JDK与ZooKeeper
Kafka依赖JVM运行,所以JDK是必须的。我个人习惯用JDK 8或11,这两个版本在Kafka生态里验证得最充分。你问我为什么不用最新的?嗯,生产环境求稳,不是追新。
2.1.1 JDK安装
步骤很简单,我列一下:
- 下载JDK(推荐Oracle JDK 8u202或OpenJDK 11)
- 解压到指定目录,比如
/usr/local/jdk - 配置环境变量
JAVA_HOME和PATH - 验证:
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
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
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 启动与验证
集群启动后,怎么验证它是不是正常?我一般用三步:
- 检查进程:
jps看有没有QuorumPeerMain和Kafka进程 - 创建Topic:创建一个测试Topic,看集群是否响应
- 生产消费:发一条消息,再消费出来
# 创建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
看到消息被消费出来,就说明整个集群搭建成功了。
logs/server.log 里找到线索。
嗯,到这里,Kafka集群搭建这部分就讲完了。你跟着走一遍,应该能跑起来。如果遇到问题,别慌,先看日志,大部分错误信息都写得很清楚。