使用镜像
镜像使一个 Event Streams 服务实例中的消息能够持续复制到第二个实例。 可以通过使用镜像来提高应用程序弹性,就像第一个服务实例变为不可用一样,应用程序可以重新连接到第二个实例并继续其正常操作。
此功能部件是完全受管服务的一部分,只能在使用 Event Streams Enterprise 套餐的服务实例之间使用。
镜像的功能:
- 两个 Event Streams 服务实例之间的镜像主题,消息数据和使用者组偏移量,可以在不同的 IBM Cloud 帐户中供应这些服务实例。
- 99.99% 可用性的 SLA,与 Event Streams 服务一致。
- 可使用 IBM Cloud® Monitoring进行监视。
镜像的限制:
- 单向: 在一对服务实例之间一次只能在一个方向上对数据进行镜像。 这意味着镜像提供了“主动-被动”式的高可用性,而不是“主动-主动”。
- 异步: 必须先将消息成功生成到源实例,然后才能将其镜像到目标实例。 这意味着当故障发生时,由于复制滞后,目标集群可能无法获得故障发生前所有消息,并且某些消息数据可能会丢失。
- 至少一次消息使用: 当使用者在实例之间移动时,可能需要重新处理其已处理的消息。
在开始镜像之前,请考虑以下几点:
- 可能需要 修改应用程序以最佳地利用镜像。
- 确保有 足够的可用容量 用于用于在实例之间镜像数据的网络流量。
要启用镜像,请参阅镜像设置指南。
镜像概述
镜像所选主题发生在两个集群之间,并且是单向的,也就是数据从一个源集群单向镜像到一个目标集群。 每个集群都有一个镜像别名。 在本文档中,A
用于源集群别名,B
用于目标集群别名。 在启用镜像时可配置别名,例如,别名可以是 "us-south" 和 "us-east"。
源集群 (A) 中名为 mytopic
的主题在目标集群 (B) 上显示为 mytopic.A
,指示其源自 A
。 此类型的主题称为 远程主题,因为它源自远程 (源) 集群。 相反,用户直接在目标集群上创建的任何主题都称为_本地主题_。
要选择镜像哪些主题,可以使用 “镜像用户控件” 配置正则表达式模式。
镜像会自动转换源实例与目标实例之间的使用者偏移量。 在先前版本的 Event Streams中,使用者必须使用名为 A.checkpoints.internal
的特殊主题 (其中 A
是源集群的别名)。 这不再是必需的,但是为了向后兼容现有应用程序,镜像过程将继续创建和更新检查点主题。 希望使用检查点主题的应用程序可以使用 Kafka MirrorClient 来简化对此主题中保留的数据的访问
最后,因为远程主题的命名:
- 避免将集群别名用作 Kafka 资源名称的一部分。
- 确保远程主题名称 (例如,源主题和源集群别名) 不超过 Kafka 主题的长度限制 (249 个字符)。 如果远程主题名称超过此限制,那么将不会针对该主题对消息进行镜像。
容量规划
在规划容量时,必须考虑网络使用情况以及源服务和目标服务实例的地理位置。
网络带宽
在源服务和目标服务实例的带宽限额中,必须考虑镜像所选主题所需的网络带宽。 例如,如果源服务实例中的应用程序向镜像主题发送了 10 MB/s 的消息流量,则需要额外的 10 MB/s 输出带宽将这些消息镜像到目标实例中。 在现有带宽被消耗性应用程序占用的情况下,必须允许这一带宽。 监视仪表板可用于确定服务实例中的网络使用情况。 有关更多信息,请参阅监视 Event Streams 度量值。
地理位置
与任何联网一样,数据传输是影响最大可实现吞吐量的一个因素(距离越远,等待时间和丢包就会越多)。 这会影响源实例和目标实例之间可达到的最大吞吐量。 将目标服务实例放置在尽可能靠近源的位置。
下表提供了从容量为150 MB/s的源实例镜像时可达到的吞吐量指导。
区域 | 每分区最大吞吐量 | 最大总吞吐量 |
---|---|---|
us-south <-> us-east | 1.5 MB/秒 | 35 MB/秒 |
eu-gb <-> eu-de | 2.5 MB/秒 | 35 MB/秒 |
au-syd <-> jp-tok | 0.4 MB/秒 | 12 MB/秒 |
within same region eu-gb <-> eu-gb | 2.5 MB/秒 | 35 MB/秒 |
上述数字的含义:
- 最大总吞吐量:可镜像全部所选主题的最大总吞吐量(MB/秒)。
- 每分区最大吞吐量:单个分区内可镜像的最大吞吐量(MB/秒)。 选择为源主题配置的分区数,以确保每个分区的负载保持在此限制内。
超出限制会导致源实例和目标实例之间的数据滞后。 如果源实例发生故障,那么具有较大的数据延迟可能会导致丢失更多的消息数据。 即使实例之间的延迟为零 (因为镜像是异步的),您也应该预计如果源实例发生故障,可能会丢失某些数据。 监视仪表板可用于确定每个主题的等待时间。 有关更多信息,请参阅监视镜像。
有关可实现吞吐量的指导是使用在 50 个主题分区中生成的 100K 消息生成的。 如果工作负载使用较小的消息大小 (例如,在 1K下) 或更少的分区,那么镜像可能无法达到这些吞吐量级别。
删除冗余目标主题
为了避免意外删除目标实例中的数据,从源实例中删除主题时,不会自动从目标实例中删除相应主题。 删除目标实例中的主题由用户负责。 如果频繁删除和创建镜像主题,那么可以在目标集群中使用更多磁盘和分区容量。 可以使用目标集群中的监视仪表板来监视使用情况,请参阅 监视 Event Streams 指标。 您可以使用 CLI,UI 或管理界面来删除不再需要的主题。
用于镜像的 IAM 访问策略
由于应用程序需要访问源集群和目标集群,因此必须在两个集群上设置 IAM 访问策略,并使用策略所附服务 ID 的 API 密钥。 我们可以使用 IAM 通配符功能(使用通配符策略分配访问权)来简化用于控制镜像资源访问权的访问策略。
如果您不熟悉 IAM 访问策略,请参阅 IBM Cloud IAM 如何工作 和 管理对 Event Streams 实例的认证 以获取更多详细信息。
在两个集群上定义以下IAM访问策略,其中
A.checkpoints.internal
。
资源类型 | 资源标识 | 角色 |
---|---|---|
集群 | 读者 | |
组 | <RESOURCE_NAME>.* | 视应用程序需求而定 |
主题 | <RESOURCE_NAME>.* | 视应用程序需求而定 |
txnid | <RESOURCE_NAME>.* | 视应用程序需求而定 |
主题 (特定于检查点主题) |
|
读者 |
将细颗粒度访问策略授予各个应用程序。 例如,对于仅使用“读者”访问权的应用程序。
为了镜像用户控制,您必须在目标集群上拥有以下权限。
资源类型 | 资源标识 | 角色 |
---|---|---|
集群 | 管理者 |
在多个实体之间共享集群时的注意事项
当多个实体(例如不同的业务部门)共享一个实例,并且需要彼此隔离时,请遵循命名指南,以简化镜像集群的管理和操作。
使用以下模板来命名 Kafka 资源: <ENTITY_PREFIX>
其中:
- <ENTITY_PREFIX> is the prefix for the entity that uses this topic.
- <SEPARATOR>是一个可选字符,用于轻松分隔实体和资源名称。
-
是 Kafka 资源的名称。
例如,如果会计业务部门需要讨论发票这个话题,您可以发送电子邮件至 accounting.invoices
。
对于所需的访问策略,必须相应地进行调整。 例如,对于会计业务单位,集群 B 上需要以下策略:
资源类型 | 资源标识 | 角色 |
---|---|---|
集群 | 读者 | |
组 | accounting.* | 视应用程序需求而定 |
主题 | accounting.* | 视应用程序需求而定 |
txnid | accounting.* | 视应用程序需求而定 |
主题(注:此类型特定于检查点主题) | A.checkpoints.internal | 读者 |
A组必须具有相同的访问策略,但最后一个必须设置为 B.checkpoints.internal
。
镜像用户控制
您可以使用 CLI 或 管理 REST API 来配置镜像。 所有镜像用户控制都在目标集群上执行。
设置主题选择
镜像选择是根据源集群上的主题名称,使用正则表达式(regex)模式进行的。 仔细选择源集群上主题的名称,方法是考虑 在多个实体之间共享集群时的注意事项 部分中的建议。
通过为同一组或同一应用程序中的主题添加前缀等结构良好的主题名称,可以轻松控制镜像。 有了这样的命名规则,任何符合该模式的未来主题都会自动映射,无需进行更多更改。
主题选择以一个或多个正则表达式列表的形式给出。 如果主题与列表中的任何模式匹配,那么将选择该主题。
下面是用于镜像主题选择的一些模式示例:
模式示例 | 说明 |
---|---|
^topic1$ |
完整主题名称。 这仅与名为 topic1 的单个主题匹配。 |
^topic1$,^topic2$ |
与完整主题名称匹配的模式的列表。 这与名为 topic1 和 topic2 的两个主题相匹配。 |
^aaa.* |
在前缀上匹配。 这与以 aaa 开头的任何主题名称相匹配。 |
^aaa.*,^bbb.* |
与前缀匹配的模式的列表。 这与以 aaa 或 bbb 开头的任何主题名称匹配。 |
^branch_[0-9]{3}_[a-z]*$ |
用于匹配主题名称的复杂正则表达式模式。 这将匹配以 branch_ 开头的任何主题名称,后跟正好 3 个数字,后跟 _ 和任意数量的小写字母。 |
.* |
镜像所有源主题。 |
使用 CLI 时,将以逗号分隔列表形式提供模式。 例如,以下命令将选择其名称具有前缀 accounting
或 hr
的所有主题。
ibmcloud es mirroring-topic-selection-set --select '^accounting.*,^hr.*'
以下命令显示如何使用管理 REST API 进行相同选择。 这些模式采用名为 "includes"
的 JSON 数组形式。
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: <bearer token>" <admin url>/admin/mirroring/topic-selection -d '{"includes":["^accounting.*", "^hr.*"]}'
更新主题选择将替换当前的模式集。
要除去选择,以便不制作任何主题的镜像,请将 --none
选项与 CLI 配合使用,或将空模式与管理 REST API 配合使用,如下所示。
ibmcloud es mirroring-topic-selection-set --none
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: <bearer token>" <admin url>/admin/mirroring/topic-selection -d '{"includes":[""]}'
要选择性地禁用镜像,请重新应用主题选择,忽略您想要禁用的模式。 例如,当前正在镜像 topic1、topic2 和 topic3 时,以下命令将禁用 topic2 的镜像,但保留其他两个的镜像。
ibmcloud es mirroring-topic-selection-set --select '^topic1$,^topic3$'
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: <bearer token>" <admin url>/admin/mirroring/topic-selection -d '{"includes":["^topic1$","^topic3$"]}'
检索主题选择
您可以使用以下接口来检索镜像选择:
CLI:
ibmcloud es mirroring-topic-selection
REST API:
curl -s -X GET -H "Authorization: <bearer token>" <admin url>/admin/mirroring/topic-selection
检索活动主题
您可以使用以下界面来检索正在主动制作镜像的主题:
CLI:
ibmcloud es mirroring-active-topics
REST API:
curl -s -X GET -H "Authorization: <bearer token>" <admin url>/admin/mirroring/active-topics
构建镜像感知应用程序
生产者
我们建议生产者只生产到本地主题。 在实例之间切换生产者通常需要进行配置更改,以便生产者使用正确的端点和凭证进行连接。
使用者
使用者应预订和使用本地和远程主题中的消息。 这可通过一个通配符预订来执行。 例如,要同时订阅 accounting.invoice
和 accounting.invoice.<ALIAS>
,请订阅 accounting.invoice.*
。
当您同时使用本地和远程主题时,请检查应用程序是否需要严格排序。 在这种情况下,在开始使用本地主题之前,应先完全使用远程主题。 这样,才能按照消息的生成顺序来处理消息。
使用者偏移量
在两个实例之间对消息数据进行镜像时,有多种原因导致分配给源实例中的消息的偏移量可能与目标实例中使用的偏移量不匹配。 例如:
- 在源实例中删除并重新创建具有相同名称的主题。
- 具有压缩清除策略的镜像主题。
- 使用事务生成消息。
消息镜像过程的一部分会跟踪源实例中的哪些偏移量相当于目标实例中的哪些偏移量。 为了提高效率,仅跟踪少量等效偏移量,而主题头部附近的位置受到青睐。 为源实例中的使用者组落实偏移量时,这些偏移量将转换为目标实例中最接近的等效偏移量,并且将为目标实例中的组落实相应的偏移量。 此转换旨在确保切换到目标集群的使用者不会跳过已镜像的任何消息。 但是,由于并非每个等效偏移量都由镜像过程跟踪,因此当使用者切换到目标实例时,可能会重新处理其已在源实例中使用的数据。
在编写通过落实偏移量来跟踪使用者进度的应用程序时,请考虑以下事项:
- 仅当未在目标实例中主动使用相应的使用者组时,才会对使用者偏移量进行镜像。
- 期望在使用者移至目标实例时重新处理一些消息数据。
- 当使用者移动到目标实例时,它可能需要重新使用的数据越多,该主题的后面越远。
- 如果要最大程度地减少重新使用的数据量,并且可以仔细管理实例之间的切换应用程序,那么实现此目的建议的一组步骤是:
- 停止向源实例生成消息。
- 等到消费者追上话题的那头。
- 在此位置落实偏移量。
- 将使用者切换到目标实例。
监视镜像
您可以使用IBM Cloud Monitoring镜像。 要启用监视,请参阅监视 Event Streams 度量值。 目标集群上提供了监视仪表板。
Event Streams 镜像仪表板显示以下度量值:
- 镜像吞吐量:源 Event Streams 实例的镜像吞吐量(每秒字节数)。 这有助于查看镜像是否处于活动状态,以及容量规划。
- 镜像等待时间:源 Event Streams 实例的每主题镜像等待时间(以秒为单位)。 这对于确定落后于目标集群上的主题有多远很有用。
在延迟窗口内产生的数据可能尚未出现在目标集群上,如果源集群发生灾难,这些数据仍有可能丢失。 但是,如果镜像是最新的,那么就可以在两个集群还能正常运行时进行故障转移,而不会丢失任何数据。
了解使用镜像的恢复目标
在镜像等数据保护计划中,恢复点目标 (RPO) 和恢复时间目标 (RTO) 是关键参数。 你必须理解与这些目标相关的决定。
您可以使用镜像仪表板中提供的镜像延迟指标来监控恢复点目标。 此度量值显示两个集群之间的延迟,因此您可以估算发生灾难时的数据丢失量。 您有责任监控该价值,并确保其符合您的RPO。
恢复时间目标由用户完全控制,是由以下时间窗口构成的:
- 用户决定切换的时间。
- 用户切换应用程序所需的时间。
测试
使应用程序镜像感知时测试故障转移和回退。 完成 灾难恢复示例场景 中概述的步骤,并使用 监视 仪表板来确保所有步骤都按预期完成。
在源集群上删除并重新创建同名主题
在源集群上删除主题时,不会自动删除目标集群上的相应主题。 如果您随后在源集群上重新创建主题,那么来自源集群中新主题的数据将追加到目标集群中现有主题的末尾。
针对 Kafka Streams 和 Kafka Connect 的注意事项
Kafka Streams 和 Kafka Connect 依赖于具有特定名称的内部主题来存储状态和配置。 对这些主题进行镜像时,将在目标集群上重命名这些主题。 因此,Kafka Streams和 Kafka Connect应用程序无法在集群之间进行故障转移和故障恢复。 在规划此类应用程序的灾难恢复时,请考虑此问题。