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

大多數電子商務應用程式對任何停機時間都是零容忍的。任何對應用程式資源的影響都可能影響網站的整體可用性指標。Azure Cosmos 數據庫是業界主要的 NoSQL 數據庫之一。儘管 Azure Cosmos 本身在沒有可用性區的單一地區提供 99.99% 的最低可用性,但我們如何利用 Azure Cosmos 中的選項進一步提高數據庫的可用性呢?

多地區讀取和寫入

單一地區的讀取將影響可用性,並且也會導致單一故障點。因此,讀取密集型應用程式至少應啟用多地區讀取,儘管多地區寫入對於應用程式來說並不是一個選項。但多地區寫入為讀取和寫入密集型應用程式提供了更高的可用性。

通過多地區寫入能力,您可以啟用多主複製,所有配置的地區都可以作為寫入端點。

最佳實踐

  • 選擇與應用程式部署地區更接近的地區。
  • 根據應用程式的需求配置多個首選地區以增強可用性。
  • 在應用程式中設置多於一個首選地區進行讀取和寫入,以提高可用性並減少延遲。
  • 將首選地區按應用程式當前或最近的地區優先順序排列。

在美國西部 2 部署的應用程式

Java

 

//配置在美國西部 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();

// 

在美國東部部署的應用程式

Java

 

//按照以下方式配置部署在East US的应用程式
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 容器中,每個項目預設都會自動建立索引。然而,排除某些項目或字段不進行索引可以幫助減少請求單位(Request Units,RUs)的消耗。添加字段進行索引與移除不需要進行索引的字段上的索引同樣重要。
  • 避免在 Azure Cosmos DB 中存儲過大的項目。
  • 盡量減少跨分區查詢。
  • 確保查詢包含篩選器以提高效率。
  • 避免重複查詢相同的分區鍵;相反,在這種用例中實施緩存層。

吞吐量自動調整

Azure Cosmos DB 支援容器級別的標準(手動)和自動調整吞吐量。

手動吞吐量

應用程式決定允許的 RU/s,並且超出 RU/s 請求將在配置的時間內被限制。需要手動介入以增加吞吐量。

自動調整吞吐量

應用程式可以配置其支持的最大吞吐量,Cosmos 根據接收到的流量自動調整自身。當超出自動調整的吞吐量時,請求將在配置的時間內被限制。

結論

儘管兩者都提供了增加可用性,但自動調整吞吐量可以靈活處理不同的流量,而無需進行限制或影響可用性。

備份和還原

Azure Cosmos DB 默認為所有帳戶啟用定期備份

定期備份

定期進行備份,每隔配置的分鐘進行一次,最小值為 1 小時,最大值為 24 小時。它還提供在 Geo、Zone 或 Local 級別保持備份存儲冗餘的選項。應用程式團隊需要聯繫支援部門來檢索備份。

持續備份

持續備份選項將備份存儲在區域的 Cosmos 數據庫中,並允許保留來自過去 7 天或過去 30 天的數據。它還提供了時間點恢復功能。

結論

選擇持續備份可確保更快速地恢復數據庫。這消除了需要與支援部門來回互動以恢復數據庫的需求,並允許應用程式在特定時間點將其還原到任何區域(存在備份的地方)。

總的來說,儘管可用性指標對任何應用程序至關重要,但也是需要付出代價的。比標準配置提供更高可用性的選項將帶來額外開支。此外,上述選項可能並非對所有使用 Cosmos 的應用程序都必要或合適。然而,在 Azure Cosmos 中採用並實施最佳實踐以有效優化可用性是至關重要的。

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