既定では、Azure Cosmos DB はプロビジョニングされたスループットをすべての物理パーティションに均等に分散します。 ただし、特定のパーティションでホット キーやトラフィックが不均一であるためにスループットが一貫して必要な場合など、ワークロードが歪んでいる場合は、スループットを再配布してパフォーマンスを最適化できます。 パーティションの RU/秒を最大 10,000 RU/秒に増やすこともできます。 ホット パーティションが最大 RU/秒の制限に達するシナリオでは、パーティションを分割することもできます。 この機能は、プロビジョニングされたスループット (手動または自動スケーリング) を使用してデータベースとコンテナーで使用でき、Azure Cosmos DB PowerShell または Azure CLI コマンドを使用して管理できます。
たとえば、小売アプリケーションで StoreId してデータをパーティション分割すると、一部のストアのアクティビティが他のストアよりも高くなる可能性があります。 これらのビジー状態のストアに対して頻繁にレート制限 (429 エラー) が発生する場合は、スループットを再配布することで、ホット パーティションにさらに多くのリソースを割り当てることができ、パフォーマンスが向上します。 この操作は、全体的なスループットを上げるか、または増やさずに実行できます。
注
単一のホット パーティション キーを持つホット パーティションを分割しても、パフォーマンスは向上しません。 分割後も、同じパーティション キーを持つすべてのデータが同じ物理パーティション上に存在します。 その結果、構成できる最大 RU/秒は 10,000 RU/秒のままです。 物理パーティションにホット パーティション キーが 1 つあるかどうかを確認するには、このクエリを参照してください。
注
現在、既定では、スループット ポリシーは "等しい" に設定されています。この機能を使用してスループットを再配布するか、カスタム スループットを物理パーティションに割り当てると、ポリシーは "カスタム" に設定されます。つまり、この API を使用してスループット (RU/秒) の設定のみを変更できます。 コンテナーまたは共有スループット データベース レベルでのスループットの変更はブロックされます。 この制限は、パーティションごとのカスタム RU/秒が確実に保持されるように設計されています。 コンテナーまたは共有スループット データベース レベルを変更する機能を再度有効にするには、スループット ポリシーを "等しい" に戻します。
[前提条件]
- 既存の Azure Cosmos DB アカウント
Azure CLI の最新バージョン
cosmosdb-preview拡張機能がインストールされているaz extension add --name cosmosdb-preview
最新バージョンの Azure PowerShell
Az.CosmosDBプレリリース機能が有効になっているモジュール$parameters = @{ Name = "Az.CosmosDB" AllowPrerelease = $true Force = $true } Install-Module @parameters
Azure Monitor メトリックを使用してホット パーティションを識別する
Azure Monitor メトリックを使用して Azure Cosmos DB のホット パーティションを識別するには、各物理パーティションの正規化された RU 消費量を調べて、使用率が高いパーティションを見つけます。
Azure portal (https://portal.azure.com) にサインインします。
Azure portal で Azure Cosmos DB アカウントの [Insights ] セクションに移動します。
[スループット] を選択します。
PartitionKeyRangeID で正規化された RU 消費量 (%) を開きます。
特定のデータベースとコンテナーにフィルターを適用します。
物理パーティションにマップされる各
PartitionKeyRangeIdのグラフを確認します。正規化された RU 消費量が他の RU よりも高いことを一貫して示す
PartitionKeyRangeIdを特定します。 たとえば、1 つの値が常に 100% で、他の値が 30% 以下の場合、このパターンはホット パーティションを示します。
診断ログを使用してホット パーティションを識別する
アカウントの診断ログの CDBPartitionKeyRUConsumption の情報を使用して、第 2 レベルの粒度で最も多くの RU/秒を消費する論理パーティション キーと物理パーティションについて説明します。 この機能を使用するには、 診断ログ が PartitionKeyRUConsumptionに対して有効になっていることを確認します。
Azure Cosmos DB アカウントの [診断ログ ] セクションに移動します。
このクエリを使用して、時間の経過と同時に最も RU/秒を消費する物理パーティション (
PartitionKeyRangeId) を見つけます。let databaseName = "MyDB" // Replace with database name let collectionName = "MyCollection" // Replace with collection name CDBPartitionKeyRUConsumption | where TimeGenerated >= ago(24hr) | where DatabaseName == databaseName and CollectionName == collectionName | where isnotempty(PartitionKey) and isnotempty(PartitionKeyRangeId) | summarize sum(RequestCharge) by bin(TimeGenerated, 1s), PartitionKeyRangeId | render timechart物理パーティションの場合は、このクエリを使用して、1 時間あたり最大 RU/秒を消費する上位の論理パーティション キーを見つけます。
let databaseName = "MyDB"; // Replace with database name let collectionName = "MyCollection"; // Replace with collection name let partitionKeyRangeId = 0; // Replace with your PartitionKeyRangeId CDBPartitionKeyRUConsumption | where TimeGenerated >= ago(24hour) | where DatabaseName == databaseName and CollectionName == collectionName | where isnotempty(PartitionKey) and isnotempty(PartitionKeyRangeId) | where PartitionKeyRangeId == partitionKeyRangeId | summarize RU_Usage = sum(RequestCharge) by bin(TimeGenerated, 1h), PartitionKey | join kind=inner ( CDBPartitionKeyRUConsumption | where TimeGenerated >= ago(24hour) | where DatabaseName == databaseName and CollectionName == collectionName | where isnotempty(PartitionKey) and isnotempty(PartitionKeyRangeId) | where PartitionKeyRangeId == partitionKeyRangeId | summarize TotalRU_PerHour = sum(RequestCharge) by bin(TimeGenerated, 1h) ) on TimeGenerated | extend RU_Percentage = round(RU_Usage * 100.00 / TotalRU_PerHour, 2) | project Hour = TimeGenerated, PartitionKey, RU_Usage, TotalRU_PerHour, RU_Percentage | order by Hour asc, RU_Percentage desc
これらのサンプル クエリでは、説明のために 24 時間を使用しますが、使用パターンを確認するには、少なくとも 7 日間の履歴を使用することをお勧めします。
各物理パーティションの現在のスループットを決定する
各物理パーティションの現在の RU/秒を確認するには、Azure Monitor メトリック PhysicalPartitionThroughput を使用し、 PhysicalPartitionId で分割します。 パーティションあたりのスループットが変更されなかった場合は、合計 RU/秒を物理パーティションの数で割って、パーティションあたりの RU/秒を見積もります。
az cosmosdb sql container retrieve-partition-throughput を使用して、各物理パーティションの現在の RU/秒を読み取ります。 この CLI コマンドに相当する共有スループットはありません。
// Container with dedicated RU/s - some partitions
az cosmosdb sql container retrieve-partition-throughput \
--resource-group "<resource-group-name>" \
--account-name "<cosmos-account-name>" \
--database-name "<cosmos-database-name>" \
--name "<cosmos-container-name>" \
--physical-partition-ids "<space-separated-list-of-physical-partition-ids>"
// Container with dedicated RU/s - all partitions
az cosmosdb sql container retrieve-partition-throughput \
--resource-group "<resource-group-name>" \
--account-name "<cosmos-account-name>" \
--database-name "<cosmos-database-name>" \
--name "<cosmos-container-name>"
--all-partitions
Get-AzCosmosDBSqlContainerPerPartitionThroughputまたは Get-AzCosmosDBSqlDatabasePerPartitionThroughput コマンドを使用して、各物理パーティションの現在の RU/秒を読み取ります。
# Container with dedicated RU/s - some partitions
$containerParams = @{
ResourceGroupName = "<resource-group-name>"
AccountName = "<cosmos-account-name>"
DatabaseName = "<cosmos-database-name>"
Name = "<cosmos-container-name>"
PhysicalPartitionIds = @("<PartitionId>", "<PartitionId>")
}
$somePartitionsDedicatedRUContainer = Get-AzCosmosDBSqlContainerPerPartitionThroughput @containerParams
# Container with dedicated RU/s - all partitions
$containerAllParams = @{
ResourceGroupName = "<resource-group-name>"
AccountName = "<cosmos-account-name>"
DatabaseName = "<cosmos-database-name>"
Name = "<cosmos-container-name>"
AllPartitions = $true
}
$allPartitionsDedicatedRUContainer = Get-AzCosmosDBSqlContainerPerPartitionThroughput @containerAllParams
# Database with shared RU/s - some partitions
$databaseParams = @{
ResourceGroupName = "<resource-group-name>"
AccountName = "<cosmos-account-name>"
DatabaseName = "<cosmos-database-name>"
PhysicalPartitionIds = @("<PartitionId>", "<PartitionId>")
}
$somePartitionsSharedThroughputDatabase = Get-AzCosmosDBSqlDatabasePerPartitionThroughput @databaseParams
# Database with shared RU/s - all partitions
$databaseAllParams = @{
ResourceGroupName = "<resource-group-name>"
AccountName = "<cosmos-account-name>"
DatabaseName = "<cosmos-database-name>"
AllPartitions = $true
}
$allPartitionsSharedThroughputDatabase = Get-AzCosmosDBSqlDatabasePerPartitionThroughput @databaseAllParams
注
パーティションの数を見つける方法の詳細については、 プロビジョニングされたスループット (RU/秒) のスケーリングに関するベスト プラクティスを参照してください。
ターゲット パーティションのスループットを計算する
次に、最もホットな物理パーティションに与える RU/秒の数を決めましょう。 これをターゲット パーティションとします。
ターゲット パーティションでスループットを設定する前に、次の点に注意してください。
パーティションのスループットを下げるか、増やすことができます。
物理パーティションには、最大 10,000RU/秒しか含めできません。
ユーザーは、ターゲット パーティションのスループットを最大値 の 20,000RU/秒に設定できます。
- パーティションを 10,000 RU/秒を超えるスループット値に設定すると、パーティション分割が行われます。時間がかかる場合があります。
パーティションの RU/秒を 10,000 を超えて設定した場合、最初に 10,000 RU/秒を受け取ります。 その後、Azure Cosmos DB によってパーティションが自動的に分割され、指定されたスループットが新しいパーティションに均等に分散されます。
- 物理パーティションで 5,000 RU/秒を使用していて、そのスループットを 15,000 RU/秒に設定した場合、Azure Cosmos DB は最初に 10,000 RU/秒を元のパーティションに割り当てます。 その後、パーティションが 2 つに自動的に分割され、それぞれ 7,500 RU/秒になります。
すべてのパーティションのスループットの最終的な合計が、すべてのパーティションのスループットの現在の合計と等しくない場合、この操作はそれに応じて合計スループット設定を更新します。
- たとえば、コンテナーに 10,000 RU/秒と、それぞれ 5000 RU/秒の 2 つの物理パーティション P1 と P2 があるとします。 P1 に 20,000 RU/秒を割り当てると、コンテナーの新しい合計スループットは 25,000 RU/秒になります。
どちらの方法が最適かは各自のビジネス要件によって変わります。 一般的なアプローチを次に示します。
RU/秒をパーセンテージで増やし、429 応答の割合を測定し、目的のスループットに達するまで繰り返します。
適切なパーセンテージがわからない場合は、10% から始めて保守的にしてください。
この物理パーティションにほとんどのスループットが必要であることがわかっている場合は、まず RU/秒を調整します。 RU/秒を 2 倍にするか、最大 10,000 RU/秒 (いずれか低い方) に増やします。 10,000 RU/秒で十分ではなく、パーティションにホット キーが 1 つしかない場合は、最大 20,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/秒の消費量が見積もられます。
パーティション間でスループットをプログラムで変更する
合計 6,000 RU/秒 (6,000 手動 RU/秒または自動スケーリング 6,000 RU/秒) と 2 つの物理パーティションを持つコンテナーの例を見てみましょう。 この例では、次のスループット分散が必要です。
| 物理パーティション | 現在の RU/秒 | ターゲット RU/秒 |
|---|---|---|
| 0 | 3,000 | 5,000 |
| 1 | 3,000 | 20,000 |
再配布後、すべてのパーティションの合計スループットが 6,000 RU/秒から 25,000 RU/秒に更新され、スループットが分散されます。
| 物理パーティション | 現在の RU/秒 |
|---|---|
| 0 | 5,000 |
| 2 | 10,000 |
| 3 | 10,000 |
az cosmosdb sql container redistribute-partition-throughput を使用して、各物理パーティションの現在の RU/秒を更新します。 この CLI コマンドに相当する共有スループットはありません。
az cosmosdb sql container redistribute-partition-throughput \
--resource-group "<resource-group-name>" \
--account-name "<cosmos-account-name>" \
--database-name "<cosmos-database-name>" \
--name "<cosmos-container-name>" \
--target-partition-info "<0=5000 1=20000...>"
専用 RU/秒のコンテナーの Update-AzCosmosDBSqlContainerPerPartitionThroughput 、または共有 RU/秒を使用するデータベースの Update-AzCosmosDBSqlDatabasePerPartitionThroughput コマンドを使用して、物理パーティション間でスループットを再配布します。 共有スループット データベースでは、GUID 文字列は物理パーティションの一意の識別子を表します。
$SourcePhysicalPartitionObjects = @()
$TargetPhysicalPartitionObjects = @()
$TargetPhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "0" -Throughput 5000
$TargetPhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "1" -Throughput 20000
# Container with dedicated RU/s
$containerParams = @{
ResourceGroupName = "<resource-group-name>"
AccountName = "<cosmos-account-name>"
DatabaseName = "<cosmos-database-name>"
Name = "<cosmos-container-name>"
TargetPhysicalPartitionThroughputObject = $TargetPhysicalPartitionObjects
SourcePhysicalPartitionThroughputObject = $SourcePhysicalPartitionObjects
}
Update-AzCosmosDBSqlContainerPerPartitionThroughput @containerParams
# Shared Database RU/s
$dbParams = @{
ResourceGroupName = "<resource-group-name>"
AccountName = "<cosmos-account-name>"
DatabaseName = "<cosmos-database-name>"
TargetPhysicalPartitionThroughputObject = $TargetPhysicalPartitionObjects
SourcePhysicalPartitionThroughputObject = $SourcePhysicalPartitionObjects
}
Update-AzCosmosDBSqlDatabasePerPartitionThroughput @dbParams
再配布後のスループットを確認する
スループットの再配布が完了したら、Azure Monitor で PhysicalPartitionThroughput メトリックを確認します。 PhysicalPartitionId ディメンションで分割して、各物理パーティションの RU/秒の数を確認します。 必要に応じて、物理パーティションごとに RU/秒をリセットして、すべての物理パーティションにスループットを均等に分散します。
Important
スループットを再配布した後は、同じ再配布コマンドでのみスループット設定を変更できます。 すべてのパーティションにスループットを均等に分散するには、 az cosmosdb sql container redistribute-partition-throughput コマンドを使用します。
パラメーター az cosmosdb sql container redistribute-partition-throughput で --evenly-distributeを使用して、各物理パーティションの RU/秒を更新します。 この CLI コマンドに相当する共有スループットはありません。
az cosmosdb sql container redistribute-partition-throughput \
--resource-group "<resource-group-name>" \
--account-name "<cosmos-account-name>" \
--database-name "<cosmos-database-name>" \
--name "<cosmos-container-name>" \
--evenly-distribute
専用 RU/秒のコンテナーには Update-AzCosmosDBSqlContainerPerPartitionThroughput コマンドを使用し、パラメーター Update-AzCosmosDBSqlDatabasePerPartitionThroughputを持つ共有 RU/秒を持つデータベースの場合は -EqualDistributionPolicy コマンドを使用して、RU/秒をすべての物理パーティションに均等に分散します。
# Container with dedicated RU/s
$containerParams = @{
ResourceGroupName = "<resource-group-name>"
AccountName = "<cosmos-account-name>"
DatabaseName = "<cosmos-database-name>"
Name = "<cosmos-container-name>"
EqualDistributionPolicy = $true
}
$resetPartitionsDedicatedRUContainer = Update-AzCosmosDBSqlContainerPerPartitionThroughput @containerParams
# Database with dedicated RU/s
$databaseParams = @{
ResourceGroupName = "<resource-group-name>"
AccountName = "<cosmos-account-name>"
DatabaseName = "<cosmos-database-name>"
EqualDistributionPolicy = $true
}
$resetPartitionsSharedThroughputDatabase = Update-AzCosmosDBSqlDatabasePerPartitionThroughput @databaseParams
スループットの消費量を確認して監視する
スループットの再配布が完了したら、RU/秒の使用量を確認して監視し、最適なパフォーマンスを確保します。 次の手順に従います。
Azure portal で Azure Cosmos DB アカウントの [メトリック] セクションに移動します。
Azure Monitor で PhysicalPartitionThroughput メトリックを確認します。 PhysicalPartitionId ディメンションで分割して、各物理パーティションに割り当てられている RU/秒を表示します。
429 応答と RU/秒の消費量の全体的なレートを監視します。
各パーティションの 正規化された RU 消費量 を確認します。
注
RU/秒は各パーティションのニーズに近い位置に割り当てられるので、再配布後に正規化された RU 消費量が増えると予想されます。 詳細については、「 正規化された RU 消費量」を参照してください。
429 例外の全体的な割合が減少していることを確認します。 ホットパーティションにより多くのRU/秒が割り当てられ、レート制限が削減され、パフォーマンスが向上します。
制限事項
このプレビュー機能を使用するには、Azure Cosmos DB アカウントが次のすべての条件を満たしている必要があります。
Azure Cosmos DB for NoSQL または Azure Cosmos DB for MongoDB アカウントが必要です。
MongoDB 用 API を使用している場合、バージョンは 3.6 以上である必要があります。
Azure Cosmos DB アカウントでは、プロビジョニングされたスループット (手動または自動スケーリング) が使用されます。 パーティション間でのスループットの分散は、サーバーレス アカウントには適用されません。