4、环境准备与集群部署:双数据中心网络规划、Kafka集群安装、ZooKeeper/KRaft模式选择

好,咱们进入实战环节。这一章说白了就是「搭环境」。别小看这一步,我见过太多项目在部署阶段埋下隐患,后面线上出问题才回头查网络、查配置。咱们一次搞定。

4.1 双数据中心网络规划

跨集群同步,网络是地基。地基不稳,上层再好的架构也白搭。我个人习惯,在动手装任何软件之前,先把网络拓扑画清楚。

4.1.1 网络延迟与带宽评估

双数据中心之间,首要关注两个指标:延迟和带宽。

  • 延迟:建议控制在 50ms 以内。超过 100ms,Kafka 生产者的 acks=all 模式会明显变慢。
  • 带宽:至少是峰值流量的 1.5 倍。我曾经遇到一个客户,两地链路只有 200Mbps,业务高峰期 MirrorMaker 直接卡死。
我的经验: 别只看平均带宽。用 iperf3 测一下「突发流量」下的表现。很多链路平时跑得欢,一压就丢包。

4.1.2 防火墙与端口规划

Kafka 跨集群通信需要开放以下端口。嗯,这里要注意,别把 ZooKeeper 端口暴露到公网。

组件 默认端口 用途 跨数据中心是否开放
Kafka Broker 9092 客户端生产/消费 是(需白名单)
Kafka 内部通信 9093 Broker 间复制 是
ZooKeeper 2181 元数据管理 否
JMX 9999 监控 按需
避坑: 我曾经见过有人把 ZooKeeper 端口直接暴露在跨域链路上,结果被扫到漏洞。ZooKeeper 没有认证机制,跨数据中心通信一定要用 Kafka 自身的协议,别走 ZK。

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 本身要调优) 低
我的建议: 如果你在双数据中心场景下,KRaft 模式的优势更明显——少维护一套 ZooKeeper 集群,跨机房的心跳问题也少了一个变量。我在一个生产环境用 KRaft 跑了半年,没出过元数据相关的问题。

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 一致。

注意: KRaft 模式下,cluster.id 是自动生成的。如果你手动复制了数据目录,一定要检查这个 ID 是否一致。不一致会导致节点无法加入集群。

4.4 双数据中心部署架构图

下面这张图展示了我们最终要搭建的双数据中心架构。每个数据中心内部是一个完整的 Kafka 集群,通过 MirrorMaker 或 Kafka Connect 进行跨集群同步。

双数据中心 Kafka 部署架构 数据中心 A Broker A1 Broker A2 Broker A3 Controller A 数据中心 B Broker B1 Broker B2 Broker B3 Controller B MirrorMaker / Kafka Connect 每个数据中心内部使用 KRaft 模式,跨数据中心通过 MirrorMaker 异步同步

4.5 环境验证清单

部署完成后,别急着上线。我习惯跑一遍验证清单,确保每个环节都正常。

  1. 网络连通性:用 telnet 测试跨数据中心端口是否可达。
  2. 磁盘性能:用 fio 测试日志目录的写入延迟,建议 4K 随机写延迟 < 10ms。
  3. Kafka 基本功能:创建 topic,生产几条消息,消费确认。
  4. 跨集群复制:启动 MirrorMaker,验证消息能否从 A 同步到 B。
  5. 故障模拟:手动停掉一个 Broker,观察 ISR 变化和分区 Leader 切换。

最后说一句: 环境准备这一步,慢就是快。我见过太多人急着跑业务代码,结果网络延迟高、磁盘 IO 差,最后全返工。把基础打牢,后面 26 章你会感谢现在的自己。