多租用戶管理和 Azure Cosmos DB
本文說明可用於多租用戶系統的 Azure Cosmos DB 功能。 它提供如何在多租用戶解決方案中使用 Azure Cosmos DB 的指引和範例。
多租使用者需求
當您規劃多租用戶解決方案時,您有兩個主要需求:
- 協助確保租用戶之間的強式隔離,並符合需要這些租用戶的人員嚴格的安全性需求。
- 維護每個租使用者的成本較低。 身為提供者,請確定執行應用程式的成本在調整時維持持續。
這兩個需求通常可能會衝突,並引入取捨,而您必須優先處理一個需求。 本文中的指引可協助您進一步了解必須做出的取捨,以因應這些需求。 本文可協助您瀏覽這些考慮,以便在設計多租用戶解決方案時做出明智的決策。
隔離模型
判斷租用戶之間所需的隔離等級。 Azure Cosmos DB 支援一系列隔離模型,但針對大部分的解決方案,我們建議您使用下列其中一種策略:
- 每個租用戶的數據分割索引鍵通常用於完全多租用戶解決方案,例如企業對消費者軟體即服務 (B2C SaaS) 解決方案。
- 每個租用戶的資料庫帳戶通常用於企業對企業 (B2B) SaaS 解決方案。
若要選擇最適當的隔離模型,請考慮您的商務模型和租使用者的需求。 例如,某些 B2C 模型可能不是強式效能隔離的優先順序,企業會將產品或服務直接銷售給個別客戶。 不過,B2B 模型可能會設定強式安全性和效能隔離的優先順序,而且可能需要租使用者有自己的布建資料庫帳戶。
您也可以結合多個模型,以符合不同的客戶需求。 例如,假設您建置向企業客戶銷售的 B2B SaaS 解決方案,併為潛在客戶提供免費試用。 您可以為需要強式安全性和隔離保證的付費企業租使用者部署個別的資料庫帳戶。 而且,您可能會共用資料庫帳戶,並使用分割區索引鍵來隔離試用客戶。
建議的隔離模型
每個租用戶的數據分割索引鍵模型和每個租用戶資料庫帳戶模型是多租使用者解決方案最常見的隔離模型。 這些模型提供租用戶隔離與成本效益之間的最佳平衡。
每個租用戶的數據分割索引鍵模型
如果您依分割區索引鍵隔離租使用者,輸送量會跨租用戶共用,並在相同的容器內進行管理。
注意
要求單位 (RU) 是資料庫作業或查詢成本的邏輯抽象概念。 一般而言,您會為工作負載布建每秒定義的要求單位數(RU/秒),這稱為 輸送量。
福利
成本效益: 您可以將所有租使用者放在一個容器中,該容器是由租用戶標識符分割。 此方法只有一個可計費的資源,可在多個租用戶之間布建和共用 RU。 此模型通常比為每個租用戶擁有個別帳戶更符合成本效益且更容易管理。
簡化的管理: 您擁有較少的 Azure Cosmos DB 帳戶來管理。
取捨
資源爭用: 在相同容器中的租用戶之間共用輸送量(RU/秒)可能會導致尖峰使用量期間的爭用。 如果您的租使用者有高或重疊的工作負載,此爭用可能會造成 嘈雜的鄰近問題和 效能挑戰。 針對需要單一租用戶上保證 RU 且可以共用輸送量的工作負載,使用此隔離模型。
有限隔離: 此方法提供邏輯隔離,而非實體隔離。 它可能不符合效能或安全性觀點的嚴格隔離需求。
彈性較低: 如果您透過分割區索引鍵或資料庫或容器隔離,則無法自定義帳戶層級功能,例如異地復寫、時間點還原和客戶管理的密鑰。
適用於多租使用者的 Azure Cosmos DB 功能
控制輸送量: 探索可在您使用分割區索引鍵隔離租使用者時,協助控制嘈雜鄰近問題的功能。 在 Java SDK 中使用輸送量重新配置、高載容量和輸送量控制等功能。
階層式分割區索引鍵: 使用 Azure Cosmos DB,讓每個邏輯分割區的大小最多可增加 20 GB。 如果您有單一租使用者需要儲存超過 20 GB 的數據,請考慮將數據分散到多個邏輯分割區。 例如,您可以為租使用者建立多個分割區索引鍵,例如
Contoso
和Contoso1
,而不是使用的單一分割區索引鍵Contoso2
來散發分割區索引鍵。當您查詢租用戶的數據時,您可以使用
WHERE IN
子句來比對所有分割區索引鍵。 如果您有高基數的租使用者,您也可以使用 階層式分割區索引鍵 來提供記憶體大於 20 GB 的大型租使用者。 您不需要針對此方法使用綜合分割區索引鍵或每個租使用者的多個分割區索引鍵值。假設您有一個工作負載,可依分割區索引鍵隔離租使用者。 一個租使用者 Contoso 比其他租使用者更大且更大量寫入,而且其大小會繼續成長。 若要避免無法擷取此租使用者更多數據的風險,您可以使用階層式分割區索引鍵。
TenantID
指定為第一層索引鍵,然後新增第二層,例如UserId
。 如果您預期TenantID
與UserID
組合會產生超過 20 GB 限制的邏輯分割區,則可以進一步向下分割至另一個層級,例如SessionID
。 指定 或兩者的TenantID
TenantID
UserID
查詢會有效地路由傳送至包含相關數據的實體分割區子集,以避免完整展開查詢。 如果容器有 1,000 個實體分割區,但特定TenantId
值只位於五個實體分割區上,則查詢會路由傳送至較小的相關實體分割區。如果您的第一個層級沒有足夠的基數,而且您在分割區索引鍵上達到 20 GB 的邏輯分割區限制,請考慮使用綜合分割區索引鍵,而不是階層式分割區索引鍵。
每個租用戶的資料庫帳戶模型
如果您依資料庫帳戶隔離租使用者,則每個租使用者都有自己的輸送量布建在資料庫層級或容器層級。
福利
高隔離: 此方法可避免競爭或干擾,因為每個唯一租使用者布建 RU 的專用 Azure Cosmos DB 帳戶和容器。
自定義服務等級協定(SLA): 每個租使用者都有自己的帳戶,因此您可以提供特定的量身訂做資源、面向客戶的 SLA 和保證,因為您可以獨立調整每個租用戶的資料庫帳戶,以達到輸送量。
增強安全性: 實體數據隔離有助於確保健全的安全性,因為客戶可以在每個租用戶的帳戶層級啟用客戶管理的密鑰。 每個租用戶的數據都會依帳戶隔離,而不是位於相同的容器中。
彈性: 租使用者可以視需要啟用帳戶層級功能,例如異地復寫、時間點還原,以及客戶管理的密鑰。
取捨
增加管理: 這種方法比較複雜,因為您管理多個 Azure Cosmos DB 帳戶。
較高的成本: 更多帳戶表示您必須在每個租用戶的帳戶內布建輸送量,例如資料庫或容器。 每次資源布建 RU 時,您的 Azure Cosmos DB 成本都會增加。
查詢限制: 所有租用戶都位於不同的帳戶中,因此查詢多個租用戶的應用程式需要應用程式邏輯內的多個呼叫。
適用於多租使用者的 Azure Cosmos DB 功能
安全性功能:此模型透過 Azure RBAC 提供更高的資料存取安全性隔離。 此模型也會透過 客戶管理的密鑰,在租用戶層級提供資料庫加密安全性隔離。
自定義組態: 您可以根據租使用者的需求來設定資料庫帳戶的位置。 您也可以調整 Azure Cosmos DB 功能的設定,例如異地復寫和客戶管理的加密密鑰,以符合每個租使用者的需求。
當您針對每個租使用者使用專用的 Azure Cosmos DB 帳戶時,請考慮 每個 Azure 訂用帳戶的 Azure Cosmos DB 帳戶數目上限。
隔離模型的完整清單
工作負載需求 | 每個租使用者的資料分割索引鍵 (建議) | 每個租使用者的容器 (共用輸送量) | 每個租使用者的容器 (專用輸送量) | 每一租用戶一個資料庫 | 每個租使用者的資料庫帳戶 (建議) |
---|---|---|---|---|---|
跨租用戶的查詢 | 簡單 (容器可作為查詢的界限) | 實心 | 實心 | 實心 | 實心 |
租使用者密度 | 高 (每個租使用者的最低成本) | 中 | 低 | 低 | 低 |
租用戶數據刪除 | 簡單 | 簡單 (租用戶離開時卸除容器) | 簡單 (租用戶離開時卸除容器) | 簡單 (租用戶離開時卸除資料庫) | 簡單 (租用戶離開時卸除資料庫) |
數據存取安全性隔離 | 需要在應用程式內實作 | 容器 RBAC | 容器 RBAC | 資料庫 RBAC | RBAC |
異地複寫 | 每個租用戶無法進行異地複寫 | 根據需求將資料庫帳戶內的租使用者分組 | 根據需求將資料庫帳戶內的租使用者分組 | 根據需求將資料庫帳戶內的租使用者分組 | 根據需求將資料庫帳戶內的租使用者分組 |
嘈雜的鄰居預防 | No | No | .是 | .是 | .是 |
新的租使用者建立延遲 | 立即 | 快速 | 快速 | 中 | 緩慢 |
數據模型化的優點 | 無 | 實體共置 | 實體共置 | 多個容器來建立租用戶實體的模型 | 將多個容器和資料庫模型化租使用者 |
加密金鑰 | 所有租使用者的相同 | 所有租使用者的相同 | 所有租使用者的相同 | 所有租使用者的相同 | 每個租用戶客戶管理的金鑰 |
輸送量需求 | >每個租使用者 0 個 RU | >每個租使用者 100 個 RU | >每個租使用者 100 個 RU(僅限自動調整,否則 >每個租使用者 400 RU) | >每個租使用者 400 RU | >每個租使用者 400 RU |
使用案例範例 | B2C 應用程式 | 適用於 B2B 應用程式的標準供應專案 | 適用於 B2B 應用程式的進階供應專案 | 適用於 B2B 應用程式的進階供應專案 | 適用於 B2B 應用程式的進階供應專案 |
每個租使用者的容器模型
您可以為每個租使用者布建專用容器。 當您可以將您為租使用者儲存的數據合併成單一容器時,專用容器會運作良好。 此模型提供比每個租使用者分割索引鍵模型更高的效能隔離。 它也透過 Azure RBAC 提供更高的資料存取安全性隔離。
當您針對每個租使用者使用容器時,請考慮藉由在資料庫層級布建輸送量,與其他租用戶共用輸送量。 請考慮資料庫最小 RU 數目的限制和限制,以及資料庫中的容器數目上限。 也請考慮您的租使用者是否需要保證的效能層級,以及它們是否容易受到 干擾鄰近問題的影響。 當您在資料庫層級共用輸送量時,所有容器的工作負載或記憶體應該相對統一。 否則,如果您有一或多個大型租使用者,則可能有嘈雜的鄰近問題。 如有必要,請規劃將這些租使用者分組到以工作負載模式為基礎的不同資料庫。
或者,您可以為每個容器布建專用輸送量。 此方法適用於較大型的租使用者,以及面臨嘈雜鄰近問題風險的租使用者。 但每個租使用者的基準輸送量較高,因此請考慮此模型的最低需求和成本影響。
如果您的租用戶數據模型需要多個實體,而且如果所有實體都可以共用相同的分割區索引鍵,您可以在相同的容器中共置它們。 但是,如果租用戶數據模型比較複雜,而且需要無法共用相同分割區索引鍵的實體,請考慮每個租用戶的資料庫或每一租使用者資料庫帳戶模型。 如需詳細資訊,請參閱 Azure Cosmos DB 上的模型和數據分割數據。
當您將容器奉獻給租使用者時,生命週期管理通常更簡單。 您可以輕鬆地 在共用和專用輸送量模型之間移動租使用者。 當您取消布建租使用者時,您可以快速刪除容器。
每個租用戶的資料庫模型
您可以在相同的資料庫帳戶中為每個租使用者布建資料庫。 如同每個租使用者的容器模型,此模型提供比每個租使用者分割索引鍵模型更高的效能隔離。 它也透過 Azure RBAC 提供更高的資料存取安全性隔離。
與每個租用戶帳戶模型類似,此方法提供最高層級的效能隔離,但它提供最低的租使用者密度。 如果每個租使用者需要比每個租使用者容器模型中可行的更複雜的數據模型,請使用此選項。 或者,如果新的租使用者建立必須快速或不受任何額外負荷,請遵循此方法。 對於某些軟體開發架構,每個租用戶的資料庫模型可能是架構支援的唯一效能隔離層級。 這類架構通常不支持實體(容器)層級隔離和實體共置。
支援多租使用者的 Azure Cosmos DB 功能
資料分割
使用分割區搭配您的 Azure Cosmos DB 容器來建立多個租用戶共用的容器。 一般而言,您會使用租使用者標識碼作為分割區索引鍵,但您也可以考慮針對單一租使用者使用多個分割區索引鍵。 規劃良好的數據分割策略可有效地實作 分區化模式。 當您有大型容器時,Azure Cosmos DB 會將租使用者分散到多個實體節點,以達到高度的規模。
請考慮 階層式分割區索引鍵 ,以協助改善多租用戶解決方案的效能。 使用階層式數據分割索引鍵來建立包含多個值的分割區索引鍵。 例如,您可以使用包含租使用者標識碼的階層式分割索引鍵,例如高基數 GUID,以允許幾乎未繫結的縮放比例。 或者,您可以指定階層式分割區索引鍵,其中包含經常使用查詢的屬性。 這種方法可協助您避免跨分割區查詢。 使用階層式分割區索引鍵來調整超過每個分割區索引鍵值 20 GB 的邏輯分割區限制,並限制昂貴的展開查詢。
如需詳細資訊,請參閱以下資源:
管理 RU
Azure Cosmos DB 定價模型是以您布建或取用的 RU/秒數目為基礎。 Azure Cosmos DB 提供數個選項來布建輸送量。 在多租用戶環境中,您的選擇會影響 Azure Cosmos DB 資源的效能和價格。
對於需要保證效能和安全性隔離的租用戶,建議您依資料庫帳戶隔離租使用者,並將 RU 配置給租使用者。 對於需求較不嚴格的租用戶,建議您依分割區索引鍵隔離租使用者。 使用此模型在租用戶之間共用 RU,並將每個租使用者的成本優化。
Azure Cosmos DB 的替代租用模型牽涉到為共享資料庫中的每個租使用者部署個別的容器。 使用 Azure Cosmos DB 為資料庫布建 RU,讓所有容器共用 RU。 如果您的租使用者工作負載通常不會重疊,此方法可協助您降低營運成本。 但這種方法很容易受到 干擾的鄰近問題, 因為單一租使用者的容器可能會耗用不成比例的共用布建 RU 數量。 若要減輕此問題,請先識別嘈雜的租使用者。 然後,您可以選擇性地在特定容器上設定布建的輸送量。 資料庫中的其他容器會繼續共用其輸送量,但嘈雜的租用戶會取用自己的專用輸送量。
Azure Cosmos DB 也提供無伺服器層,其適用於間歇性或無法預測流量的工作負載。 或者,您可以使用自動調整來設定指定布建輸送量調整的原則。 您也可以利用 Azure Cosmos DB 高載容量,將布建輸送量容量的使用量最大化,否則會受限於速率限制。 在多租用戶解決方案中,您可以結合所有這些方法來支援不同類型的租使用者。
注意
當您規劃 Azure Cosmos DB 設定時,請考慮 服務配額和限制。
若要監視和管理與每個租使用者相關聯的成本,請記住,使用 Azure Cosmos DB API 的每個作業都包含取用的 RU。 您可以使用這項資訊來匯總和比較每個租用戶取用的實際 RU。 然後,您可以識別具有不同效能特性的租使用者。
如需詳細資訊,請參閱以下資源:
客戶管理的金鑰
某些租使用者可能需要使用自己的加密密鑰。 Azure Cosmos DB 提供客戶管理的金鑰功能。 您會在 Azure Cosmos DB 帳戶層級套用這項功能。 因此,如果租使用者需要自己的加密密鑰,您必須使用專用的 Azure Cosmos DB 帳戶來部署租使用者。
如需詳細資訊,請參閱使用 Azure Key Vault,為 Azure Cosmos DB 帳戶設定客戶自控金鑰 (部分機器翻譯)。
參與者
本文由 Microsoft 維護。 原始投稿人如下。
主要作者:
- 塔拉·巴蒂亞 |Program Manager,Azure Cosmos DB
- Paul Burpo | 主任客戶工程師,FastTrack for Azure
- John Downs | 主任軟體工程師
其他投稿人:
- Mark Brown |Azure Cosmos DB 的主要 PM 管理員
- Deborah Chen |主體計劃管理員
- Theo van Kraay |Azure Cosmos DB 資深項目經理
- Arsen Vladimirskiy | 主任客戶工程師,FastTrack for Azure
- Thomas Weiss |主體計劃管理員
- Vic Perdana |雲端解決方案架構師、Azure ISV
若要查看非公開的 LinkedIn 設定檔,請登入 LinkedIn。
下一步
深入瞭解多租使用者和 Azure Cosmos DB:
- 使用 Azure Cosmos DB 大規模設計和建置多租使用者 SaaS 應用程式:組建 2024 的研討會會引導您瞭解如何在 Azure Cosmos DB 上設計多租使用者,並了解真實世界獨立軟體廠商的最佳做法。
- Azure Cosmos DB 和多租用戶系統:一篇部落格文章,討論如何建置使用 Azure Cosmos DB 的多租用戶系統。
- 影片:使用 Azure Cosmos DB 的多租用戶應用程式
- 影片:使用 Azure Cosmos DB 和 Azure 建置多租使用者 SaaS:真實世界的案例研究,說明多租使用者 SaaS 啟動如何從頭開始在 Azure Cosmos DB 和 Azure 上建置現代化平臺。 Whally 會顯示它們所做的設計和實作決策,這些決策與數據分割、數據模型化、保護多租使用者、效能,以及從變更摘要到 SignalR 的即時串流有關。 所有這些解決方案都會在 Azure App 服務 上使用 ASP.NET Core。
相關資源
請參閱我們其他一些 Azure Cosmos DB 架構案例: