Apache Pulsar 기술 시리즈 - GEO 복제에서 구독 상태의 동기화 원칙

소개

Apache Pulsar는 멀티 테넌시, 낮은 대기 시간, 읽기-쓰기 분리, 교차 지역 복제(GEO 복제), 빠른 확장, 유연한 내결함성 및 기타 기능을 지원하는 멀티 테넌트, 고성능 서비스 간 메시지 전송 솔루션입니다.GEO 복제는 기본적으로 여러 클러스터 간의 데이터 및 구독 상태 복제를 지원할 수 있습니다.GEO는 Apache InLong에서 장기적이고 안정적인 관행을 가지고 있습니다.이 문서는 주로 GEO에서 구독 상태 동기화에 대해 설명합니다.

GEO 소개

GEO 복제는 여러 클러스터 간에 데이터를 복제하는 기능을 제공합니다.

그림

위의 그림은 3개의 클러스터를 설명하고 있으며 클러스터 간에 서로 다른 GEO 복제 전략이 구성되어 있습니다.

  • 클러스터-A와 클러스터-B는 양방향 복제이며 두 클러스터의 주제 데이터는 피어 클러스터로 복사됩니다.즉, 클러스터 A의 데이터는 클러스터 B로 복사되고 클러스터 B의 데이터도 클러스터 A로 복사됩니다.클러스터 A와 B는 서로의 모든 데이터를 가지고 있습니다.

  • 클러스터 A와 클러스터 C는 단방향 복제입니다. 클러스터 A의 데이터는 클러스터 C에 복제되고 클러스터 C의 데이터는 클러스터 A에 복제되지 않습니다.

  • 클러스터 B와 클러스터 C는 복제 관계가 없습니다. 클러스터 B와 C 간에는 데이터 복제가 발생하지 않습니다.

위에서 데이터 동기화/복제에 대한 일반적인 시나리오를 설명했습니다.GEO 복제의 또 다른 시나리오는 구독 상태 동기화입니다.

구독 상태 동기화 시나리오

구독 동기화의 일반적인 응용 프로그램은 클러스터 재해 복구입니다.정상적인 상황에서는 기본 클러스터만 쓰기 및 소비 서비스를 제공합니다.기본 클러스터가 실패하면 생산 및 소비가 대기 클러스터로 전환됩니다.

프로덕션 전환이 매끄럽고 클러스터 전환 후 쓰기를 계속할 수 있습니다.소비는 생산보다 복잡합니다.데이터 만 동기화하면 클러스터 전환 후 대기 클러스터의 구독이 기록 데이터를 반복적으로 소비합니다.

그림

如上图:在主、备两个集群之间,每个 Topic(分区)的 Ledger 并不是一一对应的,比如在主集群中,订阅 sub-00 消费到了一条消息,这个消息所在的 Ledger 是 Ledger-x;经过复制之后,在备集群中这条消息对应的 Ledger 是 Ledger-y,这里 Ledger-x 和 Ledger-y 没有直接关系,所以订阅状态(MDP)不能简单的直接映射。

GEO 订阅状态同步原理

订阅状态的同步,大体上可以分为两个主要的步骤:

  • 第一步是实现两个集群之间 MessageId(可以理解为 Offset 信息)的映射,即在主集群的一条消息的 MessageId 复制到备集群之后的 MessageId;

  • 第二步是在主集群中一个订阅 ack 数据时,如果有 (MDP) 的变动,根据第一步中的主、备集群 MessageId 的映射关系,将主集群的 MDP 信息映射到备集群订阅的 MDP 中。

下面我们来详细看下整个流程。

MessageId 映射

MessageId 映射最直观的方法,就是维护主、备集群中每个 Message 的映射关系,但是这种方案的需要维护的映射关系太多,代价太大。

Pulsar 采用的方式是一个定时任务的方式,每隔一段时间同步一次主、备集群 LAC 信息之间的关系。假设集群 A 向集群 B 复制数据和订阅状态信息。

그림

首先,集群 A 会定时生产一个 SnapshotRequest 信息,写入到本地 Topic(分区)中,这个信息会随着数据复制写入到集群 B 的 Topic 中。

그림

B 集群会处理 SnapshotRequest 信息,然后将本地 Topic(分区)的 LAC(LAC-B) 信息封装在 SnapshotRespnse 中,写入到本地 Topic 中,通过 GEO Replciation 复制到 A 集群。

그림

集群 A 在处理 SnapshotRespnse 时,记录 SnapshotRespnse 在本地的 MessageId(LocalMessageId) 和 LAC-B 的映射关系,由于 A -> SnapshotRequest -> B -> SnapshotRespnse -> A 的操作顺序,可以保证集群 A 订阅的 MDP 大于 LocalMessageId 时,LAC-B 对应的数据一定是被消费过的,通过这种方式实现了两个集群之间 MessageId 的映射关系。

订阅信息同步

集群 A 中的订阅会不断消费、Ack,当 Ack 触发了 MDP 的移动时,集群 A 会检查 LocalMessageId 是否小于 MDP,如果发现小于,说明需要更新集群 B 订阅的 MDP 信息,此时集群 A 会根据映射关系,找到 LAC-B 信息,然后构造一个 ReplicatedSubscriptionsUpdate 消息,写入到本地 Topic,这个 ReplicatedSubscriptionsUpdate 消息会通过 GEO 复制到集群 B。

그림

集群 B 接收到 ReplicatedSubscriptionsUpdate 消息之后,会解析出 LAC 和订阅信息,然后更新订阅的 MDP。

至此,就完成了订阅状态的一次复制流程。

总结与思考

Pulsar 的订阅状态复制,依赖于原生的 GEO Replication 机制,并且需要主备集群之间双向的交互,所以对于单向复制的 GEO 集群,订阅状态是不能实现订阅状态同步的。

또한 현재 구독 상태 동기화는 MDP 정보만 고려하는데, 실제로 구독(특히 Shared 및 Key-Shared 유형 구독의 경우)의 경우 구독한 IndividuallyDeletedMessages 정보도 매우 중요하며, 특히 다수의 소비자가 개별 Ack를 사용하는 시나리오에서는 IndividuallyDeletedMessages 정보가 동기화되지 않으면 데이터 중복이 발생합니다.

IndiviindividuallyDeletedMessages는 각 메시지의 Ack를 기록하므로 이 문제를 해결하려면 다음이 필요합니다.

  • 활성 및 대기 클러스터의 각 MessageId 간의 매핑 관계를 기록합니다. 예를 들어 원본 메시지의 MessageId 정보를 복사된 메시지의 속성에 기록합니다.

  • IndiviindividuallyDeletedMessages를 대기 클러스터에 복사합니다.

대기 클러스터의 가입이 데이터를 소비할 때, 활성 및 대기 클러스터 간의 MessageId 매핑 관계와 활성 클러스터에서 복사된 IndiviindividuallyDeletedMessages에 따라 메시지가 승인되었는지 확인할 수 있으며, 승인된 경우 소비자에게 푸시되지 않으므로 클러스터 가입이 전환될 때 데이터가 반복되지 않습니다.

Supongo que te gusta

Origin juejin.im/post/7259668108649218103
Recomendado
Clasificación