4、环境准备与集群部署:双数据中心网络规划、Kafka集群安装、ZooKeeper/KRaft模式选择
好,咱们进入实战环节。这一章说白了就是「搭环境」。别小看这一步,我见过太多项目在部署阶段埋下隐患,后面线上出问题才回头查网络、查配置。咱们一次搞定。
4.1 双数据中心网络规划
跨集群同步,网络是地基。地基不稳,上层再好的架构也白搭。我个人习惯,在动手装任何软件之前,先把网络拓扑画清楚。
4.1.1 网络延迟与带宽评估
双数据中心之间,首要关注两个指标:延迟和带宽。
- 延迟:建议控制在 50ms 以内。超过 100ms,Kafka 生产者的 acks=all 模式会明显变慢。
- 带宽:至少是峰值流量的 1.5 倍。我曾经遇到一个客户,两地链路只有 200Mbps,业务高峰期 MirrorMaker 直接卡死。
4.1.2 防火墙与端口规划
Kafka 跨集群通信需要开放以下端口。嗯,这里要注意,别把 ZooKeeper 端口暴露到公网。
| 组件 | 默认端口 | 用途 | 跨数据中心是否开放 |
|---|---|---|---|
| Kafka Broker | 9092 | 客户端生产/消费 | 是(需白名单) |
| Kafka 内部通信 | 9093 | Broker 间复制 | 是 |
| ZooKeeper | 2181 | 元数据管理 | 否 |
| JMX | 9999 | 监控 | 按需 |
4.2 Kafka 集群安装
环境准备好,咱们开始装集群。我习惯用二进制包手动部署,这样对目录结构、配置项心里有数。容器化部署虽然方便,但排障时你总得知道文件在哪。
4.2.1 下载与解压
从 Apache 官网下载 Kafka 二进制包。注意,别下源码包,咱们要的是编译好的。
# 下载 Kafka 3.5.0(建议使用最新稳定版)
wget https://downloads.apache.org/kafka/3.5.0/kafka_2.13-3.5.0.tgz
# 解压到指定目录
tar -xzf kafka_2.13-3.5.0.tgz -C /opt/
ln -s /opt/kafka_2.13-3.5.0 /opt/kafka
4.2.2 配置文件核心参数
每个 Broker 的 server.properties 是核心。我挑几个关键参数说说,剩下的默认就好。
# broker.id 每个节点唯一
broker.id=1
# 监听地址,双数据中心要绑定内网 IP
listeners=PLAINTEXT://192.168.1.10:9092
advertised.listeners=PLAINTEXT://dc1-broker1.example.com:9092
# 日志目录,建议用独立磁盘
log.dirs=/data/kafka/logs
# 分区数,根据业务预估
num.partitions=3
# 副本因子,跨集群建议 3
default.replication.factor=3
# 最小 ISR 副本数
min.insync.replicas=2
重点: advertised.listeners 这个参数容易被忽略。它是告诉客户端「你该连哪个地址」。跨数据中心场景下,客户端可能通过域名访问,这里一定要配成可路由的地址。
4.2.3 启动与验证
启动顺序:先 ZooKeeper,再 Kafka。当然,如果你用 KRaft 模式,顺序就变了,后面会讲。
# 启动 ZooKeeper(单节点测试)
bin/zookeeper-server-start.sh config/zookeeper.properties &
# 启动 Kafka Broker
bin/kafka-server-start.sh config/server.properties &
# 验证是否启动成功
bin/kafka-broker-api-versions.sh --bootstrap-server localhost:9092
看到返回 Broker 版本信息,说明启动成功了。
4.3 ZooKeeper vs KRaft 模式选择
这是 Kafka 3.x 之后绕不开的话题。说白了,就是「去 ZooKeeper」的演进。我直接说结论:新项目建议直接用 KRaft,存量项目逐步迁移。
4.3.1 两种模式对比
| 对比维度 | ZooKeeper 模式 | KRaft 模式 |
|---|---|---|
| 元数据存储 | 外部 ZooKeeper | Kafka 自身 |
| 部署复杂度 | 高(需维护 ZK 集群) | 低(少一套组件) |
| 控制器选举 | 依赖 ZK 选主 | 基于 Raft 协议 |
| 稳定性 | 经过多年验证 | 3.5+ 生产可用 |
| 运维成本 | 高(ZK 本身要调优) | 低 |
4.3.2 KRaft 模式配置要点
KRaft 模式下,需要额外配置 controller.quorum.voters。这个参数指定了哪些节点参与控制器选举。
# 在 server.properties 中增加
process.roles=broker,controller
node.id=1
controller.quorum.voters=1@192.168.1.10:9093,2@192.168.1.11:9093,3@192.168.1.12:9093
注意,node.id 和 broker.id 要一致。启动时不再需要 ZooKeeper,直接启动 Kafka 即可。
# KRaft 模式启动
bin/kafka-server-start.sh config/server.properties
4.3.3 我踩过的坑
我曾经在 KRaft 模式刚出时,直接在生产环境升级。结果遇到一个问题:控制器节点挂了之后,新节点加入集群时元数据同步失败。后来发现是 log.dirs 下的元数据目录权限不对。解决办法:确保所有节点的 meta.properties 文件中的 cluster.id 一致。
cluster.id 是自动生成的。如果你手动复制了数据目录,一定要检查这个 ID 是否一致。不一致会导致节点无法加入集群。
4.4 双数据中心部署架构图
下面这张图展示了我们最终要搭建的双数据中心架构。每个数据中心内部是一个完整的 Kafka 集群,通过 MirrorMaker 或 Kafka Connect 进行跨集群同步。
4.5 环境验证清单
部署完成后,别急着上线。我习惯跑一遍验证清单,确保每个环节都正常。
- 网络连通性:用 telnet 测试跨数据中心端口是否可达。
- 磁盘性能:用 fio 测试日志目录的写入延迟,建议 4K 随机写延迟 < 10ms。
- Kafka 基本功能:创建 topic,生产几条消息,消费确认。
- 跨集群复制:启动 MirrorMaker,验证消息能否从 A 同步到 B。
- 故障模拟:手动停掉一个 Broker,观察 ISR 变化和分区 Leader 切换。
最后说一句: 环境准备这一步,慢就是快。我见过太多人急着跑业务代码,结果网络延迟高、磁盘 IO 差,最后全返工。把基础打牢,后面 26 章你会感谢现在的自己。