IBM Cloud Docs
启用镜像

启用镜像

本信息介绍如何将两个 Event Streams Enterprise 群集设置为镜像对。 用例包括灾难恢复、备份和地理复制。

Event Streams 当您构建一个涉及镜像的解决方案时,请考虑您的解决方案将如何处理以下两种情况:

数据丢失
镜像是异步的。 即,必须先将消息成功生成到源集群,然后再将其镜像到目标集群。 如果在对这些消息进行镜像之前在源集群上发生故障,那么应用程序将需要处理这些消息的丢失。
至少一次
在镜像过程中可能会发生消息重复。 在源集群中落实的使用者组偏移量可能不会转换为目标集群中的检查点。 在故障转移时,使用者可能需要重新处理已在源集群上使用和落实的消息。

将镜像与 Event Streams 配合使用会产生每个镜像容量单位小时的额外费用。 有关更多信息,请转至 目录 并搜索 Event Streams。 然后,您可以查看定价计划。

目前,启用 Event Streams 服务实例的镜像功能需要使用 IBM Cloud CLI。

要安装 CLI,请参阅 使用插件扩展 IBM Cloud CLI

IBM Cloud CLI 使用 service-instance-update 命令来更新您的 Event Streams 服务实例资源。用于运行服务实例更新命令的账户中的用户 ID 必须分配与创建资源时相同的访问策略。 有关访问权需求的信息,请参阅 创建资源所需的访问权

为 Event Streams 服务实例启用镜像所需的时间有所不同,但在正常情况下不超过 2 小时。

设置

确保提供两个企业计划群集。 两个集群必须具有相同的吞吐量和存储容量,并且具有服务到服务绑定 (请参阅 步骤 2 以获取更多信息)。

因为镜像是单向的,所以请决定您想要的镜像方向。 一个集群是源,另一个集群是目标。

决定要镜像源群集中的哪些主题。 默认情况下,没有主题被镜像,您可以在镜像启用后使用用户控件启用镜像,如 步骤4 所示。 必须将选择指定为一个或多个模式。

考虑带宽需求;源集群中是否有足够的带宽可供使用?源集群需要有一些空余空间来运行镜像。请参阅“选择计划”了解群集带宽限制,并使用 Event Streams 指标 确定源群集的繁忙程度以及是否有足够的空间进行镜像。

虽然允许从企业多区域集群镜像到企业单区域集群,反之亦然,但除非您有特定的居住要求并了解其影响,否则不建议使用此配置。 企业多区域集群与企业单区域集群的服务水平协议(SLA)政策可能更低,反之亦然。

启用服务对服务绑定

必须在两个实例之间配置服务到服务绑定,以允许两个实例进行通信。 要进行配置,请完成以下步骤:

在创建服务对服务绑定时,IAM 使用“源”和“目标”术语的方式与 Event Streams 相反。 其中 IAM 源账户包含 Event Streams 镜像目标实例,反之亦然。

  1. 选择包含 Event Streams 镜像源服务实例的 IBM Cloud 帐户。
  2. 导航至 IAM 中的授权面板,然后单击创建
  3. 对于 部分:
    • 如果您正在镜像另一个账户中的目标实例,请在源标题下选择“另一个账户”,然后选择包含镜像目标实例的账户。 如果在同一帐户中的服务实例之间进行镜像,那么可以选择缺省值“此帐户”。
    • 选择镜像目标 Event Streams 实例作为 IAM 源服务实例。
  4. 对于 目标 选择,选择镜像源 Event Streams 实例作为 IAM 目标服务实例。
  5. 指定阅读器角色,然后单击授权

如果需要故障回退,还需要反方向的服务对服务绑定。

以下示例显示如何使用命令行来配置服务到服务绑定。

  1. 登录包含 Event Streams 实例的 IBM Cloud® 账户,您希望将该实例作为镜像源实例:

    ibmcloud login -c <account containing mirroring source instance>
    
  2. 设置授权策略,如下所示:

    ibmcloud iam authorization-policy-create messagehub messagehub Reader --source-service-instance-id <instance id of the mirroring target cluster> [--source-service-account <account containing mirroring target instance>] --target-service-instance-id <instance id of the mirroring source cluster>
    

    请注意,如果您在同一 IBM Cloud 账户下的两个 Event Streams 实例之间设置镜像,则可以省略 --source-service-account 选项。

有关服务对服务绑定的更多信息,请参阅 管理授权面板使用授权在服务间授予访问权

启用镜像并选择要镜像的主题

要启用镜像,您需要 service-instance-update 命令,使用CLI并输入以下所需参数:

启用镜像时所需的参数
必需参数 描述
来源_crn 要镜像的源集群的 crn
源别名 用于源集群的别名
目标别名 用于目标集群的别名
  • source_crn 的格式如下:crn:v1:bluemix:public:messagehub:us-south:a/aaa:aaaa::
  • source_aliastarget_alias 是在启用镜像时要为两个服务实例中的每个实例配置的别名。 别名出现在主题名称中。 选择简短名称和描述性名称。 例如,“美国南部”和“美国东部”。

CLI 命令示例

ibmcloud resource service-instance-update "Event Streams resource instance name" -p '{"mirroring":{"source_crn":"<source_crn>", "source_alias":"<source_alias>", "target_alias":"<target_alias>"}}'

选择要镜像的主题

服务实例更新完成后,您必须选择将从源集群镜像到目标集群的主题。 使用CLI的“ibmcloud es mirroring-topic-selection-set”命令即可完成此操作。 任何习惯从这些选定主题进行消费的消费者群体,都将从源群映射到目标群。 主题选择的格式为正则表达式模式或此类模式的逗号分隔列表。

以下命令选择要镜像的所有主题:

ibmcloud es mirroring-topic-selection-set --select '.*'

您可以通过列出要镜像的主题来选择主题,如下所示:

ibmcloud es mirroring-topic-selection-set --select topic1,topic2,topic3

有关进行选择的更多信息,请参阅 镜像用户控件

选择完主题后,目标集群将显示使用镜像用户控件 (后缀为源集群的别名)所选用于镜像的主题。

步骤 3.1: 指定主题和组名称的转换方式

您可以指定转换规则,将数据镜像到目标集群中具有不同名称的主题中。 以下三种情况描述了可能的转变,并解释了每种情况的使用案例。

启用镜像后,您可以随时指定镜像哪些主题或消费者群体,但主题或群体转换只能在启用镜像时进行。 如果镜像功能已经启用,则需要在发出后续启用请求以指定主题或群组转换之前先将其禁用。

场景1:通过删除旧的前缀或后缀并添加新的前缀或后缀来转换主题

配置以下四个附加参数。

| 主题重命名所需的参数 | 说明 | 主题重命名所需的参数 | -- | -- | | remove_prefix | 要从源群集的主题名称中删除的前缀。| | remove_suffix | 要从源群中的主题名称中删除的后缀。| | add_prefix | 要添加到目标群集主题名称中的前缀。| | add_suffix | 要添加到目标群组中主题名称的后缀。|

ibmcloud resource service-instance-update 命令需要通过 -p 命令行参数指定。 当指定这些选项时,只有前缀或后缀匹配的主题才有资格进行镜像。 例如,如果您有一个 remove_prefixapp1-,并指定一个主题选择 abc.*,则只有以 app1-abc 开头的主题才会被镜像。

如果您指定了“重命名”类型的转换,但没有指定 add_prefixadd_suffix 的参数,则目标集群中的镜像主题将删除这些参数。 在删除任何源前缀或后缀后,以及在添加任何前缀或后缀前,主题模式会应用到主题名称。

请参阅以下 CLI 命令示例:

{
  "mirroring": {
    "source_crn": "crn:v1:...",
    "source_alias": "source",
    "target_alias": "target",
    "options": {
      "topic_name_transform": {
        "type": "rename",
        "rename": {
          "add_prefix": "newprefix-",
          "remove_prefix": "oldprefix-",
          "add_suffix": "-newsuffix",
          "remove_suffix": "-oldsuffix"
        }
      }
    }
  }
}

方案 2:将源别名作为后缀添加到镜像主题中

应用主题名称转换,并将 topic_name_transform 类型设为 use_alias。 使用此配置后,源群集中名为 app1-topic 的主题将被镜像到目标群集中名为 app1-topic.source 的主题,因为配置中指定的源别名是 source

请参阅以下 CLI 命令示例:

{
  "mirroring": {
    "source_crn": "crn:v1:...",
    "source_alias": "source",
    "target_alias": "target",
    "options": {
        "topic_name_transform": {
            "type": "use_alias"
      }
    }
  }
}

情景 3:主题被镜像,名称保持不变

在这种情况下,您还需要将 topic_name_transform 的类型设置为 none。 使用此配置,源集群中名为 app1-topic 的主题将镜像到目标集群中名为 app1-topic 的主题。

请参阅以下 CLI 命令示例:

{
  "mirroring": {
    "source_crn": "crn:v1:...",
    "source_alias": "source",
    "target_alias": "target",
    "options": {
        "topic_name_transform": {
            "type": "none"
      }
    }
  }
}

步骤 3.2: 转换相应的消费者群体ID

默认情况下,Mirror Maker在镜像到目标集群时不会修改消费者组ID。 然而,Event Streams 允许您修改群组ID的数据,如下面的两种情况所示。 与主题类似,在删除任何源前缀或后缀后,以及在添加任何前缀或后缀前,都会应用组ID模式。 如果您指定了“重命名”类型的转换,但没有指定 add_prefixadd_suffix 的参数,则目标集群中的镜像组ID将删除这些参数。

ibmcloud resource service-instance-update 命令需要通过 -p 命令行参数指定。

场景1:通过删除旧的前缀或后缀并添加新的前缀或后缀来转换组ID

配置以下四个附加参数。

| 重命名组 ID 的必要参数 | 说明 | 重命名组 ID 的必要参数 | -- | -- | | remove_prefix | 要从源群集的组 ID 中删除的前缀。| | remove_suffix | 要从源群集中的组 ID 中删除的后缀。| | add_prefix | 要添加到目标群集中组 ID 的前缀。| | add_suffix | 要添加到目标群组 ID 的后缀。|

当指定这些选项时,只有具有匹配前缀或后缀的组ID才有资格进行镜像。 例如,如果您有一个 remove_prefixaaaadd_prefixbbb,那么源集群中以 aaa-group-id 开头的消费者群组将映射到目标集群中的 bbb-group-id

请参阅以下 CLI 命令示例:

{
  "group_id_transform": {
    "type": "rename",
    "rename": {
       "add_prefix": "newprefix-",
       "remove_prefix": "oldprefix-",
       "add_suffix": "-newsuffix",
       "remove_suffix": "-oldsuffix"
    }
  }
}

方案 2:消费者组 ID 被镜像,名称不变

在这种情况下,您还需要将 topic_name_transform 的类型设置为 none。 使用此配置,源集群中名为 aaa-group-id 的主题将镜像到目标集群中名为 aaa-group-id 的主题。

请参阅以下 CLI 命令示例:

"group_id_transform": {
  "type": "none"
}

中的模式迁移方法 Event Streams

Event Streams 提供了两种模式迁移方法,每种方法都采用了不同的策略。

  1. 批量模式导入/导出工具:此方法可完全保留源群集中的模式 ID。 在源群集和目标群集之间没有转换的情况下,或者在必须保持模式端到端兼容性的情况下,可以使用这种方法。 有关详细信息,请参阅 从其他模式注册表导入数据

  2. 通过镜像与 ID 转换实现模式同步。 下面概述的 这种方法可在从源群集向目标群集迁移过程中转换模式 ID。 在分阶段迁移或需要转换时使用这种方法。 这种方法可确保注册集群之间的模式同步,这意味着目标集群上的消费者可以立即读取信息。 它还允许注册新的模式,而不会出现 ID 与以后可能迁移的模式相撞的风险。

通过 ID 转换镜像实现模式同步

通过镜像实现模式同步的方法是将模式注册请求从一个实例转发到另一个实例。 由于目标模式注册表以特殊的“镜像模式”运行--透明地代理与模式相关的请求到源注册表,并根据需要应用 ID 转换,因此用户可以通过目标实例读取和写入源实例。 这种方法简化了跨实例数据访问,并支持跨环境的无缝模式同步。

注意事项

在使用镜像同步模式之前,请查看以下注意事项:

  1. 在两个注册表之间批量导出/导入模式时,需要一个维护窗口,这个窗口大约需要几个小时或更短时间。
  2. 为使主题重命名有效,模式必须使用 Confluent Avro Serdes,这样主题就可以从主题名称中推导出来。 Confluent Avro Serdes,因为与模式相关的主题可以从主题名称中推导出来(例如,主题和主题/记录主题命名策略)。
  3. 镜像 S2S 授权必须不间断;禁用 s2s 授权或镜像将阻止转发模式注册表请求。
  4. 如果需要转换,则必须在进行任何迁移之前,用主题重命名规则配置目标实例模式注册表。
  5. 在迁移完成之前,不能更改重命名规则。 在迁移过程中进行更改会导致注册表之间不一致。

指示信息

以下说明概述了如何使用模式注册表镜像在两个实例之间移动模式。

CLI 中尚未添加导出工具。

允许的模式值

允许的模式值
描述
请求从目标实例转发到源实例。
只读 允许需要读者 IAM 角色的请求。 所有其他内容均被拒绝 (403)。
请求转发已禁用。 这是默认设置。

示例请求

请参阅以下 CLI 命令示例:

ibmcloud resource service-instance-update \
"trgt-instance-name" \
-p '{
"mirroring": {
"source_crn": "<src instance crn>",
"source_alias": "source",
"target_alias": "target",
"schemas": "proxied"
}
}'

主题名称转换

主题名称可在转发过程中进行转换。 例如,有了正确的规则,old-my-topicnew-my-topic。 启用后,源实例只能识别原始名称,而目标实例只能识别新的(转换后的)主题名称。 所有返回的结果都会进行相应的转换。

如果没有提供转换规则,则使用 use_alias,这与 Event Streams 中现有的镜像行为一致。 要在不更改主题名称的情况下转发,请使用 topic_name_transform 键入 none。 转换使用 现有的 CLI 转换字段 进行配置。

移民流

在两个 Event Streams 实例之间迁移时,建议采用以下流程。

  1. 启用两个实例之间的镜像,指定 schemas: proxied
  2. 更新应用程序以使用目标模式注册表。
  3. 切换到 schemas: read-only,阻止对目标注册表的任何写入。 在进行此更改之前,必须暂时禁用镜像功能。
  4. 从源实例导出所有模式。
  5. 将从源实例导出的所有模式导入目标实例。 可使用 IBM Cloud® CLI 执行此操作:ibmcloud [...]
  6. 禁用镜像。

导出模式

更多详细信息,请参阅 Confluent 文档

Event Streams CLI 要求模式导入具有 v1 exportVersion 值。

  1. 下载最新的 v2.x.x 源代码,例如 https://github.com/Apicurio/apicurio-registry/archive/refs/tags/2.6.13.Final.zip。

  2. 构建导出客户端:mvn -pl utils/exportConfluent -am -DskipTests -Pprod package

  3. 运行输出程序(将输出保存到 confluent-schema-registry-export.zip ):

    java -jar utils/exportConfluent/target/apicurio-registry-utils-exportConfluent-2.6.13.Final.jar \
    "https://token:<password>@<my-event-streams-instance.com>/confluent" \
    --client-props basic.auth.credentials.source=URL
    

导入模式

可以使用 Event Streams CLI 导入模式。

  1. 确保已安装 event-streams[es] 插件:ibmcloud plugin list

  2. 登录 IBM Cloud®: ibmcloud login [...]

  3. 初始化您要导入的 Event Streams 实例:ibmcloud es init.

  4. 导入模式:

    ibmcloud es schema-import \
    -f confluent-schema-registry-export.zip
    

验证

运行以下命令可获取当前服务实例信息:

ibmcloud resource service-instance "Event Streams resource instance name" --output=json

查看输出的最后操作部分。在更新过程中,信息会不断更新。镜像启用过程完成后,最后的操作信息会显示更新是否成功或同步是否成功。

"last_operation": {
  "type": "update",
  "state": "in progress",
  "description": "Update in progress.",
  "updated_at": null,
  "cancelable": false
}

再次运行该命令,直到成功为止,如下所示:

"last_operation": {
  "type": "update",
  "state": "succeeded",
  "description": "Update succeeded.",
  "updated_at": null,
  "cancelable": false
}

IBM Cloud Monitoring 仪表板 Event Streams 镜像显示镜像状态。