共用方式為


多租用戶管理和 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/秒)可能會導致尖峰使用量期間的爭用。 如果您的租使用者有高或重疊的工作負載,此爭用可能會造成 嘈雜的鄰近問題和 效能挑戰。 對於需要在單一租戶上保證資源單位(RUs)且能夠共用輸送量的工作負載,使用此隔離模型。

  • 有限隔離: 此方法提供邏輯隔離,而非實體隔離。 它可能不符合效能或安全性觀點的嚴格隔離需求。

  • 彈性較低: 如果您透過分割區索引鍵或資料庫或容器隔離,則無法自定義帳戶層級功能,例如異地復寫、時間點還原和客戶管理的密鑰。

適用於多租戶架構的 Azure Cosmos DB 功能

  • 控制吞吐量: 探索一些功能,在您使用分區鍵隔離租戶時,幫助控制鄰近干擾問題。 在 Java SDK 中使用 輸送量重新配置突發容量輸送量控制 功能。

  • 階層式分割區索引鍵: 使用 Azure Cosmos DB,讓每個邏輯分割區的大小最多可增加 20 GB。 如果您有單一租使用者需要儲存超過 20 GB 的數據,請考慮將數據分散到多個邏輯分割區。 例如,您可以為租使用者建立多個分割區索引鍵,例如 ContosoContoso1,而不是使用單一分割區索引鍵 Contoso2 來分配分割區索引鍵。

    當您查詢租戶的數據時,您可以使用 WHERE IN 子句來匹配所有分區鍵。 如果您擁有大量租戶,您也可以使用 階層式分區鍵 來為大型租戶提供超過 20 GB 的儲存空間。 您不需要針對此方法使用綜合分割區索引鍵或每個租使用者的多個分割區索引鍵值。

    假設您有一個工作負載,能依據分割索引鍵來隔離租戶。 一個租戶 Contoso 比其他租戶更大且寫入需求更高,並且其規模會繼續增長。 若要避免無法擷取此租戶更多數據的風險,您可以使用階層式分區索引鍵。 TenantID指定為第一層索引鍵,然後新增第二層,例如 UserId。 如果您預期 TenantIDUserID 組合會產生超過 20 GB 限制的邏輯分割區,則可以進一步向下分割至另一個層級,例如 SessionID。 指定 TenantID 或同時指定 TenantIDUserID 的查詢會有效地被路由傳送至包含相關數據的實體分割區子集,以避免全範圍展開查詢。 如果容器有 1,000 個實體分割區,但特定 TenantId 值只位於五個實體分割區上,則查詢會路由傳送至較小的相關實體分割區。

    如果您的第一層沒有足夠的基數,而分割區索引鍵已達到 20 GB 的邏輯分割區限制,請考慮使用合成分割區索引鍵,而非階層式分割區索引鍵。

單一租客資料庫帳戶模型

如果您依資料庫帳戶隔離租戶,則每個租戶都有其在資料庫層級或容器層級配置的處理量。

福利

  • 高隔離: 此方法可避免因為針對每個唯一租用戶布建了請求單位(RUs)的專用 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
地理複製 針對每個租用戶無法進行異地複寫 根據需求將資料庫帳戶內的租使用者分組 根據需求將資料庫帳戶內的租使用者分組 根據需求將資料庫帳戶內的租使用者分組 根據需求將資料庫帳戶內的租使用者分組
鄰居噪音防範 .是 .是 .是
新租戶建立延遲 立即 快速 快速 中等 緩慢
數據模型化的優點 實體共置 實體共置 多個容器來建立租用戶實體的模型 使用多個容器和資料庫以建模租用者
加密金鑰 所有租戶相同 所有租戶相同 所有租戶相同 所有租戶相同 每個租戶的客戶管理金鑰
輸送量需求 >每位租戶 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。 如果您的租使用者工作負載通常不會重疊,此方法可協助您降低營運成本。 但這種方法很容易受到 噪音鄰居問題 的影響,因為單一租戶的容器可能會不成比例地消耗共用配置的資源單位 (RUs)。 若要減輕此問題,請先識別嘈雜的租使用者。 然後,您可以選擇性地在特定容器上設定布建的輸送量。 資料庫中的其他容器會續共用其吞吐量,而大量使用資源的租戶會消耗自己專屬的吞吐量。

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 維護。 原始投稿人如下。

主要作者:

其他投稿人:

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

下一步

深入了解多租戶架構和 Azure Cosmos DB。

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