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优先,机械盘也能用,但吞吐量会打折扣
小提示:检查JDK版本时,别只看java -version。我遇到过一台机器装了多个JDK,环境变量指向了旧版本,结果Kafka启动报ClassNotFoundException。建议用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: leaderMode: follower,说明集群起来了。我习惯用zkCli.sh连上去看看:

/usr/local/zookeeper/bin/zkCli.sh -server 192.168.1.101:2181
ls /

能正常列出节点,就说明ZK没问题了。

注意:ZooKeeper集群要求半数以上节点存活才能选举Leader。所以3台机器最多允许挂1台,5台机器最多允许挂2台。别问我怎么知道的——有一次机房断电,两台ZK同时宕机,整个Kafka集群直接瘫痪。

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上,那就要检查一下配置了。

避坑指南:我曾经在生产环境遇到过一个问题:Broker启动后,ZooKeeper里能看到节点,但客户端就是连不上。最后发现是listenersadvertised.listeners写成了0.0.0.0,导致客户端无法解析。记住:advertised.listeners一定要写客户端能访问的IP。

4. 集群启动后的检查清单

集群启动后,别急着走。我一般会跑一遍这个检查清单:

  1. 进程检查:三台机器上jps都能看到Kafka和QuorumPeerMain进程
  2. 端口检查:9092和2181端口都在监听
  3. Topic检查:能正常创建和描述Topic
  4. 生产消费测试:用kafka-console-producer.shkafka-console-consumer.sh发一条消息试试
  5. 日志检查:查看logs/server.log,没有ERROR级别的日志

嗯,做到这一步,你的Kafka集群就算搭好了。下一章咱们会聊生产者和消费者的实战用法,到时候再细说。