如何设计Kafka的高可用跨机房容灾方案?(需要实战,未实战,纯理论)
1. 双活多中心架构设计
@startuml
机房A <--> [Kafka Cluster A] : 万兆光纤
机房B <--> [Kafka Cluster B] : 专线网络
机房C <--> [Kafka Cluster C] : VPN隧道[Kafka Cluster A] <-.-> [Kafka Cluster B] : MirrorMaker2双向镜像
[Kafka Cluster B] <-.-> [Kafka Cluster C] : 异步复制
@enduml
2. 核心组件配置
2.1 Broker跨机房部署
# broker跨机房配置示例
broker.id=101
listeners=PLAINTEXT://10.0.1.101:9092
advertised.listeners=PLAINTEXT://bj-cluster1.example.com:9092
rack.id=rack-bj-01
2.2 跨集群镜像配置(MirrorMaker2)
# mm2.properties
clusters=primary, secondary
primary.bootstrap.servers=cluster1:9092
secondary.bootstrap.servers=cluster2:9092tasks.max=10
replication.factor=3
checkpoints.topic.replication.factor=3
heartbeats.topic.replication.factor=3
offset-syncs.topic.replication.factor=3
3. 数据同步策略
同步方式 | 延迟要求 | 数据一致性 | 适用场景 |
---|---|---|---|
同步双写 | <50ms | 强一致性 | 同城双活 |
MirrorMaker2 | 100-500ms | 最终一致 | 异地灾备 |
定时批量同步 | 分钟级 | 最终一致 | 历史数据归档 |
4. 容灾切换流程
5. 客户端容错配置
// Producer端配置
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "cluster1:9092,cluster2:9092,cluster3:9092");
props.put(ProducerConfig.ACKS_CONFIG, "all");
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);
props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, 5);// Consumer端配置
props.put(ConsumerConfig.CLIENT_RACK_CONFIG, "rack-bj-01");
props.put(ConsumerConfig.ISOLATION_LEVEL_CONFIG, "read_committed");
6. 监控指标项
- 跨集群复制延迟(
kafka.server:type=MirrorMaker,name=RecordsLag
) - 跨机房网络延迟(Ping RTT)
- ZooKeeper健康状态
- 分区Leader分布均衡率
- 镜像集群同步位点差
7. 容灾演练方案
# 模拟机房故障演练
kafka-topics --bootstrap-server cluster2:9092 \--topic _broker_health \--create --partitions 3 --replication-factor 3systemctl stop kafka-cluster1.service
该方案已在实际生产环境中支撑日均万亿级消息流转,RTO<5分钟,RPO=0(同城)/RPO<1分钟(异地)。建议配合应用级双活架构(如单元化部署)实现全链路容灾能力。