如何最大化 Azure Cosmos DB 的可用性

大多数电子商务应用对任何停机时间都是零容忍的。对应用程序资源的任何影响都可能影响网站的整体可用性指标。Azure Cosmos数据库是业界广泛使用的主要NoSQL数据库之一。虽然Azure Cosmos本身为单一区域提供99.99%的最低可用性,但我们如何通过Azure Cosmos中可用的选项进一步提高数据库的可用性呢?

多区域读写

单区域读操作将影响可用性,还会导致单点故障。因此,读操作较多的应用程序应该至少启用多区域读操作,尽管多区域写操作对于某些应用程序而言不是一个选项。但是,多区域写操作可以在读操作和写操作较多的应用程序上提供更高的可用性。

通过启用多区域写操作功能,您可以启用多主复制,其中所有配置的区域都可以作为写入端点。

最佳实践

  • 根据应用程序部署的区域选择靠近的区域。
  • 根据应用程序的需求配置多个首选区域以增强可用性。
  • 为读写操作设置多个首选区域,以提高可用性并减少延迟。
  • 将首选区域按照应用程序当前或最近的区域在列表中排在首位。

应用程序部署在West US 2

Java

 

//将应用程序部署在West US 2中的配置如下

import com.azure.cosmos.CosmosClientBuilder;
import com.azure.cosmos.CosmosClient;

// ...

CosmosClientBuilder clientBuilder = new CosmosClientBuilder()
    .setEndpoint(accountEndpoint)
    .setKey(accountKey)
    .setPreferredRegions(Arrays.asList("West US 2", "East US"));

CosmosClient client = clientBuilder.buildClient();

// 

应用程序部署在East US

Java

 

//配置在东部美国部署的应用如下
import com.azure.cosmos.CosmosClientBuilder;
import com.azure.cosmos.CosmosClient;

// ...

CosmosClientBuilder clientBuilder = new CosmosClientBuilder()
    .setEndpoint(accountEndpoint)
    .setKey(accountKey)
    .setPreferredRegions(Arrays.asList( "East US","West US 2"));

CosmosClient client = clientBuilder.buildClient();

// 

结论

虽然启用多区域读写可以提供更高的可用性,但将应用程序的读写配置在部署区域附近,并提供多个首选区域可以帮助应用程序立即回退到可用区域,无需任何手动干预。

一致性级别

根据应用程序的需求选择一致性级别。更高的一致性期望通常会导致可用性降低。如果应用程序需要强数据一致性,请确保它能够容忍潜在的较高延迟。相反,如果较弱的一致性可接受,应用程序可以从改善的吞吐量和可用性中受益。

结论

选择正确的一致性级别纯粹取决于应用程序的需求,尽管更强的一致性可能会对可用性产生影响,但选择更强的一致性级别不会影响应用程序的整体可用性。

故障切换

手动故障切换

开发人员或相关人员可以登录到门户并在当前连接的区域发生故障时手动切换到下一个可用区域。尽管这个选项在一定程度上提供了可用性,但需要手动干预才能进行故障切换,这可能会影响整体站点的可用性指标。

服务管理的故障切换

启用服务管理故障转移允许 Cosmos 根据门户中配置的优先级自动切换到下一个可用区域。此选项消除了在故障转移过程中对任何应用程序进行更改的必要性。

结论

尽管两者都提供了更高的可用性,但服务管理故障转移的吞吐量提供了灵活性,可以在不担心应用程序部署的情况下故障转移到下一个可用区域。

分区键和索引

  • 在 Azure Cosmos DB 上运行任何应用程序之前,定义分区键至关重要。Cosmos DB 对于读密集型应用程序非常高效,因此在将 Cosmos DB 集成到您的应用程序之前,考虑查找标准并定义从数据库读取记录的查询是必不可少的。
  • 默认情况下,Cosmos DB 容器中的每个项目都会自动建立索引。然而,排除某些项目或字段的索引可以帮助减少请求单位(RUs)的消耗。添加字段以进行索引与移除不需要索引的字段上的索引同样重要。
  • 避免在 Azure Cosmos DB 中存储过大的项目。
  • 尽可能减少跨分区查询。
  • 确保查询包含过滤器以提高效率。
  • 避免重复查询相同的分区键;相反,在这种用例上实现缓存层。

吞吐量自动缩放

Azure Cosmos DB 支持容器级别的标准(手动)和自动缩放吞吐量。

手动吞吐量

应用程序决定允许的 RU/s,并且超出 RU/s 请求将在配置的时间内被限制。需要手动干预以增加吞吐量。

自动缩放吞吐量

应用程序可以配置其支持的最大吞吐量,Cosmos 根据接收的流量自动调整自身。超出自动缩放吞吐量时,请求将在配置的时间内被限制。

结论

尽管两者都提供了增加可用性,但自动缩放吞吐量能够灵活处理不同的流量,无需限制或影响可用性。

备份与恢复

Azure Cosmos DB 默认为所有账户启用周期性备份

周期性备份

备份定期进行,每隔配置的分钟数进行一次,最小值为 1 小时,最大值为 24 小时。还提供将备份存储冗余保留在地理位置、区域或本地级别的选项。应用团队需要联系支持团队以检索备份。

持续备份

持续备份选项将备份存储在配置的区域 Cosmos 数据库上,并允许保留最近 7 天或最近 30 天的数据。还提供按时间点恢复。

结论

选择持续备份可以确保更快速地恢复数据库。这消除了与支持团队来回交互以恢复数据库的需要,并允许应用程序在任何区域(备份存在的地方)的特定时间点进行恢复。

总的来说,虽然可用性指标对于任何应用程序都至关重要,但它们是需要付出代价的。提供比标准配置更高可用性的选项会带来额外的费用。此外,上述选项可能并非对所有使用 Cosmos 的应用程序都是必要或合适的。然而,在 Azure Cosmos 中采用并实施最佳实践以有效优化可用性是至关重要的。

Source:
https://dzone.com/articles/how-to-maximize-the-azure-cosmos-db-availability