2、Kafka集群部署:环境准备与启动验证

部署Kafka集群,说白了就是搭积木。但积木搭不好,后面全得推倒重来。我这些年见过太多人一上来就改配置文件,结果环境变量没配、JDK版本不对、ZooKeeper先挂了——嗯,咱们还是按部就班来。

核心思路:先准备环境 → 再规划集群 → 然后配置 → 最后启动验证。一步都不能跳。

2.1 环境准备:JDK与ZooKeeper

Kafka依赖Java运行环境,也依赖ZooKeeper做元数据管理。这两样没配好,后面全是白搭。

2.1.1 JDK安装

我个人习惯用JDK 8或JDK 11。Kafka 2.x系列对JDK 8支持最好,3.x开始推荐JDK 11+。你想想看,如果版本选错了,启动时直接报UnsupportedClassVersionError,多尴尬。

# 下载JDK 11(以OpenJDK为例)
sudo yum install -y java-11-openjdk java-11-openjdk-devel

# 验证版本
java -version
# 输出示例:
# openjdk version "11.0.18" 2023-01-17 LTS
# OpenJDK 64-Bit Server VM (build 11.0.18+10, mixed mode)

# 设置JAVA_HOME(建议写入/etc/profile)
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH

我曾经踩过的坑:有次生产环境装的是JDK 8的小版本u45,结果Kafka的日志压缩功能频繁报错。后来升级到u202才稳定。建议至少用JDK 8u202以上版本。

2.1.2 ZooKeeper安装

ZooKeeper是Kafka的"大脑",负责选主、元数据存储。虽然Kafka 2.8+开始支持KRaft模式(去ZK),但生产环境我仍然推荐用ZK模式,毕竟经过了多年验证。

# 下载ZooKeeper 3.6.3(与Kafka 2.8兼容)
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
tar -xzf apache-zookeeper-3.6.3-bin.tar.gz -C /opt/
ln -s /opt/apache-zookeeper-3.6.3-bin /opt/zookeeper

# 创建数据目录
mkdir -p /data/zookeeper

# 配置文件 zoo.cfg
cat > /opt/zookeeper/conf/zoo.cfg << 'EOF'
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=60
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
EOF

小提示:autopurge参数建议开启。我见过有人的ZK数据目录涨到几十GB,就是因为没配自动清理。每小时的快照文件堆着不删,磁盘直接打满。

2.2 集群规划

集群规划不是拍脑袋决定的。我一般按这个思路来:先看业务流量,再定节点数,最后分配资源。

2.2.1 节点数量

Kafka集群最少3台,推荐5-7台。为什么?因为副本因子通常设3,如果只有2台,一台挂了就没法满足最小ISR。你想想看,3台机器允许挂1台,5台允许挂2台——这就是容错。

集群规模 节点数 副本因子 容错能力
开发测试 3 1~2 允许挂0~1台
生产小规模 5 3 允许挂2台
生产大规模 7+ 3 允许挂3台+

2.2.2 资源分配

我建议每台Kafka节点至少16GB内存、4核CPU、500GB SSD。磁盘是重中之重——Kafka重度依赖磁盘顺序读写,机械盘千万别用。

  • 内存:堆内存给4-6GB,剩余留给Page Cache。Kafka用Page Cache读消息,比堆内缓存快得多。
  • CPU:Kafka的瓶颈通常在磁盘和网络,CPU一般够用。但压缩/解压缩会吃CPU,如果开启gzip/zstd压缩,建议8核起步。
  • 磁盘:SSD是必须的。我踩过坑——有次用了SATA SSD,结果IOPS跟不上,生产消费延迟飙到秒级。换成NVMe SSD后,延迟降到毫秒级。

我的经验:磁盘容量按"日写入量 × 保留天数 × 2"来估算。比如每天写入1TB,保留7天,那就至少准备14TB。多出来的空间给日志压缩和副本迁移留余地。

2.3 配置文件详解

Kafka的核心配置文件是server.properties。说实话,里面参数上百个,但真正需要改的也就十几个。我挑重点说。

2.3.1 基础配置

# broker的唯一ID,集群内不能重复
broker.id=1

# 监听地址,建议用内网IP
listeners=PLAINTEXT://192.168.1.10:9092

# 日志数据目录,可以配多个用逗号分隔
log.dirs=/data/kafka/logs

# ZooKeeper连接地址,集群用逗号分隔
zookeeper.connect=zk1:2181,zk2:2181,zk3:2181/kafka

注意:zookeeper.connect后面的chroot路径(/kafka)建议加上。如果不加,Kafka和ZooKeeper的其他业务会混在一起,管理起来很乱。我曾经见过一个ZK集群同时给Kafka和HBase用,结果Kafka的元数据把ZK的znode撑爆了——加了chroot就隔离了。

2.3.2 关键性能参数

参数名 默认值 推荐值 说明
num.network.threads 3 CPU核数×2 网络处理线程,IO密集型可以多配
num.io.threads 8 CPU核数×4 磁盘IO线程,SSD可以多配
log.segment.bytes 1GB 1GB 日志段大小,一般不动
log.retention.hours 168 72~168 日志保留时间,按业务需求调
num.partitions 1 3~6 默认分区数,自动创建topic时生效

2.3.3 副本与可靠性配置

# 副本因子,生产环境建议3
default.replication.factor=3

# 最小ISR副本数,保证写入可靠性
min.insync.replicas=2

# 禁用自动创建topic(生产环境强烈建议)
auto.create.topics.enable=false

#  unclean leader选举,禁止!
unclean.leader.election.enable=false

为什么min.insync.replicas要设2? 配合副本因子3,意思是至少2个副本同步了才算写入成功。这样即使1台挂了,数据也不会丢。我见过有人设成1,结果broker宕机直接丢数据——血的教训。

2.4 启动与验证

配置写完了,该启动了。别急着直接上生产,先验证一遍。

2.4.1 启动ZooKeeper

# 启动ZK(先确保dataDir目录存在且有权限)
/opt/zookeeper/bin/zkServer.sh start

# 检查状态
/opt/zookeeper/bin/zkServer.sh status
# 输出:Mode: standalone 或 Mode: leader/follower

# 验证端口
netstat -tlnp | grep 2181

2.4.2 启动Kafka

# 启动Kafka(前台模式,方便看日志)
/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties

# 后台启动
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties

# 查看进程
jps -l | grep Kafka

2.4.3 验证集群

启动后别急着走,跑几个命令验证一下。

# 创建测试topic
/opt/kafka/bin/kafka-topics.sh --create \
  --bootstrap-server 192.168.1.10:9092 \
  --replication-factor 3 \
  --partitions 3 \
  --topic test-topic

# 查看topic详情
/opt/kafka/bin/kafka-topics.sh --describe \
  --bootstrap-server 192.168.1.10: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

验证要点:

  • 所有分区的Leader分布在不同broker上(负载均衡)
  • ISR列表与Replicas列表一致(副本全同步)
  • 没有出现"Leader: -1"(无主分区)

2.4.4 生产消费测试

# 启动生产者,输入几条消息
/opt/kafka/bin/kafka-console-producer.sh \
  --bootstrap-server 192.168.1.10:9092 \
  --topic test-topic
> hello kafka
> cluster is running

# 启动消费者,看能不能收到
/opt/kafka/bin/kafka-console-consumer.sh \
  --bootstrap-server 192.168.1.10:9092 \
  --topic test-topic \
  --from-beginning
# 输出:
# hello kafka
# cluster is running

能发能收,说明集群正常。嗯,到这里部署就算完成了。

最后提醒:生产环境记得配JMX监控、日志轮转、systemd自启动。这些后面章节会细讲,但你现在就可以先记着——部署完不等于万事大吉,运维才刚刚开始。

Kafka集群部署流程 环境准备 JDK + ZooKeeper 集群规划 节点数 + 资源分配 配置文件 server.properties 启动与验证 生产消费测试 JDK安装要点 • 版本≥8u202 • 配置JAVA_HOME • 验证java -version ZK配置要点 • 开启autopurge • 设置chroot路径 • 3节点起步 配置关键参数 • broker.id唯一 • min.insync.replicas=2 • 禁用auto.create