

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 消费组偏移量同步
<a name="msk-replicator-bidirectional-offset-sync"></a>

MSK Replicator 可以将消费组偏移量从源集群同步到目标集群，从而允许使用者在不跳过记录的情况下切换集群并恢复处理。本主题介绍了偏移同步在单向（旧版）和双向（增强）配置中的工作原理，并重点介绍了常见的陷阱。

## 偏移同步的工作原理
<a name="msk-replicator-offset-sync-how-it-works"></a>

作为复制数据的一部分，MSK 复制器使用来自源集群的消息并将其生成到目标集群。这可能导致消息在源集群和目标集群上具有不同的偏移量。如果您在创建 Replicator 期间启用了使用者组偏移同步，MSK Replicator 会在复制元数据时自动转换偏移量，以便在故障转移到目标集群后，您的使用者可以从上次停下来的位置附近恢复处理。

MSK Replicator 针对源集群上从靠近流尖端的位置（主题分区的末尾）进行读取的使用者进行优化。如果您的使用者组在源集群上滞后，则与源集群相比，目标群集上的消费组的延迟可能会更高，这意味着消费者在故障转移后将重新处理更多的重复消息。为了减少这种延迟，源集群上的消费者需要赶上 catch 并从一开始就开始消费。当您的消费者赶上时，MSK 复制器将自动减少延迟。

偏移同步是一个分为三个阶段的流水线：

1. **偏移映射**-当记录从源复制到目标时，复制器会定期记录源偏移量和相应目标偏移之间的映射。由于源偏移量和目标偏移量不同（不同的起点、压缩等），因此这些映射是必不可少的。

1. **偏移转换** — 复制器定期读取源集群上每个已复制的使用者组的已提交偏移量。然后，它使用存储的偏移映射将这些源偏移量转换为等效的目标偏移量。

1. Offset commit — 转换后的@@ **偏移量被提交**到目标集群的主`__consumer_offsets`题，因此，当使用者连接到目标群组并加入同一个群组时，它会从大致正确的位置恢复。

关键行为：
+ 偏移平移是近似的，不是精确的。复制器每隔一段时间对偏移映射进行采样，因此转换后的偏移量可能稍微落后于真实的等效位置。这是设计使然 — 它偏向于 at-least-once传送，这意味着消费者可能会在故障转移后重新阅读少量消息。
+ 只有当目标上的消费者群体中没有消费者在积极消费时，才会向目标上的消费者群体提供抵消。这样可以防止复制器干扰已经在目标集群上运行的使用者。
+ 消费组必须与配置的消费者组筛选条件（包含/排除模式）相匹配才能同步。

## 具有传统偏移同步功能的单向复制
<a name="msk-replicator-offset-sync-legacy"></a>

这是标准单向复制器（集群 A → 集群 B）的默认模式。
+ **主题命名** — 旧版偏移同步支持前缀和相同主题名称复制。
+ **方向** — 只有当生产者在源上处于活动状态而目标集群上处于非活动状态时，使用者组偏移量才会同步到目标集群。
+ **故障转移** — 可以将使用者指向目标集群，并将从转换后的偏移位置恢复。
+ **不支持故障恢复** — 旧版偏移同步不会将偏移从目标系统转换回源端。如果您将消费者转移到目标，然后又想将他们移回来源，则回程不会自动进行偏移转换。如果需要故障恢复，请使用具有增强偏移同步功能的双向设置。

## 具有增强偏移同步功能的双向设置
<a name="msk-replicator-offset-sync-enhanced"></a>

双向设置需要两个复制器朝相反的方向运行（Replicator A→B 和 Replicator B→A）。每个复制器仍然执行单向数据复制和偏移同步——它将数据从其源复制到目标，并沿同一方向同步使用者组偏移。通过增强的偏移同步，即使生产者和使用者在不同的集群上处于活动状态，每个复制器也能够继续同步消费者组。

主要特性：
+ **主题命名**-增强型同步要求在两个复制器上复制相同的主题名称。
+ **两个复制器，每个复制器都是单向**的 — 每个复制器复制数据并同步一个方向的偏移。双向行为来自两人的合作。
+ **从两个复制器读取映射** — 转换偏移量时，复制器协同工作以确定可用的最准确的转换。
+ **故障转移和故障恢复** — 消费者可以从任一群集移动到另一个群集，然后从大致正确位置恢复。

何时启用双向偏移同步：
+ **具有回滚功能的迁移** — 当从一个群集迁移到另一个群集时，如果出现问题，您希望能够回滚到原始群集。
+ **Active-Active 架构** — 当两个集群都在积极提供读取和写入服务时，您需要使用者能够在集群之间切换。
+ **灾难恢复** — 当您需要确保在故障转移或故障恢复事件发生后，使用者可以从任一群集上的正确偏移量恢复处理时。

## 监控偏移量同步
<a name="msk-replicator-offset-sync-monitoring"></a>

监控以下 Amazon CloudWatch 指标以验证偏移同步是否正常运行：
+ `ConsumerGroupCount`— 验证两个复制器上是否同步了预期数量的使用者组。
+ `ConsumerGroupOffsetSyncFailure`— 在两个复制器上都应为 0。如果此值大于 0，请检查使用者组是否处于活动状态，验证 “读取” 和 “描述” 权限，并确保目标集群上存在主题。
+ `OffsetLag (MSK Cluster)`和 `OffsetLag (Non-MSK Cluster)` — 比较两个集群的分区级使用者延迟，以验证偏移量是否同步。

## 常见陷阱
<a name="msk-replicator-offset-sync-pitfalls"></a>

1. **故障转移后，消费者可能会重新读取少量消息**

   偏移平移是近似值。换算后的偏移量是故意保守的 —— 它可能稍微落后于真实的等效位置。这意味着消费者通常会在切换集群后重新处理少量记录。应用程序应设计为处理重复处理（等性）。

1. **偏移量不会同步到正在目标上积极消耗的群组**

   如果目标群集上的某个使用者组已处于活动状态，则复制器将不会覆盖其偏移量。这是一种安全机制。但是，这意味着，如果在复制器有机会同步偏移量之前在目标上启动使用者，则这些使用者将从目标的默认偏移重置策略（通常为`latest`或`earliest`）开始，而不是从转换后的位置开始。

1. **偏移同步具有固有的延迟**

   偏移转换取决于两个异步过程：数据复制和偏移同步。从使用者在源上提交偏移量到转换后的偏移量出现在目标上之间总是会有一些延迟。在故障转移期间，如果源使用者最近处于活动状态，则这种延迟可能导致消费者重新阅读的消息比预期的要多。

1. **必须将使用者组包含在复制筛选器中**

   只有符合配置的包含模式（且与排除模式不匹配）的消费者组才会同步其偏移量。如果消费组的偏移量未出现在目标上，请验证该偏移量是否包含在消费者组复制配置中。

1. **单向复制器不支持故障恢复**

   使用传统（单向）偏移量同步，偏移量只能从源转换到目标。如果您将使用者移至目标，之后又需要将其移回源处，则需要手动确定正确的偏移量或接受重新处理。如果需要故障恢复，请使用具有增强偏移同步功能的双向设置。

1. **删除和重新创建主题可能会使偏移映射失效**

   如果在任一集群上删除并重新创建主题，则偏移映射将失效，因为新主题从偏移量 0 开始。使用旧版偏移同步时，这可能会导致偏移量转换不正确。增强的偏移量同步功能可检测主题的重新创建并自动重置映射。