Pulsar 地理复制(Geo-Replication) 是 Pulsar 原生支持的跨地域、跨云厂商、跨集群的数据复制机制,用于实现 高可用容灾、数据就近访问、多活架构 等关键场景。
与 Kafka MirrorMaker 不同,Pulsar 的 Geo-Replication 是 内置、异步、低延迟、支持双向复制 的核心功能,无需额外组件。
📘 Pulsar 地理复制(Geo-Replication)详解
一、什么是 Geo-Replication?
- Geo-Replication 是指将一个 Pulsar 集群中的消息 自动复制到另一个或多个远程集群。
- 复制是 异步进行 的,不影响本地写入性能。
- 支持 单向(主备) 和 双向(多活) 模式。
- 适用于:
- 跨地域容灾(Disaster Recovery)
- 多活架构(Active-Active)
- 数据就近访问(低延迟)
- 云迁移、混合云部署
✅ 类比:数据库的主从复制,但基于消息流。
二、两种配置方式对比
Pulsar 支持两种实现 Geo-Replication 的方式:
| 方式 | Global Topic (Global Cluster) | 普通 Topic + Cluster 级复制 |
|---|---|---|
| 核心机制 | 所有集群属于一个“全局集群” | 每个集群独立,显式配置复制 |
| 配置层级 | Cluster 级 | Namespace / Topic 级 |
| 复制范围 | 所有 Topic 自动复制 | 按需选择 Topic 复制 |
| 灵活性 | 低(全量复制) | 高(精细控制) |
| 适用场景 | 多活架构、全量同步 | 容灾、部分数据同步 |
| 推荐度 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
✅ 生产环境推荐使用“普通 Topic + Cluster 级复制”,更灵活、可控。
三、方式 1:Global Topic(Global Cluster)—— 全局集群模式(不推荐生产使用)
1. 原理
- 所有参与复制的集群被注册为一个 “Global Cluster”。
- 所有 Topic 自动成为 Global Topic,在所有集群间复制。
- 使用
global作为集群名称。
2. 配置示例
# 创建全局集群
pulsar-admin clusters create global \
--broker-url pulsar://us-west-broker:6650 \
--service-url http://us-west-broker:8080
# 添加其他集群
pulsar-admin clusters update global \
--broker-url pulsar://eu-central-broker:6650 \
--service-url http://eu-central-broker:8080
⚠️ 缺点:无法选择性复制,所有 Topic 都被复制,浪费带宽和存储。
四、方式 2:普通 Topic + Cluster 级复制(推荐)
这是 生产环境的标准做法。
1. 前提条件
- 多个独立 Pulsar 集群(如
us-west,eu-central) - 每个集群有自己的 ZooKeeper
- 配置
replicationEnabled=true(broker.conf)
# broker.conf
replicationEnabled=true
2. 配置复制集群(Clusters)
# 创建 us-west 集群
pulsar-admin clusters create us-west \
--broker-url pulsar://us-west-broker:6650 \
--service-url http://us-west-broker:8080
# 创建 eu-central 集群
pulsar-admin clusters create eu-central \
--broker-url pulsar://eu-central-broker:6650 \
--service-url http://eu-central-broker:8080
3. 配置命名空间允许复制
# 创建命名空间
pulsar-admin namespaces create my-tenant/us-west-ns
# 设置允许复制到哪些集群
pulsar-admin namespaces set-clusters my-tenant/us-west-ns \
--clusters us-west,eu-central
✅ 只有在此列表中的集群才能接收复制数据。
4. 启用 Topic 复制
# 创建 Topic(自动启用复制)
pulsar-admin topics create persistent://my-tenant/us-west-ns/my-topic
# 或手动触发复制(测试用)
pulsar-admin topics set-replication-clusters persistent://my-tenant/us-west-ns/my-topic \
--clusters us-west,eu-central
✅ 复制由 Broker 自动管理,无需干预。
五、复制流程详解
Producer (us-west)
↓
Broker 接收消息,写入 BookKeeper
↓
Replicator 组件检测到需复制
↓
异步发送消息到远程集群(eu-central)的 Broker
↓
eu-central Broker 接收并持久化
↓
Consumer 可在 eu-central 消费相同消息
关键组件:Replicator
- 运行在 Broker 内部的后台线程。
- 为每个需要复制的 Topic 创建一个 Replicator Producer。
- 使用 Pulsar 客户端协议发送消息到远程集群。
✅ 复制是 异步的,延迟通常在毫秒级。
六、复制模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 单向复制(Unidirectional) | A → B,B 不复制回 A | 主备容灾 |
| 双向复制(Bidirectional) | A ⇄ B,互相同步 | 多活架构、双写 |
| 星型复制 | 中心集群 ↔ 多个边缘集群 | 汇聚式数据同步 |
双向复制示例:
# 在 us-west 集群
pulsar-admin namespaces set-clusters my-tenant/us-west-ns --clusters us-west,eu-central
# 在 eu-central 集群
pulsar-admin namespaces set-clusters my-tenant/eu-central-ns --clusters eu-central,us-west
✅ 支持跨集群订阅。
七、冲突处理(仅双向复制需关注)
在 双向复制 + 双写 场景下,可能出现 循环复制 或 数据重复。
1. 循环复制问题
us-west → eu-central → us-west → ...
2. Pulsar 的解决方案
- 内置去重机制:
- 每条消息携带
replicated_from标记(源集群)。 - 当 Broker 收到来自 已复制源集群 的消息时,自动丢弃,防止循环。
- 每条消息携带
✅ 无需额外配置,Pulsar 自动处理。
3. 数据重复(幂等性要求)
- 即使有去重,网络重试仍可能导致重复。
- 业务侧必须实现幂等性(如订单号去重、状态机校验)。
八、监控与诊断
1. 关键监控指标(Prometheus)
| 指标 | 说明 |
|---|---|
pulsar_replication_rate | 复制速率(msg/s) |
pulsar_replication_backlog | 复制积压 |
pulsar_replication_latency | 复制延迟(P99) |
pulsar_replication_connected | 复制连接状态 |
建议设置告警:
replication_backlog > 1000或latency > 1s
2. 常用命令
# 查看 Topic 的复制状态
pulsar-admin topics peer-stats persistent://my-tenant/us-west-ns/my-topic
# 输出示例
{
"eu-central": {
"msgRatePublished": 100.0,
"msgRateExpired": 0.0,
"msgRateOut": 100.0,
"msgThroughputOut": 102400.0,
"replicationBacklog": 0,
"connected": true,
"replicationDelayInSeconds": 0
}
}
# 列出所有复制连接
pulsar-admin brokers list-replication-clusters
# 强制断开复制(调试用)
pulsar-admin topics break-replication-subscription persistent://my-tenant/ns/my-topic --peer eu-central
九、最佳实践建议
| 实践 | 建议 |
|---|---|
| ✅ 生产环境使用“命名空间级复制” | 灵活控制复制范围 |
| ✅ 启用复制监控 | 关注 backlog 和延迟 |
| ✅ 避免全量复制 | 按需选择 Topic |
| ✅ 双向复制时确保幂等性 | 防止重复处理 |
| ✅ 跨云厂商注意带宽和成本 | 使用压缩(ZSTD) |
| ✅ 测试故障切换 | 模拟主集群宕机 |
| ✅ 结合 DNS 或 GSLB 实现自动 failover | 提升可用性 |
十、典型应用场景
1. 容灾(Disaster Recovery)
- 主集群
us-west,备集群us-east - 单向复制,主集群故障时切换到备集群消费
2. 多活架构(Active-Active)
us-west和eu-central双写- 用户就近写入,全球订阅
- 需业务幂等
3. 数据汇聚
- 多个边缘集群 → 中心集群
- 用于分析、审计
✅ 总结
| 特性 | 说明 |
|---|---|
| ✅ 原生支持 | 无需 MirrorMaker |
| ✅ 异步低延迟 | 毫秒级复制 |
| ✅ 双向复制 | 支持多活 |
| ✅ 自动去重 | 防止循环复制 |
| ✅ 精细控制 | 按 Namespace/Topic 配置 |
| ✅ 高可用 | 跨地域容灾 |
📌 一句话总结:
Pulsar Geo-Replication 是“跨地域数据管道” —— 通过
set-clusters和replicationEnabled,你可以轻松实现跨云、跨地域的异步复制,构建真正全球可用的消息系统。
29

被折叠的 条评论
为什么被折叠?



