跨域复制 是指在脉冲星实例中对多个集群中永久存储消息数据的复制。

运作模式

下图说明了 Pulsar 在不同集群之间跨地域复制的过程:

复制图表

在这个图中,每当 P1P2P3 的生产者分别向Cluster-ACluster-BCluster-C 中的T1 topic发送消息时,这些消息很快在不同的集群中复制。 一旦复制,C1C2 消费者会从各自的集群中消费这些消息。

如果没有跨地域复制,C1C2 消费者不能消费 P3 生产者发布的消息。

跨地域复制和 Pulsar 属性

Geo-replication must be enabled on a per-tenant basis in Pulsar. Geo-replication can be enabled between clusters only when a tenant has been created that allows access to both clusters.

Although geo-replication must be enabled between two clusters, it’s actually managed at the namespace level. You must complete the following tasks to enable geo-replication for a namespace:

该名称空间中在任何topic上发布的任何消息都将复制到指定集合中的所有集群。

本地存储和转发

当信息在脉冲星topic上生成时,它们首先会被保存在本地集群中,然后异步转发到远程集群。

在正常情况下,当没有连接问题时,消息会立即复制,同时发送给本地消费者。 通常,端到端交付延迟由远程区域之间的网络往返时间(RTT)决定。

应用程序可以在任何集群中创建生产者和消费者,即使无法访问远程集群(比如在网络分区期间)。

面向集群的本地订阅

虽然生产者和消费者可以在脉冲星实例中的任何集群中发布和消费,但是订阅是创建它们的集群的本地订阅,不能在集群之间传输。 如果确实需要传输订阅,则需要在所需的集群中创建新的订阅。

在这个案例中,T1主题被复制到三个集群中,集群A集群B集群C

这三个集群中的任何一个集群生成的所有消息都交付给其他集群中的所有订阅。 在这种情况下,C1C2的消费者将接收到由P1,P2P3生产者发出的全部信息。 指令仍然在每个生产者的basis上有所保障。

配置复制

正如在Geo-replication和脉冲星属性一节中所述,脉冲星中的Geo-replication是在租户级别进行管理的。

授予属性权限

To replicate to a cluster, the tenant needs permission to use that cluster. You can grant permission to the tenant when you create it or grant later.

在创建租户时指定所有预期的集群

  1. $ bin/pulsar-admin tenants create my-tenant \
  2. --admin-roles my-admin-role \
  3. --allowed-clusters us-west,us-east,us-cent

要更新现有租户的权限,请使用update而不是create

激活geo-replication名称空间

你可以使用如下示例命令创建名称空间。

  1. $ bin/pulsar-admin namespaces create my-tenant/my-namespace

Initially, the namespace is not assigned to any cluster. You can assign the namespace to clusters using the set-clusters subcommand:

  1. $ bin/pulsar-admin namespaces set-clusters my-tenant/my-namespace \
  2. --clusters us-west,us-east,us-cent

你可以随时更改名称空间的复制集群,而不会中断正在进行的通信。 一旦配置发生更改,复制通道将立即在所有集群中设置或停止。

使用带有topic的跨域复制

一旦创建了跨域复制名称空间,生产者或消费者在该名称空间中创建的任何topic都将进行跨集群复制。 Typically, each application will use the serviceUrl for the local cluster.

选择性复制

By default, messages are replicated to all clusters configured for the namespace. 您可以通过为消息指定复制列表来选择性地限制复制,然后该消息将只复制到复制列表中的子集。

如下是 Java API 示例。 Note the use of the setReplicationClusters method when constructing the Message object:

  1. List<String> restrictReplicationTo = Arrays.asList(
  2. "us-west",
  3. "us-east"
  4. );
  5. Producer producer = client.newProducer()
  6. .topic("some-topic")
  7. .create();
  8. producer.newMessage()
  9. .value("my-payload".getBytes())
  10. .setReplicationClusters(restrictReplicationTo)
  11. .send();

Topic 统计数据

特定主题的地跨域复制统计信息可以通过 pulse -admin 工具和 REST API 查看

  1. $ bin/pulsar-admin persistent stats persistent://my-tenant/my-namespace/my-topic

每个集群会生成自己的本地统计信息报告,包括传入和传出的复制率和队列容量。

删除跨域复制topic

Given that geo-replication topics exist in multiple regions, it’s not possible to directly delete a geo-replication topic. Instead, you should rely on automatic topic garbage collection.

In Pulsar, a topic is automatically deleted when it meets the following three conditions:

  • when no producers or consumers are connected to it;
  • there are no subscriptions to it;
  • no more messages are kept for retention. 对于跨域复制topic,每个区域都使用容错机制来决定何时在本地安全删除该主题。

可以通过在代理配置中设置brokerDeleteInactiveTopicsEnabledfalse来显式禁用主题垃圾收集。

要删除跨域复制主题,请关闭该主题上的所有生产者和消费者,并删除每个复制集群中的所有本地订阅。 When Pulsar determines that no valid subscription for the topic remains across the system, it will garbage collect the topic.