Kafka集群搭建:环境准备、ZooKeeper部署、Kafka Broker配置与启动
好,咱们直接进入正题。Kafka集群搭建这件事,说难不难,说简单也不简单。我见过不少新手一上来就急着配Broker,结果环境没准备好,折腾半天连个Hello World都跑不起来。所以这一章,咱们老老实实把每一步踩实了。
1. 环境准备:先把地基打牢
我个人习惯,在搭建任何分布式系统之前,先列个清单。Kafka对硬件和OS的要求其实挺明确的,别想得太玄乎。
1.1 操作系统与JDK
Kafka是Java写的,所以JDK是刚需。我建议用JDK 8或JDK 11,这两个版本我都在生产环境验证过,很稳。别追新潮用JDK 17,除非你愿意当小白鼠。
- 操作系统:CentOS 7.x 或 Ubuntu 18.04+,64位是必须的
- JDK版本:Oracle JDK 8u202 或 OpenJDK 11
- 内存:每个Broker至少4GB,我建议8GB起步
- 磁盘:SSD优先,机械盘也能用,但吞吐量会打折扣
update-alternatives --config java确认一下。
1.2 网络与防火墙
Kafka集群内部通信靠网络,端口得提前规划好。我一般会准备三台机器,每台机器上跑一个Broker和一个ZooKeeper实例(小规模集群够用了)。
| 节点 | IP地址 | ZooKeeper端口 | Kafka Broker端口 |
|---|---|---|---|
| node1 | 192.168.1.101 | 2181 | 9092 |
| node2 | 192.168.1.102 | 2181 | 9092 |
| node3 | 192.168.1.103 | 2181 | 9092 |
记得把防火墙关掉,或者放行这些端口。我曾经在生产环境忘了关防火墙,结果Broker之间连不上,消费者一直报连接超时,排查了半天才发现是iptables在捣乱。
2. ZooKeeper部署:Kafka的“大脑”
Kafka依赖ZooKeeper来管理集群元数据、选举Controller。虽然新版本Kafka在尝试去ZK化,但现阶段咱们还是得老老实实把ZK搭好。
2.1 下载与解压
去Apache官网下载ZooKeeper稳定版,我习惯用3.6.x系列。别用3.5.x,那个版本有已知的脑裂问题。
# 下载
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/
mv /usr/local/apache-zookeeper-3.6.3-bin /usr/local/zookeeper
2.2 配置文件:zoo.cfg
ZooKeeper的配置文件在conf/目录下,默认有个zoo_sample.cfg,复制一份改名为zoo.cfg。核心配置如下:
# 基本配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/logs
clientPort=2181
# 集群节点配置
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文件,内容就是对应的server编号。比如node1上:
mkdir -p /data/zookeeper/data
echo "1" > /data/zookeeper/data/myid
嗯,这一步很容易忘。我刚开始搭集群时,忘了写myid文件,结果ZK启动后一直报找不到leader,折腾了半小时才发现。
2.3 启动与验证
三台机器都配好后,依次启动:
# 启动
/usr/local/zookeeper/bin/zkServer.sh start
# 查看状态
/usr/local/zookeeper/bin/zkServer.sh status
如果看到Mode: leader或Mode: follower,说明集群起来了。我习惯用zkCli.sh连上去看看:
/usr/local/zookeeper/bin/zkCli.sh -server 192.168.1.101:2181
ls /
能正常列出节点,就说明ZK没问题了。
3. Kafka Broker配置与启动
ZK就绪后,终于轮到主角登场了。Kafka的配置比ZK复杂一些,但核心参数就那么几个。
3.1 下载与解压
我建议用Kafka 2.8.x或3.0.x版本,这两个版本对ZK的依赖还算稳定。下载后解压到/usr/local/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/
mv /usr/local/kafka_2.12-2.8.1 /usr/local/kafka
3.2 核心配置:server.properties
配置文件在config/server.properties。每个Broker的配置大同小异,但有几个参数必须不同:
# 每个Broker的唯一ID
broker.id=1
# 监听地址,建议用内网IP
listeners=PLAINTEXT://192.168.1.101:9092
advertised.listeners=PLAINTEXT://192.168.1.101:9092
# 日志存储目录
log.dirs=/data/kafka/logs
# ZooKeeper连接地址
zookeeper.connect=192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181
# 分区数量与副本因子
num.partitions=3
default.replication.factor=2
这里我重点说一下advertised.listeners。这个参数是告诉客户端“你应该连我这个地址”。如果你用Docker或云主机,内外网IP不一样,这个参数必须配对。我踩过这个坑:客户端连不上Broker,就是因为advertised.listeners写成了localhost。
3.3 启动Broker
三台机器都配好后,依次启动:
# 启动Kafka
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
# 检查进程
jps -l | grep Kafka
看到Kafka进程就说明启动成功了。我习惯用netstat -tlnp | grep 9092确认端口在监听。
3.4 验证集群
创建一个测试Topic,看看集群是否正常工作:
# 创建Topic
/usr/local/kafka/bin/kafka-topics.sh --create \
--bootstrap-server 192.168.1.101:9092 \
--replication-factor 2 \
--partitions 3 \
--topic test-topic
# 查看Topic详情
/usr/local/kafka/bin/kafka-topics.sh --describe \
--bootstrap-server 192.168.1.101:9092 \
--topic test-topic
输出应该类似这样:
Topic: test-topic PartitionCount: 3 ReplicationFactor: 2
Topic: test-topic Partition: 0 Leader: 1 Replicas: 1,2 Isr: 1,2
Topic: test-topic Partition: 1 Leader: 2 Replicas: 2,3 Isr: 2,3
Topic: test-topic Partition: 2 Leader: 3 Replicas: 3,1 Isr: 3,1
看到Leader分布在不同的Broker上,说明集群负载均衡了。如果所有Leader都在同一个Broker上,那就要检查一下配置了。
listeners和advertised.listeners写成了0.0.0.0,导致客户端无法解析。记住:advertised.listeners一定要写客户端能访问的IP。
4. 集群启动后的检查清单
集群启动后,别急着走。我一般会跑一遍这个检查清单:
- 进程检查:三台机器上
jps都能看到Kafka和QuorumPeerMain进程 - 端口检查:9092和2181端口都在监听
- Topic检查:能正常创建和描述Topic
- 生产消费测试:用
kafka-console-producer.sh和kafka-console-consumer.sh发一条消息试试 - 日志检查:查看
logs/server.log,没有ERROR级别的日志
嗯,做到这一步,你的Kafka集群就算搭好了。下一章咱们会聊生产者和消费者的实战用法,到时候再细说。