使用 Cosmos DB 实现高可用性

适用于: SQL API Cassandra API Gremlin API 表 API Azure Cosmos DB API for MongoDB

为了生成高度可用的解决方案,必须评估其所有组件的可靠性特征。 Cosmos DB 旨在提供多种功能和配置选项,以实现满足所有解决方案可用性需求的高可用性。

我们将使用术语 RTO(恢复时间目标)来表示从影响 Cosmos DB 的中断开始到恢复完全可用性所用的时间,使用 RPO(恢复点目标)来表示从上次正确恢复写入到影响 Cosmos DB 的中断开始所用的时间。

注意

预期和最大 RPO 和 RTO 取决于 Cosmos DB 经历的中断类型。 例如,单个节点中断与整个区域中断具有不同的预期 RTO 和 RPO。

本文详细介绍可能影响 Cosmos DB 可用性的事件以及相应的 Cosmos DB 配置选项,以实现解决方案所需的可用性特征。

副本维护

Cosmos DB 是一种托管的多租户服务,可以透明地管理各个计算节点的所有详细信息。 用户不必担心任何类型的修补和计划内维护。 Cosmos DB 通过系统执行的所有自动维护操作来保证可用性和 P99 延迟的 SLA。

有关保证可用性的 SLA,请参阅 SLA 部分

副本中断

副本中断是指部署在 Azure 区域的 Cosmos DB 群集中单个节点的中断。 Cosmos DB 通过保证四个副本仲裁内的帐户的每个 Azure 区域中至少有三个数据副本,自动缓解副本中断。 这导致 RTO = 0 和 RPO = 0,对于单个节点中断,无需更改应用程序或配置。

在许多 Azure 区域中,可以将 Cosmos DB 群集分布在可用性区域中,从而提高 SLA,因为可用性区域在物理上是独立的,并提供不同的电源、网络和散热。 请参阅可用性区域。 使用可用性区域部署 Cosmos DB 帐户时,Cosmos DB 提供 RTO = 0 和 RPO = 0,即使在区域中断的情况下也是如此。

用户在单个 Azure 区域中部署时,无需额外的用户输入,Cosmos DB 可以灵活应对节点中断。 跨可用性区域启用冗余使 Cosmos DB 能够应对区域中断,但会增加费用。 SLA 部分报告了 SLA 和价格。

仅当向 Azure Cosmos 帐户添加新区域时,才能配置区域冗余。 现有区域若要启用区域冗余,可以先删除该区域,重新添加时再启用区域冗余。 对于单个区域帐户,这需要添加一个区域以作为暂时的故障转移目标,然后删除所需区域后重新添加,届时启用区域冗余。

默认情况下,Cosmos DB 帐户不使用多个可用性区域。 可以通过以下方式跨多个可用性区域启用部署:

有关 Cosmos DB 如何复制每个区域中的数据的详细信息,请参阅Azure Cosmos DB 多区域分布 - 揭秘

区域中断

区域中断是指影响 Azure 中国区域中所有可用性区域的所有 Cosmos DB 节点的中断。 在发生区域中断的极少数情况下,可以将 Cosmos DB 配置为支持持续性和可用性的各种结果。

持续性

在单个区域中部署 Cosmos DB 帐户时,通常不会发生数据丢失,并且在受影响的区域中 Cosmos DB 服务恢复后数据访问会恢复。 只有在 Cosmos DB 区域发生不可恢复的灾难时,才会发生数据丢失。

为了防止因区域灾难而导致数据完全丢失,Azure Cosmos DB 提供了 2 种不同的备份模式:

  • 连续备份确保每 100 秒在每个区域进行一次备份,并提供以秒粒度将数据还原到任何所需时间点的能力。 在每个区域,备份取决于该区域提交的数据。
  • 定期备份从帐户下的所有容器中对所有分区进行完整备份,而不会跨分区同步。 最小备份间隔为 1 小时。

在多个区域中部署 Cosmos DB 帐户时,数据持续性取决于帐户上配置的一致性级别。 下表详细说明了部署在至少 2 个区域的 Cosmos DB 帐户在所有一致性级别的 RPO。

一致性级别 发生区域中断时的 RPO
会话、一致的前缀或最终 < 15 分钟
有限过期 K&T
0

K = 某个项的“K”版本(即更新)的数目。

T = 自上次更新以来的时间间隔“T”。

对于多区域帐户,K 和 T 的最小值为 100,000 个写入操作或 300 秒 。 这定义了使用有限过期时数据的最小 RPO。

有关一致性级别之间的差异的详细信息,请参阅一致性级别

可用性

如果解决方案需要在区域中断期间保持持续可用性,则可以将 Cosmos DB 配置为跨多个区域复制数据,并在需要时透明地故障转移到可用区域。

发生区域性服务中断时,单区域帐户可能会失去可用性。 为确保始终保持高可用性,建议为 Azure Cosmos DB 帐户设置一个写入区域和至少第二个(读取)区域,并启用服务托管故障转移。

服务托管故障转移允许 Cosmos DB 对多区域帐户的写入区域进行故障转移,以便按照持续性部分以数据丢失为代价来保持可用性。 区域故障转移在 Azure Cosmos DB 客户端中进行检测和处理。 它们不需要在应用程序中进行任何更改。 有关如何启用多个读取区域和服务托管故障转移的说明,请参阅如何管理 Azure Cosmos DB 帐户

重要

强烈建议将用于生产工作负载的 Azure Cosmos 帐户配置为“启用服务托管故障转移”。 这样,Cosmos DB 就能自动将帐户数据库故障转移到可用区域。 如果不存在此配置,则帐户在写入区域中断的整个持续时间内会丢失写入可用性,因为手动故障转移会由于缺少区域连接而无法成功。

多个写入区域

Azure Cosmos DB 可以配置为接受多个区域的写入。 这有助于减少地理分散式应用程序中的写入延迟。 为多个写入区域配置 Cosmos DB 帐户时,不支持强一致性,可能会出现写入冲突。 若要详细了解如何解决多个写入区域配置中的冲突,请参阅使用多个写入区域时的冲突类型和解决策略

鉴于内部 Azure Cosmos DB 体系结构,使用多个写入区域并不能保证区域中断期间的写入可用性。 在区域中断期间实现高可用性的最佳配置是启用了服务托管故障转移的单写入区域。

冲突解决区域

当 Cosmos DB 帐户配置了多区域写入时,其中一个区域将充当仲裁者,以防发生写入冲突。 发生此类冲突时,它们将被路由到该区域,以获得一致的解决方案。

区域中断期间预计发生的情况

单区域帐户的客户端在服务恢复前会遇到读写可用性丢失的情况。

多区域帐户的情况会有所不同,具体取决于下表各条件。

Configuration 中断 可用性影响 持续性影响 要执行的操作
单个写入区域 读取区域中断 所有客户端都会自动将读取重定向到其他区域。 所有配置都不会丢失读取或写入可用性,但具有强一致性的 2 个区域除外,这些区域在服务恢复之前会丢失写入可用性,或者如果启用了服务托管故障转移,这些区域会标记为失败并发生故障转移。 无数据丢失。 在中断过程中,请确保剩余区域中预配了足够的 RU 以支持读取流量。

当中断结束时,请根据需要重新调整预配的 RU。

单个写入区域 写入区域中断 客户端将读取重定向到其他区域。

如果未启用服务托管故障转移,客户端将发生写入可用性损失,直到中断结束时自动还原写入可用性。

如果启用服务托管故障转移,客户端将发生写入可用性损失,直到服务根据偏好管理到所选新写入区域的故障转移。

如果未选择强一致性级别,则表示某些数据可能尚未复制到剩余的活动区域。 这取决于所选的一致性级别,正如本节所述。 如果受影响的区域发生永久性数据丢失,未复制的数据可能会丢失。 在中断过程中,请确保剩余区域中预配了足够的 RU 以支持读取流量。

服务中断期间不会触发手动故障转移,因为不会成功。

当中断结束时,请根据需要重新调整预配的 RU。 使用 SQL API 的帐户还可从冲突源恢复失败区域中的未复制数据。

多个写入区域 任何区域中断 可能会临时丢失写入可用性,类似于使用服务托管故障转移的单个写入区域。 如果在中断时发生大量冲突写入,冲突解决区域的故障转移也可能导致写入可用性丢失。 故障区域中最近更新的数据可能在其余的活跃区域中不可用,具体取决于所选的一致性级别。 如果受影响的区域发生永久性数据丢失,未复制的数据可能会丢失。 在中断过程中,请确保剩余区域中预配了足够的 RU 以支持额外流量。

当中断结束时,可以根据需要重新调整预配的 RU。 如果可能,Cosmos DB 将使用为 SQL API 帐户配置的冲突解决方法以及针对其他 API 帐户的 Last Write Wins 策略,自动恢复失败区域中的未复制数据。

有关读取区域中断的其他信息

  • 受影响的区域将自动断开连接,并标记为脱机。 Azure Cosmos DB SDK 会将读取调用重定向到首选区域列表中的下一个可用区域。

  • 如果首选区域列表中没有区域可用,则会自动让调用返回到当前的写入区域。

  • 处理读取区域服务中断不需要对应用程序代码进行更改。 当受影响的读取区域重新联机时,它会自动与当前写入区域同步,并再次可用于为读取请求提供服务。

  • 后续的读取会重定向到恢复的区域,不需更改应用程序代码。 在故障转移和重新加入之前发生故障的区域期间,Azure Cosmos DB 会继续提供读取一致性保证。

  • 即使在发生了 Azure 区域永久无法恢复的罕见不幸事件中,如果为多区域 Azure Cosmos 帐户配置了强一致性,也不会丢失数据。 在写入区域永久不可恢复的极少数情况下,多区域 Azure Cosmos 帐户具有持续性部分中指定的持续性特征。

有关写入区域中断的其他信息

  • 在写入区域中断期间,如果在 Azure Cosmos 帐户上配置了自动(服务托管)故障转移”,该帐户会自动将次要区域提升为新的主要写入区域。 该帐户将按指定的区域优先级顺序故障转移到其他区域。

  • 请注意,手动故障转移不应被触发,并且在源或目标区域出现故障时,不会成功。 这是因为故障转移过程需要进行一致性检查,而这需要在区域之间建立连接。

  • 当上一个受影响的区域重新联机时,可以通过冲突源使用该区域发生故障时未复制的任何写入数据。 应用程序可以读取冲突源,根据应用程序特定的逻辑解决冲突,并相应地将更新后的数据写回 Azure Cosmos 容器。

  • 以前受影响的写入区域恢复后,它将自动用作读取区域。 可以切换回到用作写入区域的已恢复区域。 可以使用 PowerShell、Azure CLI 或 Azure 门户来切换区域。 在切换写入区域之前、期间或之后,不会丢失数据或可用性,应用程序将继续保持高可用性。

SLA

下表总结了各种帐户配置的高可用性功能:

KPI 没有 AZ 的单区域 有 AZ 的单区域 没有 AZ 的多区域、单区域写入 有 AZ 的多区域、单区域写入 有或没有 AZ 的多区域、多区域写入
写入可用性 SLA 99.99% 99.995% 99.99% 99.995% 99.999%
读取可用性 SLA 99.99% 99.995% 99.999% 99.999% 99.999%
区域故障 - 数据丢失 数据丢失 无数据丢失 无数据丢失 无数据丢失 无数据丢失
区域故障 - 可用性 可用性缺失 无可用性缺失 无可用性缺失 无可用性缺失 无可用性缺失
区域性服务中断 - 数据丢失 数据丢失 数据丢失 取决于一致性级别。 有关详细信息,请参阅一致性、可用性和性能权衡 取决于一致性级别。 有关详细信息,请参阅一致性、可用性和性能权衡 取决于一致性级别。 有关详细信息,请参阅一致性、可用性和性能权衡
区域性服务中断 - 可用性 可用性缺失 可用性缺失 读取区域故障没有可用性缺失,写入区域故障有暂时缺失 读取区域故障没有可用性缺失,写入区域故障有暂时缺失 无可用性缺失
价格 (1) 空值 预配 RU/秒 x 1.25 速率 预配 RU/秒 x n 个区域 预配 RU/秒 x 1.25 速率 x n 个区域 (2) 多区域写入速率 x n 个区域

1 对于无服务器帐户,请求单位 (RU) 乘以系数 1.25。

2 1.25 速率仅适用于已启用 AZ 的区域。

重要

鉴于内部 Azure Cosmos DB 体系结构,使用多个写入区域并不能保证区域中断期间的写入可用性。 在出现区域中断时实现高可用性的最佳配置是使用服务托管故障转移的单个写入区域。

生成高可用性应用程序

  • 了解发生这些事件期间的 Azure Cosmos SDK 预期行为以及会影响它的具体配置。

  • 若要确保较高的写入和读取可用性,请将 Azure Cosmos 帐户配置为跨越至少两个区域,如果使用强一致性,则跨越至少三个区域。 请记住,在区域中断期间实现高可用性的最佳配置是启用了服务托管故障转移的单写入区域。 若要了解详细信息,请参阅教程:使用 SQL API 设置 Azure Cosmos DB 多区域分发

  • 对于配置为使用单个写入区域的多区域 Azure Cosmos 帐户,请使用 Azure CLI 或 Azure 门户启用服务托管故障转移。 启用服务托管故障转移后,每当发生区域性灾难时,Cosmos DB 都会对你的帐户进行故障转移,而无需任何用户输入。

  • 即使 Azure Cosmos 帐户具有高可用性,应用程序也不一定能够正常保持高可用性。 若要测试应用程序的端到端高可用性,请在应用程序测试或灾难恢复 (DR) 演练过程中,暂时禁用帐户的服务托管故障转移功能,使用 PowerShell、Azure CLI 或 Azure 门户调用手动故障转移,然后监视应用程序的故障转移。 完成后,可以故障回复到主区域,然后还原该帐户的服务托管故障转移。

重要

请勿在源区域或目标区域的 Cosmos DB 中断期间调用手动故障转移,因为它需要区域连接才能维护数据一致性,不会成功。

  • 在多区域分布式数据库环境中,当发生区域范围的服务中断时,一致性级别与数据持续性之间存在直接关系。 制定业务连续性计划时,需了解应用程序在中断事件发生后完全恢复之前的最大可接受时间。 应用程序完全恢复所需的时间称为恢复时间目标 (RTO)。 此外,还需要了解从中断事件恢复时,应用程序可忍受最近数据更新丢失的最长期限。 可以承受更新丢失的时限称为恢复点目标 (RPO)。 若要查看 Azure Cosmos DB 的 RPO 和 RTO,请参阅一致性级别和数据持续性

Cosmos DB 区域中断期间可能发生的情况

对于单区域帐户,客户端将出现读取和写入可用性缺失。

多区域帐户的情况会有所不同,具体取决于下表各条件。

写入区域 服务托管故障转移 期望 要执行的操作
单个写入区域 未启用 如果读取区域在使用强一致性时发生中断,所有客户端将重定向到其他区域。 不会发生读取或写入可用性缺失。 无数据丢失。 使用强一致性时,如果剩余的读取区域少于两个,则读取区域发生中断可能会影响写入可用性。

当写入区域发生服务中断时,客户端将存在写入可用性缺失。 如果未选择强一致性级别,则表示某些数据可能尚未复制到剩余的活动区域。 这取决于所选的一致性级别,正如本节所述。 如果受影响的区域发生永久性数据丢失,未复制的数据可能会丢失。

当服务中断结束时,Cosmos DB 将自动恢复写入可用性。

在中断过程中,请确保剩余区域中预配了足够的 RU 以支持读取流量。

服务中断期间不会触发手动故障转移,因为不会成功。

当中断结束时,请根据需要重新调整预配的 RU。

单个写入区域 已启用 如果读取区域在使用强一致性时发生中断,所有客户端将重定向到其他区域。 不会发生读取或写入可用性缺失。 无数据丢失。 使用强一致性时,如果剩余的读取区域少于两个,则读取区域发生中断可能会影响写入可用性。

在写入区域发生服务中断时,客户端将出现写入可用性缺失,直至 Cosmos DB 根据偏好自动选择新的区域作为新的写入区域。 如果未选择强一致性级别,则表示某些数据可能尚未复制到剩余的活动区域。 这取决于所选的一致性级别,正如本节所述。 如果受影响的区域发生永久性数据丢失,未复制的数据可能会丢失。

在中断过程中,请确保剩余区域中预配了足够的 RU 以支持读取流量。

服务中断期间不会触发手动故障转移,因为不会成功。

当中断结束时,可以将写入区域移回原始区域,并根据需要重新调整预配的 RU。 使用 SQL API 的帐户还可从冲突源恢复失败区域中的未复制数据。

多个写入区域 不适用 失败区域中最近更新的数据可能在其余的活跃区域中不可用。 最终一致性、前缀一致性和会话一致性级别可保证过期时间少于 15 分钟。 根据配置的不同,有限过期可保证更新次数低于 K 或时间少于 T 秒。 如果受影响的区域发生永久性数据丢失,未复制的数据可能会丢失。 在中断过程中,请确保剩余区域中预配了足够的 RU 以支持额外流量。

当中断结束时,可以根据需要重新调整预配的 RU。 如果可能,Cosmos DB 将使用为 SQL API 帐户配置的冲突解决方法以及针对其他 API 帐户的 Last Write Wins 策略,自动恢复失败区域中的未复制数据。

后续步骤

接下来可以阅读以下文章: