多租用戶管理和 Azure Cosmos DB

在此頁面上,我們會說明使用多租用戶系統時,Azure Cosmos DB 的一些功能很有用。 我們也連結到如何在多租用戶解決方案中使用 Azure Cosmos DB 的指引和範例。

支援多租使用者的 Azure Cosmos DB 功能

資料分割

藉由搭配 Azure Cosmos DB 容器使用分割區,您可以建立跨多個租用戶共用的容器。 一般而言,您會使用租使用者標識碼作為分割區索引鍵,但您也可以考慮針對單一租使用者使用多個分割區索引鍵。 規劃良好的數據分割策略可有效地實作 分區化模式。 Azure Cosmos DB 可透過大型容器,將您的租用戶分散到多個實體節點以擴大規模。

建議您探索使用 階層式分割區索引鍵 來改善多租用戶解決方案的效能。 階層式數據分割索引鍵可讓您建立包含多個值的分割區索引鍵。 例如,您可以使用階層式分割區索引鍵,其中包含租用戶標識碼和您要儲存的數據類型。 這種方法可讓您調整超過每個分割區索引鍵值 20 GB 的邏輯分割區限制。

其他資訊:

管理要求單位

Azure Cosmos DB 定價模型是以您布建或取用每秒的要求單位數目為基礎。 要求單位是資料庫作業或查詢成本的邏輯抽象概念。 一般而言,您會為工作負載布建每秒定義的要求單位數目,這稱為 輸送量。 Azure Cosmos DB 提供數個選項供您布建輸送量。 在多租用戶環境中,您所做的選擇會影響 Azure Cosmos DB 資源的效能和價格。

Azure Cosmos DB 的一個租用模型牽涉到為共享資料庫中的每個租使用者部署個別的容器。 Azure Cosmos DB 可讓您布建資料庫的要求單位,而且所有容器都會共用要求單位。 如果您的租使用者工作負載通常不會重疊,此方法可協助您降低營運成本。 不過,這種方法很容易受到 Noisy Neighbor 問題的影響 ,因為單一租使用者的容器可能會耗用不成比例的共用布建要求單位。 若要減輕此問題,請先識別嘈雜的租使用者。 然後,您可以選擇性地在特定容器上設定布建的輸送量。 資料庫中的其他容器會繼續共用其輸送量,但嘈雜的租用戶會取用自己的專用輸送量。

Azure Cosmos DB 也提供無伺服器層,適用於間歇性或無法預測流量的工作負載。 或者,自動調整可讓您設定原則來指定布建輸送量的調整。 此外,您可以利用 Azure Cosmos DB 高載容量,將布建輸送量容量的使用率最大化,否則速率會受到限制。 在多租用戶解決方案中,您可以結合所有這些方法來支援不同類型的租使用者。

注意

規劃 Azure Cosmos DB 設定時,請確定您考慮 服務配額和限制

若要監視和管理與每個租使用者相關聯的成本,使用 Azure Cosmos DB API 的每個作業都包含取用的要求單位。 您可以使用這項資訊來匯總和比較每個租使用者所耗用的實際要求單位,然後您可以識別具有不同效能特性的租使用者。

其他資訊:

客戶管理的金鑰

某些租使用者可能需要使用自己的加密密鑰。 Azure Cosmos DB 提供客戶管理的金鑰功能。 這項功能會套用在 Azure Cosmos DB 帳戶層級,因此需要自己加密密鑰的租用戶必須使用專用的 Azure Cosmos DB 帳戶來部署。

其他資訊:

隔離模型

使用使用 Azure Cosmos DB 的多租用戶系統時,您必須決定您想要使用的隔離等級。 企業對企業(B2B)是指向企業銷售。 企業對消費者 (B2C) 是指直接銷售給使用產品或服務的個別客戶。 Azure Cosmos DB 支持數個隔離模型:

工作負載需求 每個租用戶的數據分割索引鍵 每個租使用者的容器 (共用輸送量) 每個租使用者的容器 (專用輸送量) 每一租用戶一個資料庫 每個租用戶的資料庫帳戶
跨租用戶的查詢 簡單 (容器可作為查詢的界限) 實心 實心 實心 實心
租使用者密度 高 (每個租使用者的最低成本)
租用戶數據刪除 實心 簡單 (租用戶離開時卸除容器) 簡單 (租用戶離開時卸除容器) 簡單 (租用戶離開時卸除資料庫) 簡單 (租用戶離開時卸除資料庫)
數據存取安全性隔離 需要在應用程式內實作 容器 RBAC 容器 RBAC 資料庫 RBAC RBAC
異地複寫 每個租用戶無法進行異地複寫 根據需求將資料庫帳戶內的租使用者分組 根據需求將資料庫帳戶內的租使用者分組 根據需求將資料庫帳戶內的租使用者分組 根據需求將資料庫帳戶內的租使用者分組
嘈雜的鄰居預防 Yes .是 Yes
新的租使用者建立延遲 立即 快速 快速 緩慢
數據模型化的優點 實體共置 實體共置 多個容器來建立租用戶實體的模型 將多個容器和資料庫模型化租使用者
加密金鑰 所有租使用者的相同 所有租使用者的相同 所有租使用者的相同 所有租使用者的相同 每個租用戶的客戶受控密鑰
輸送量需求 >每個租使用者 0 個 RU >每個租使用者 100 個 RU >每個租使用者 100 個 RU(僅限自動調整,否則 >每個租使用者 400 RU) >每個租使用者 400 RU >每個租使用者 400 RU
使用案例範例 B2C 應用程式 適用於 B2B 應用程式的標準供應專案 適用於 B2B 應用程式的進階供應專案 適用於 B2B 應用程式的進階供應專案 適用於 B2B 應用程式的進階供應專案

每個租用戶的數據分割索引鍵

當您針對多個租使用者使用單一容器時,可以使用 Azure Cosmos DB 數據分割支援。 藉由為每個租使用者使用不同的分割區索引鍵,您可以輕鬆地查詢單一租用戶的數據。 您也可以跨多個租用戶進行查詢,即使租用戶位於不同的分割區中也一樣。 不過, 跨分割區查詢 的要求單位 (RU) 成本高於單一分割區查詢。

當針對每個租使用者儲存的數據量很小時,此方法通常運作良好。 建置包含免費層的定價模型,以及適用於企業對消費者(B2C)解決方案,是不錯的選擇。 一般而言,藉由使用共用容器,您可以達到租使用者的最高密度,因此每個租用戶的價格最低。

請務必考慮容器的輸送量。 所有租用戶都會共用容器的輸送量,因此 如果您的租使用者有高或重疊的工作負載,Noisy Neighbor 問題 可能會造成效能挑戰。 將租使用者子集分組到不同的容器,並確保每個租使用者群組都有相容的使用模式,有時可以減輕此問題。 或者,您可以考慮混合式多租用戶和單一租使用者模型。 將較小的租使用者分組為共用分割容器,並提供大型客戶專用容器。 此外,當依分割區建立租使用者模型時,有一些功能可協助控制嘈雜的鄰近問題,例如 Java SDK 中的輸送量重新配置、高載容量輸送量控制

也請務必考慮您在每個邏輯分割區中儲存的數據量。 Azure Cosmos DB 可讓每個邏輯分割區成長至 20 GB。 如果您有單一租使用者需要儲存超過 20 GB 的數據,請考慮將數據分散到多個邏輯分割區。 例如,您可以為租使用者建立多個分割區索引鍵,例如Contoso1Contoso2等等,而不是擁有的單一分割區索引鍵Contoso,而不是使用的單一分割區索引鍵。 當您查詢租用戶的數據時,您可以使用 WHERE IN 子句來比對所有分割區索引鍵。 階層式分割區索引鍵 也可以用來支援大型租使用者,記憶體大於 20 GB,而不需要針對每個租使用者使用綜合分割索引鍵或多個分割區索引鍵值。

請考慮解決方案的操作層面,以及租使用者生命週期的不同階段。 例如,當租使用者移至專用定價層時,您可能需要將數據移至不同的容器。 取消布建租使用者時,您必須在容器上執行刪除查詢來移除數據,而對於大型租使用者,此查詢在執行時可能會耗用大量的輸送量。

每個租使用者的容器

您可以為每個租使用者布建專用容器。 當您儲存給租用戶的數據可以合併成單一容器時,專用容器就能正常運作。 此模型提供比上述每個租使用者分割索引鍵模型更高的效能隔離,也透過 Azure RBAC 提供更高的數據存取安全性隔離

針對每個租使用者使用容器時,您可以藉由在資料庫層級布建輸送量,來考慮與其他租用戶共用輸送量。 請考慮資料庫要求單位數目下限和資料庫中容器數目上限的限制。 此外,請考慮您的租使用者是否需要保證的效能層級,以及它們是否容易受到 Noisy Neighbor 問題的影響。 當您在資料庫層級共用輸送量時,所有容器的工作負載或記憶體應該相對統一。 否則,如果有一或多個大型租使用者,您可能會有一個嘈雜的鄰近問題。 如有必要,請規劃將這些租使用者分組到以工作負載模式為基礎的不同資料庫。

或者,您可以為每個容器布建專用輸送量。 此方法適用於較大的租使用者,以及有 Noisy Neighbor 問題風險的租使用者。 不過,每個租用戶的基準輸送量較高,因此請考慮此模型的最低需求和成本影響。

如果您的租用戶數據模型需要多個實體,只要所有實體都可以共用相同的分割區索引鍵,就可以共置在相同的容器中。 不過,如果租用戶數據模型比較複雜,而且它需要無法共用相同分割區索引鍵的實體,請考慮下方每個租用戶的資料庫或每一租用戶資料庫帳戶模型。 如需更多指引,請參閱我們的文章 ,瞭解如何使用真實世界範例 在 Azure Cosmos DB 上建立數據模型和分割數據。

當容器專用於租使用者時,生命週期管理通常更簡單。 您可以在共用和專用輸送量模型之間輕鬆移動租使用者,以及在取消布建租使用者時,您可以快速刪除容器。

每一租用戶一個資料庫

您可以在相同的資料庫帳戶中,為每個租使用者布建資料庫。 如同上述每個租使用者的容器模型,此模型提供比每個租使用者分割索引鍵模型更高的效能隔離,而且也會透過 Azure RBAC 提供更高的數據存取安全性隔離。

如同下面的每一租用戶帳戶模型,此方法可提供最高等級的效能隔離,但它提供最低的租使用者密度。 不過,當每個租使用者需要比每個租使用者容器的容器中可行更複雜的數據模型時,這個選項是最佳選項。 或者,當新租使用者建立需要快速且/或沒有任何額外負荷來預先建立租用戶帳戶時,您應該遵循此方法。 對於所使用的特定軟體開發架構而言,也可能是每個租用戶的資料庫是該架構中唯一可辨識的效能隔離層級。 這類架構中通常不支持實體(容器)層級隔離和實體共置。

每個租用戶的資料庫帳戶

Azure Cosmos DB 可讓您為每個租使用者布建個別的資料庫帳戶,以提供最高等級的隔離,但密度最低。 如同上述每個租使用者的容器和每一租使用者模型,此模型提供比每個租使用者分割索引鍵模型更大的效能隔離。 它也透過 Azure RBAC 提供更高的資料存取安全性隔離。 此外,此模型會透過 客戶管理的密鑰,在租用戶層級提供資料庫加密安全性隔離。

單一資料庫帳戶專用於租使用者,這表示它們不會受到吵雜的鄰近問題。 您可以根據租使用者的需求來設定資料庫帳戶的位置。 您也可以調整 Azure Cosmos DB 功能的設定,例如異地復寫和客戶管理的加密密鑰,以符合每個租使用者的需求。 使用每個租使用者的專用 Azure Cosmos DB 帳戶時,請考慮 每個 Azure 訂用帳戶的 Azure Cosmos DB 帳戶數目上限。

如果您使用此模型,您應該考慮應用程式需要多快才能產生新的租使用者。 在 Azure Cosmos DB 中建立帳戶可能需要幾分鐘的時間,因此您可能需要預先建立帳戶。 如果此方法不可行,請考慮每個租用戶的資料庫模型。

如果您允許租使用者從共用帳戶移轉至專用的 Azure Cosmos DB 帳戶,請考慮您將用來在舊帳戶與新帳戶之間移動租用戶數據的移轉方法。

混合式方法

您可以考慮上述方法的組合,以符合不同租使用者的需求和 定價模式。 例如:

  • 在共用容器內布建所有免費試用客戶,並使用租使用者標識碼或 綜合索引鍵分割索引鍵
  • 提供付費層,以為每個租使用者部署專用容器,但在資料庫上具有共用輸送量。
  • 提供較高的 層,為租使用者的容器布建專用輸送量。
  • 提供最高 層,併為租使用者提供專用的資料庫帳戶,這也可讓租用戶選取其部署的地理位置。

參與者

本文由 Microsoft 維護。 原始投稿人如下。

主要作者:

其他投稿人:

若要查看非公開的 LinkedIn 設定檔,請登入 LinkedIn。

下一步

檢閱 多租用戶的記憶體和數據方法。

深入瞭解多租使用者和 Azure Cosmos DB:

  • Azure Cosmos DB 和多租用戶系統:一篇部落格文章,討論如何建置使用 Azure Cosmos DB 的多租用戶系統。
  • 使用 Azure Cosmos DB 的多租使用者應用程式 (影片)
  • 使用 Azure Cosmos DB 和 Azure 建置多租使用者 SaaS(影片):真實世界的案例研究,說明多租使用者 SaaS 初創公司 Whally 如何在 Azure Cosmos DB 和 Azure 上從頭開始建置現代化平臺。 Whally 會顯示它們所做的設計和實作決策,這些決策與數據分割、數據模型化、保護多租使用者、效能、從變更摘要到 SignalR 的即時串流等等有關。 所有這些解決方案都會在 Azure App 服務 上使用 ASP.NET Core。

請參閱我們其他 Cosmos DB 架構案例的一些: