在上一篇文章中,曾经概括介绍了 Apache Pulsar 的地域复制功能。Apache Pulsar 可以使用 Apache BookKeeper 提供的可伸缩流存储,这是一种可跨越多个数据中心,同时支持同步地域复制(借助 Apache BookKeeper)和异步地域复制(在 Pulsar Broker 的层面上配置)的消息系统。本文将介绍跨越多个数据中心配置地域复制的几种常见模式。
异步地域复制简介
首先想简要介绍一下 Apache Pulsar 中异步地域复制的工作原理。图 1 展示了在 3 个数据中心之间为 Apache Pulsar 配置的全连接(Full-mesh)地域复制。
图 1:三个数据中心之间为 Apache Pulsar 配置的全连接地域复制
在上图中,无论生产方(Producer)P1、P2和P3在什么时候分别将消息发布给Cluster A、Cluster B和Cluster C中的主题T1,这些消息均会立刻复制到整个集群。一旦完成复制,消费者(Consumer)C1和C2即可从自己所在的集群消耗这些消息。
Pulsar 中的地域复制可针对每个租户启用,但只有在租户能访问所有集群的情况下,才能在这些集群之间启用地域复制。复制是在名称空间的层面上管理的,借此即可在租户能够访问的两个或更多已配置的集群中创建并配置要复制的名称空间。随后,发布到这种名称空间内任何主题中的消息都会复制到所配置的所有集群中。
3 个命令创建全连接地域复制
只需要几条命令即可轻松地在 Apache Pulsar 中启用地域复制(与现有消息系统截然不同,不需要任何额外的复制程序或镜像程序即可实现地域复制)。下文将尝试在 Pulsar 集群之间配置全连接地域复制。
假设有三个数据中心:us-west
、eu-central
和apac-australia
。开始操作前,需要在 Pulsar 中创建一个资产(租户),并为该租户提供访问所有这些数据中心的权限。
$ bin/pulsar-admin properties create my-property \ --admin-roles my-admin-role \ --allowed-clusters us-west,eu-central,apac-australia
随后即可针对名称空间配置复制。先创建一个名为full-mesh
的名称空间:
$ bin/pulsar-admin namespaces create my-property/global/full-mesh
创建后的名称空间并未分配给任何集群,我们需要将其分配给一个或多个集群,为此可使用set-clusters
命令。下列命令可将该名称空间分配给全部的三个可用集群。
$ bin/pulsar-admin namespaces set-clusters my-property/global/full-mesh \ --clusters us-west,eu-central,apac-australia
运行完这三条命令后,三个数据中心之间就建立了全连接的地域复制。随后,任何数据中心内产生的消息都可自动复制到另外两个数据中心以供使用。
如果随后需要更改复制设置,例如公司建成了第四个数据中心,或关闭了某个现有数据中心,我们可以随时更改复制设置,同时不会对流量产生任何影响。只要配置改动应用到数据中心,所有集群的复制渠道会立刻做出调整或停用。下列例子为full-mesh
名称空间添加了第四个数据中心:apac-china
。
$ bin/pulsar-admin namespaces set-clusters my-property/global/full-mesh \ --clusters us-west,eu-central,apac-australia,apac-china
选择性复制每条消息
默认情况下,全连接名称空间会在集群之间创建全连接复制,消息会复制到该名称空间配置的所有集群。但也可以对复制进行选择性地限制,在应用程序层面上直接为消息指定要使用的复制列表。随后这些消息将只复制到复制列表中定义的子集范围内。
下列代码可以使用 Pulsar Java 客户端生成一条消息,并只复制到apac-australia
数据中心。
List<String> restrictDatacenters = Lists.newArrayList("apac-australia"); Message message = MessageBuilder.create() … .setReplicationClusters(restrictDatacenters) .build(); producer.send(message);
地域复制的不同模式
通过使用全连接复制,并在发送消息时应用选择性复制信息,即可获得极大的灵活性,借此在任何数量的数据中心之间运行几条命令,即可打造任何类型的复制拓扑。
图 2:跨越三个数据中心的全连接地域复制
除了全连接地域复制,还可以使用其他几种复制模式。
双活复制
这是一种特殊形态的全连接地域复制,只使用两个数据中心,生产者可在任一数据中心中运行并生成消息,消费者也可以在任何数据中心内消耗这些消息。
主备复制
这是一种特殊类型的双活复制。生产者在主数据中心内生成消息,消息复制到备用数据中心但仅仅是为了备份。当主数据中心故障后,备用数据中心将接手并成为主数据中心。随后即可让生产者在备用数据中心(但现在已成为主数据中心)生成消息。
图 3:主备地域复制的配置
汇聚复制
有时候我们可能需要从多个前端数据中心复制消息到一个中央数据中心以实现汇聚。例如,假设有三个前端数据中心:front1、front2和front3,以及一个汇聚数据中心(假设叫aggregated)。随后为front1数据中心使用的主题创建名称空间front1-aggregation
,为front2数据中心使用的主题创建名称空间front2-aggregation
,并为front3数据中心使用的主题创建名称空间front3-aggregation
。最后可将aggregated数据中心分配到这些名称空间。
图 4:跨越四个数据中心的汇聚地域复制
汇聚和边缘计算
汇聚模式通常会被用于将物联网消息从边缘复制到云端,Pulsar 可以非常轻松地支持这种做法。该技术的灵活性以及高效实用的复制管理工具使得该技术成为边缘计算的关键。借此,用户完全不再需要设置非常繁琐的复制程序或镜像程序。
地域复制的最佳实践
除了自行设置地域复制架构过程中的常规指导,建议大家能考虑测下列这些最佳实践。
密切监视复制积压
Pulsar 集群的监视对业务很重要。最重要的是,在使用地域复制的情况下,产生网络分区,或多个数据中心之间网络性能的退化的可能性会远远高过只使用一个数据中心的时候。因此一定要密切监视复制状态,尤其要注意是否存在复制积压。
复制积压是指源集群已经生成了一系列消息,但尚未复制到其他远程集群。我们必须监视复制积压的主要原因有两个:
- 如果有必要从源数据中心故障转移至目标数据中心,那么所有在源位置生成但尚未复制到目标位置的消息将暂时不可用,直到源数据中心重新上线才能恢复。
- 目标位置进行的任何消息处理工作都会因为积压而产生延迟。
通常只会积压几条消息(取决于数据中心之间的网络延迟),但如果存在网络分区,数量可能会增多。如果积压数量持续增长,这代表复制吞吐率低于源集群产生新消息的速率(例如源集群中的生产者正在以 100 MB/s 的速度产生消息,而 Pulsar 复制消息的速度只能达到 50 MB/s),此时有必要在远程数据中心增加更多 Broker,或增加数据中心之间的带宽。
有关复制状态如何监视,具体监视社么的详细信息,请阅读有关 Pulsar 状态的文档。
数据中心故障后的容量规划
在为多个数据中心设计地域复制规划时,另一个重要问题是必须确保,如果一个或多个数据中心故障,消息(Apache Pulsar 中的 Broker)以及存储组件(Apache BookKeeper 中的 Bookie)能够承受足够长时间的构建积压,时间可能从数小时到数天不等。至少要保证故障转移集群具备足够的容量以存储故障转移过来的所有流量。
另外需要注意,当跨数据中心网络的故障成功解决后,必须要能提供足够的网络或 I/O 带宽,以便能用比新消息生成更快的速度尽快排空积压的消息,同时不能对现有流量产生影响。
复制的限流调节
当一个数据中心出现故障后,目标集群会积累大量消息。当故障的数据中心恢复后,Pulsar 需要将目标集群积累的消息重新复制回源集群。由于积压的大量内容需要通过复制排空,因此需要密切注意积压内容的排空速率,并为重要主题的 I/O 配置高优先级,对不那么重要的主题进行限流调节。这样即可确保业务可以尽快恢复至常态。
例如,可以这样在名称空间中针对每个主题限制排空速率:
$ bin/pulsar-admin namespaces set-dispatch-rate my-property/global/full-mesh \ --msg-dispatch-rate 20000
结论
本文介绍了 Apache Pulsar 中异步地域复制的用法,并提供了相关的最佳实践。希望本文可以帮助大家更好地理解 Apache Pulsar 及其地域复制功能。下篇文章将会介绍 Apache Pulsar 中的持久消息功能和 Effectively-once 语义。
如果对 Pulsar 感兴趣,大家可以通过下列方式加入 Pulsar 社区:
- Pulsar Slack 频道,可在这里自行注册: https://apache-pulsar.herokuapp.com 。
- Pulsar 邮件列表。
有关 Apache Pulsar 项目的常规信息,请访问官网: http://pulsar.incubator.apache.org/ ,并可关注该项目的 Twitter 帐号: @apache_pulsar 。
作者:Sijie Guo,阅读英文原文: Geo-replication in Apache Pulsar, part 2: patterns and practices
感谢杜小芳对本文的审校。
评论