在 多数据中心(Multi-DC) 部署 Kafka,我司的场景:
- 北京、上海 各有一个 Kafka 集群
- 新加坡 也有一个独立的 Kafka 集群(数据隔离)
- 中国的数据中心需要消费新加坡的数据
这种情况下,最合适的架构是 跨数据中心复制(Cross-DC Replication),最常见的方案是 MirrorMaker 2(MM2) 或 Confluent Replicator。
1. 方案选型
(1)MirrorMaker 2(MM2):Kafka 官方推荐
Kafka 自带的 MirrorMaker 2(MM2)是 基于 Kafka Connect 的数据复制工具,专门用于 跨数据中心同步 Kafka 数据。
- 支持增量复制(不会重复复制已消费的数据)
- 支持双向同步(新加坡 → 中国 / 中国 → 新加坡)
- 支持 Offset 迁移(让 Consumer 在中国继续消费正确的 Offset)
适用场景:
- 异步复制(New York -> Shanghai 只要几秒延迟)
- 保证高可用(如果新加坡 Kafka 挂了,中国依然能用本地数据)
- Consumer 在中国,仍能消费新加坡数据
架构图:
Kafka (新加坡) → MirrorMaker 2 → Kafka (北京)
|
→ Kafka (上海)
MM2 部署方式:
- 在 中国 的 Kafka 集群上运行 MM2 进程
- 配置 新加坡 Kafka 为源(source),中国 Kafka 为目标(target)
- MM2 负责定期同步数据到中国
(2)Confluent Replicator:商业版方案
如果你使用 Confluent Kafka,可以用 Confluent Replicator,它比 MirrorMaker 2 更优化:
- 自动管理 Offset 映射,减少 Consumer 端问题
- 支持 Schema Registry 同步(适用于 Avro、Protobuf 数据格式)
- 企业级监控和管理
适用场景:
- 企业级 Kafka 部署(Confluent 提供商业支持)
- 需要自动恢复、监控、Schema 复制的场景
架构类似 MM2,但操作更简单。
2. 具体实施
(1)部署 MirrorMaker 2
在 北京 / 上海 Kafka 服务器上安装 MirrorMaker 2:
bin/connect-mirror-maker.sh config/mm2.properties
示例 mm2.properties
配置:
# 连接新加坡 Kafka
source.cluster.bootstrap.servers=kafka-singapore:9092
# 连接中国 Kafka
target.cluster.bootstrap.servers=kafka-china:9092
# 复制 topic
topics=important_topic
这样,北京和上海的 Kafka 都能获取 新加坡的 important_topic
数据。
(2)保证 Offset 兼容
MM2 还能同步 Consumer Offset,确保 在中国的消费者可以继续从正确的 offset 消费:
offset-syncs.topic.replication.factor=3
sync.topic.acls.enabled=true
3. 关键挑战
(1)跨境网络延迟
- 新加坡 → 中国 可能有网络波动
- 建议使用专线 / VPN / Kafka over HTTPS
- MM2 支持批量复制,可以减少小消息的同步延迟
(2)数据一致性
Kafka 跨数据中心复制默认是异步的,所以:
- 不会保证 100% 一致性(可能会有数据延迟)
- 可以用 Partition Leader 选举策略优化复制
(3)避免无限循环
如果 两个 Kafka 互相同步,可能会产生无限循环:
- 解决方案:设置
replication.policy.separator=-
,让 MM2 只同步 指定的 Topic。
4. 总结
方案 | 特点 | 适用场景 |
---|---|---|
MirrorMaker 2(推荐) | 官方 Kafka 工具,支持 Offset 复制,开源 | 开源 Kafka 跨数据中心同步 |
Confluent Replicator | 企业版 Kafka 方案,提供 Schema 同步 | Confluent Kafka 用户 |
自建 Kafka Connect + Sink | 自定义方案,灵活但复杂 | 需要高度定制 |
最优方案
北京/上海 Kafka 通过 MirrorMaker 2 复制新加坡 Kafka 数据,这样:
- 新加坡 Kafka 数据仍是独立的(中国 Kafka 只是个镜像)
- 中国的 Consumer 可以直接从本地 Kafka 读取,避免网络问题
- 支持增量同步,不会重复消费数据
这样,中国的数据中心就能消费新加坡的数据,同时保持新加坡数据的隔离性。