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自启动。这些后面章节会细讲,但你现在就可以先记着——部署完不等于万事大吉,运维才刚刚开始。