Share via


跨分割區轉散發輸送量 (預覽)

適用於:NoSQL MongoDB

依預設,Azure Cosmos DB 會將資料庫或容器的佈建輸送量平均散發到所有實體分割區。 不過,在由於工作負載扭曲或分割區索引鍵選擇,可能會發生某些邏輯 (因而實體) 分割區需要比其他分割區更多的輸送量的情況。 針對這些案例,Azure Cosmos DB 讓您有能力跨實體分割區轉散發您佈建的輸送量。 跨分割區轉散發輸送量可協助您達到更好的效能,而不需要根據最常存取的分割區來設定整體輸送量。

輸送量轉散發功能適用於使用佈建輸送量 (手動和自動調整) 的資料庫和容器,且不適用於無伺服器容器。 您可以使用 Azure Cosmos DB PowerShell 或 Azure CLI 命令來變更每個實體分割區的輸送量。

使用此功能的時機

一般而言,當下列兩者都成立時,建議對案例使用此功能:

  • 您持續看到大於 1-5% 的整體速率 429 回應
  • 您有一致的可預測經常性分割區

如果您沒有看到 429 個回應,而且可接受端對端延遲,則不需要採取任何動作來重新設定每個分割區的 RU/秒。 如果您的工作負載具有一致的流量,且在所有分割區中偶爾出現無法預期的尖峰,建議您使用自動調整高載容量 (預覽)。 自動調整和高載容量可確保您可以符合輸送量需求。 如果您的每個分割區每秒有少量的 RU,您也可以使用分割區合併 (預覽) 來減少分割區數目,並確保相同總佈建輸送量的每個分割區每秒有更多 RU。

範例案例

假設我們有一個工作負載,可追蹤在零售商店中發生的交易。 由於大部分的查詢都是依 StoreId,我們會依 StoreId 分割。 不過,經過一段時間後,我們會看到某些商店的活動比其他人多,而且需要更多輸送量來提供其工作負載。 我們看到針對這些 StoreId 要求的速率限制 (429),而我們的整體 429 回應速率大於 1-5%。 同時,其他存放區較少作用中,而且需要較少的輸送量。 讓我們看看如何轉散發輸送量,以提升效能。

步驟 1:識別哪些實體分割區需要更多輸送量

有兩種方式可識別是否有經常性分割區。

選項 1:使用 Azure 監視器計量

若要確認是否有經常性存取層分割區,請瀏覽至 [深入解析]> [輸送量]> [依 PartitionKeyRangeID 標準化 RU 使用量 (%)]。 篩選至特定的資料庫和容器。

每個 PartitionKeyRangeId 都會與一個實體分割區對應。 尋找一個 PartitionKeyRangeId,其持續具有比其他人更高的標準化 RU 耗用量。 例如,一個值一致地為 100%,但其他值則為 30% 或更少。 這類模式可能表示經常性分割區。

Screenshot of Normalized RU Consumption by PartitionKeyRangeId chart with a hot partition.

選項 2:使用診斷記錄

我們可以使用來自診斷記錄中 CDBPartitionKeyRUConsumption 的資訊,以取得正在第二層資料細微性上取用最多 RU/秒的邏輯分割區索引鍵的詳細資訊 (和對應的實體分割區)。 請注意,範例查詢僅使用 24 小時僅為了說明 - 建議您使用至少七天的歷程記錄來了解模式。

尋找在一段時間內耗用最多 RU/秒的實體分割區 (PartitionKeyRangeId)

CDBPartitionKeyRUConsumption 
| where TimeGenerated >= ago(24hr)
| where DatabaseName == "MyDB" and CollectionName == "MyCollection" // Replace with database and collection name
| where isnotempty(PartitionKey) and isnotempty(PartitionKeyRangeId)
| summarize sum(RequestCharge) by bin(TimeGenerated, 1s), PartitionKeyRangeId
| render timechart

針對指定的實體分割區,尋找每小時耗用最多 RU/秒的前 10 個邏輯分割區索引鍵

CDBPartitionKeyRUConsumption 
| where TimeGenerated >= ago(24hour)
| where DatabaseName == "MyDB" and CollectionName == "MyCollection" // Replace with database and collection name
| where isnotempty(PartitionKey) and isnotempty(PartitionKeyRangeId)
| where PartitionKeyRangeId == 0 // Replace with PartitionKeyRangeId 
| summarize sum(RequestCharge) by bin(TimeGenerated, 1hour), PartitionKey
| order by sum_RequestCharge desc | take 10

步驟 2:判斷每個實體分割區的目標 RU/秒

判斷每個實體分割區的目前 RU/秒

首先,讓我們判斷每個實體分割區的目前 RU/秒。 您可以使用 Azure 監視器計量 PhysicalPartitionThroughput,並依維度 PhysicalPartitionId 進行分割,以查看每個實體分割區有多少 RU/秒。

或者,如果您之前未變更每個分割區的輸送量,您可以使用公式:Current RU/s per partition = Total RU/s / Number of physical partitions

請遵循調整佈建的輸送量 (RU/秒) 最佳做法一文中的指引,以判斷實體分割區的數目。

您也可以使用PowerShell Get-AzCosmosDBSqlContainerPerPartitionThroughputGet-AzCosmosDBMongoDBCollectionPerPartitionThroughput 命令來讀取每個實體分割區的目前 RU/秒。

使用 Install-Module 來安裝已啟用發行前版本功能的 Az.CosmosDB 模組。

$parameters = @{
    Name = "Az.CosmosDB"
    AllowPrerelease = $true
    Force = $true
}
Install-Module @parameters

使用 Get-AzCosmosDBSqlContainerPerPartitionThroughputGet-AzCosmosDBSqlDatabasePerPartitionThroughput 命令來讀取每個實體分割區上的目前 RU/秒。


// Container with dedicated RU/s
$somePartitionsDedicatedRUContainer = Get-AzCosmosDBSqlContainerPerPartitionThroughput `
                    -ResourceGroupName "<resource-group-name>" `
                    -AccountName "<cosmos-account-name>" `
                    -DatabaseName "<cosmos-database-name>" `
                    -Name "<cosmos-container-name>" `
                    -PhysicalPartitionIds ("<PartitionId>", "<PartitionId">)

$allPartitionsDedicatedRUContainer = Get-AzCosmosDBSqlContainerPerPartitionThroughput `
                    -ResourceGroupName "<resource-group-name>" `
                    -AccountName "<cosmos-account-name>" `
                    -DatabaseName "<cosmos-database-name>" `
                    -Name "<cosmos-container-name>" `
                    -AllPartitions

// Database with shared RU/s
$somePartitionsSharedThroughputDatabase = Get-AzCosmosDBSqlDatabasePerPartitionThroughput `
                    -ResourceGroupName "<resource-group-name>" `
                    -AccountName "<cosmos-account-name>" `
                    -DatabaseName "<cosmos-database-name>" `
                    -PhysicalPartitionIds ("<PartitionId>", "<PartitionId">)

$allPartitionsSharedThroughputDatabase = Get-AzCosmosDBSqlDatabasePerPartitionThroughput `
                    -ResourceGroupName "<resource-group-name>" `
                    -AccountName "<cosmos-account-name>" `
                    -DatabaseName "<cosmos-database-name>" `
                    -AllPartitions

判斷目標分割區的 RU/秒

接下來,讓我們決定我們要提供給最常存取的試實體分割區多少 RU/秒。 讓我們將此集合稱為目標分割區。 任何實體分割區可以包含的最大 RU/秒是 10,000 RU/秒。

正確的方法取決於您的工作負載需求。 一般方法包括:

  • 以百分比增加 RU/秒、測量 429 回應的速率,並重複直到達到所需的輸送量為止。
    • 如果您不確定適當的百分比,您可以從保守的 10% 開始。
    • 如果您已經知道此實體分割區需要大部分的工作負載輸送量,您可以從將 RU/秒加倍,或將其增加至 10,000 RU/秒的上限,較低者優先。
  • 將 RU/秒增加至 Total consumed RU/s of the physical partition + (Number of 429 responses per second * Average RU charge per request to the partition)
    • 此方法會嘗試估計要求未受到速率限制時的「真實」RU/秒耗用量。

判斷來源分割區的 RU/秒

最後,讓我們決定要保留在其他實體分割區上的 RU/秒。 此選取項目將決定目標實體分割區從中取得輸送量的分割區。

在 PowerShell API 中,我們至少必須指定一個來源分割區,以從中轉散發 RU/秒。 我們也可以指定每個實體分割區在轉散發之後應該具有的自訂最小輸送量。 如果未指定,Azure Cosmos DB 預設會確保每個實體分割區在轉散發之後至少有 100 RU/秒。 建議您明確指定最小輸送量。

正確的方法取決於您的工作負載需求。 一般方法包括:

  • 從所有來源分割區平均取得 RU/秒 (當具有 <= 10 個分割區時效果最佳)
    • 計算我們需要位移每個來源實體分割區所依據的數量。 Offset = Total desired RU/s of target partition(s) - total current RU/s of target partition(s)) / (Total physical partitions - number of target partitions)
    • 為每個來源分割區指派最小輸送量 = Current RU/s of source partition - offset
  • 從最小作用中分割區取得 RU/秒
    • 使用 Azure 監視器計量和診斷記錄來判斷哪些實體分割區具有最少流量/要求量
    • 計算我們需要位移每個來源實體分割區所依據的數量。 Offset = Total desired RU/s of target partition(s) - total current RU/s of target partition) / Number of source physical partitions
    • 為每個來源分割區指派最小輸送量 = Current RU/s of source partition - offset

步驟 3:以程式設計方式變更分割區的輸送量

您可以使用 PowerShell 命令 Update-AzCosmosDBSqlContainerPerPartitionThroughput 來轉散發輸送量。

若要了解下列範例,讓我們採用一個範例,其中我們有 6000 RU/秒總計 (手動 6000 RU/秒或自動調整 6000 RU/秒) 和 3 個實體分割區的容器。 根據我們的分析,我們想要有一個配置,其中:

  • 實體分割區 0:1000 RU/秒
  • 實體分割區 1:4000 RU/秒
  • 實體分割區 2:1000 RU/秒

我們會將分割區 0 和 2 指定為來源分割區,並指定在轉散發之後,它們應該具有的 RU/秒至少為 1000 RU/秒。 分割區 1 是目標分割區,我們指定其應該有 4000 RU/秒。

針對具有專用 RU/秒的容器使用 Update-AzCosmosDBSqlContainerPerPartitionThroughput,或針對具有共用 RU/秒的資料庫使用 Update-AzCosmosDBSqlDatabasePerPartitionThroughput 命令,以將輸送量轉散發至實體分割區。 在共用輸送量資料庫中,實體分割區的識別碼會以 GUID 字串代表。

$SourcePhysicalPartitionObjects =  @()
$SourcePhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "0" -Throughput 1000
$SourcePhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "2" -Throughput 1000

$TargetPhysicalPartitionObjects =  @()
$TargetPhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "1" -Throughput 4000

// Container with dedicated RU/s
Update-AzCosmosDBSqlContainerPerPartitionThroughput `
    -ResourceGroupName "<resource-group-name>" `
    -AccountName "<cosmos-account-name>" `
    -DatabaseName "<cosmos-database-name>" `
    -Name "<cosmos-container-name>" `
    -SourcePhysicalPartitionThroughputObject $SourcePhysicalPartitionObjects `
    -TargetPhysicalPartitionThroughputObject $TargetPhysicalPartitionObjects

// Database with shared RU/s
Update-AzCosmosDBSqlDatabasePerPartitionThroughput `
    -ResourceGroupName "<resource-group-name>" `
    -AccountName "<cosmos-account-name>" `
    -DatabaseName "<cosmos-database-name>" `
    -SourcePhysicalPartitionThroughputObject $SourcePhysicalPartitionObjects `
    -TargetPhysicalPartitionThroughputObject $TargetPhysicalPartitionObjects

完成轉散發之後,您可以在 Azure 監視器中檢視 PhysicalPartitionThroughput 計量來驗證變更。 依維度 PhysicalPartitionId 分割,以查看每個實體分割區有多少 RU/秒。

如有必要,您也可以重設每個實體分割區的 RU/秒,以將容器的 RU/秒平均分散到所有實體分割區。

針對具有專用 RU/秒的容器使用 Update-AzCosmosDBSqlContainerPerPartitionThroughput 命令,或針對具有共用 RU/秒的資料庫搭配使用 Update-AzCosmosDBSqlDatabasePerPartitionThroughput 命令與 -EqualDistributionPolicy 參數,以將 RU/秒平均散發至所有實體分割區。


// Container with dedicated RU/s
$resetPartitionsDedicatedRUContainer = Update-AzCosmosDBSqlContainerPerPartitionThroughput `
                    -ResourceGroupName "<resource-group-name>" `
                    -AccountName "<cosmos-account-name>" `
                    -DatabaseName "<cosmos-database-name>" `
                    -Name "<cosmos-container-name>" `
                    -EqualDistributionPolicy

// Database with dedicated RU/s
$resetPartitionsSharedThroughputDatabase = Update-AzCosmosDBSqlDatabasePerPartitionThroughput `
                    -ResourceGroupName "<resource-group-name>" `
                    -AccountName "<cosmos-account-name>" `
                    -DatabaseName "<cosmos-database-name>" `
                    -EqualDistributionPolicy

步驟 4:驗證並監視您的 RU/秒耗用量

完成轉散發之後,您可以在 Azure 監視器中檢視 PhysicalPartitionThroughput 計量來驗證變更。 依維度 PhysicalPartitionId 分割,以查看每個實體分割區有多少 RU/秒。

建議您監視整體 429 回應速率和 RU/秒耗用量。 如需詳細資訊,請檢閱步驟 1 來驗證您已達到預期的效能。

變更之後,假設您的整體工作負載未變更,您可能會看到目標與來源實體分割區的標準化 RU 耗用量較先前更高。 較高的標準化 RU 耗用量是預期的行為。 基本上,您已將 RU/秒配置到接近每個分割區實際需要取用的量,因此,較高的標準化 RU 耗用量表示每個分割區都完全利用其配置的 RU/秒。 您也應該預期會看到較低的整體速率 429 例外狀況,因為經常性分割區現在有更多 RU/秒可處理要求。

限制

預覽版適用性準則

若要使用預覽版,您的 Azure Cosmos DB 帳戶必須符合下列所有準則:

  • 您的 Azure Cosmos DB 帳戶使用 API for NoSQL 或 API for MongoDB。
    • 如果您使用適用於 MongoDB 的 API,則版本必須 >= 3.6。
  • 您的 Azure Cosmos DB 帳戶將會使用已佈建輸送量 (手動或自動調整)。 跨分割區的輸送量散發不適用於無伺服器帳戶。

您不需要註冊即可使用預覽。 若要使用此功能,請使用 PowerShell 或 Azure CLI 命令以將輸送量轉散發至資源的實體分割區。

下一步

使用下列文章了解如何使用佈建的輸送量: