导读:Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案,支持多租户、低延时、读写分离、跨地域复制、快速扩容、灵活容错等特性。其原生支持了跨洲际级别的跨地域复制的解决方案,并结合其自身的 tenant 和 namespace 级别的抽象,可以灵活的支持不多种类,不同场景下的跨地域复制解决方案。
冉小龙
腾讯云微服务产品中心研发工程师 Apache Pulsar Committer
Apache BookKeeper Contributor
在 Geo-Replication 的设计支撑下,其一,我们可以比较容易的将服务分散到多个机房;其二,可以应对机房级别的故障,即在一个机房不可用的情况下,服务可以转接到其它的机房来继续对外提供服务。
Apache Pulsar 内置了多集群跨地域复制的功能,GEO-Repliaaction 是指把分散在不同物理地域的集群通过一定的配置方式让其能在集群之间进行数据的相互复制。
根据消息是否为异步读写的维度,跨地域复制可以分为如下两种方案:
下面我们讨论的是异步模式下,pulsar 的跨地域复制方案。
Pulsar 目前支持以下三种异步跨地域复制的方案:
从是否具有 configurationStoreServers (global zookeeper)的角度可以分为以下两种异步跨地域复制方案:
1. 有 configurationStoreServers
2. 没有 configurationStoreServers
在整个跨地域复制中的一个核心理念在于,各个集群之间的数据是否能够互通,它们之间的交互主要依靠如下配置信息:
在初始化 pulsar cluster 时,用户可以指定上述对应的信息,示例如下:
bin/pulsar initialize-cluster-metadata \
--cluster pulsar-cluster-1 \
--zookeeper zk1.us-west.example.com:2181 \
--configuration-store zk1.us-west.example.com:2181 \
--web-service-url http://pulsar.us-west.example.com:8080 \
--web-service-url-tls https://pulsar.us-west.example.com:8443 \
--broker-service-url pulsar://pulsar.us-west.example.com:6650 \
--broker-service-url-tls pulsar+ssl://pulsar.us-west.example.com:6651
Full-mesh 的形式允许数据在多个集群中共享,如下图:
概念解析
原理
对于多个集群之间的数据复制,我们均可以简化到两个集群之间的数据复制,基于这个理念,Geo-Replication 的原理如下图所示:
当前拥有两个集群,分别部署在北京和上海,当用户在北京的集群中使用 producer 发送数据时,首先会发送到北京机房的本地集群中(topic1)与此同时会去创建一个 replication cursor,用于专门复制数据的一个游标,通过这个 cursor 信息,你可以判断当前数据究竟复制到哪一个阶段。同时会去创建 replication producer,它会把数据从北京机房的 topic1 中读取数据,然后将数据写到上海机房的 topic1 中,上海机房的 broker 收到 producer 的请求之后,会写到本地相同的 topic 中来(topic1)。此时如果上海机房的用户开启 consumer 去消费数据的话,会接收到由北京机房 producer 生产的数据信息。反之亦然。
在这里需要说明如下问题:
一旦配置了 global zookeeper 之后,数据之间的复制都是双向复制的,所有 global zookeeper 下面挂载的集群之间的数据都是互通的。
上面我们提到,在配置了 global zookeeper 的情况下,是没有办法做数据的单向复制的,但是很多场景下,我们并不需要所有的集群之间的数据都是全连通的,这种场景下,我们就可以考虑使用单向复制的功能,需要强调的是,单向复制并不需要用户单独配置或指定 configurationStoreServers,配置时只需要将 configurationStoreServers 的值配置为本地集群的 zookeeper 地址(zookeeperServers)即可。
那么在不配置 global zookeeper 的情况下,如何去做跨集群复制的场景呢?
在上面我们提到,global zookeeper 的作用主要是用来存储多个集群的地址信息以及相应的 namespace 信息,并没有额外的元数据信息。所以在单向复制的场景下,你需要告诉其它机房的集群,你需要读到不同集群之间的 namespace 信息。
Failover 模式是单向复制的特例。
Failover 模式下,远端机房的集群只是用来做数据的备份,并不会有 producer 和 consumer 的存在,只有当当前处于 active 的集群宕机之后,才会把对应的 producer 和 consumer 切换到对应的 standby 集群中来继续消费。因为有 replication sub 的存在,所以会一同将订阅的状态也复制到备份机房。
《你可能并不懂 Apache Pulsar 的消息存储模型》
《生存还是毁灭?一文带你看懂 Pulsar 的消息保留和过期策略》
扫描下方二维码关注本公众号,了解更多微服务、消息队列的相关信息!解锁超多鹅厂周边!