パーティション間でスループットを再分散する
適用対象: MongoDB
Azure Cosmos DB の既定では、データベースまたはコンテナーのプロビジョニング済みスループットをすべての物理パーティションに均等に分散するようになっています。 ただし、ワークロードの偏りやパーティション キーの選択により、特定の論理 (したがって物理) パーティションで他のパーティションよりも多くのスループットを必要とするシナリオが発生する可能性があります。 このようなシナリオでは、Azure Cosmos DB を使用すると、プロビジョニングされたスループットを物理パーティション間で再分散できます。 パーティション間でスループットを再分散すると、最もホットなパーティションに基づいて全体的なスループットを構成しなくても、パフォーマンス向上を実現しやすくなります。
スループット再分散機能は、プロビジョニングされたスループット (手動および自動スケーリング) を使用するデータベースとコンテナーに適用され、サーバーレス コンテナーには適用されません。 Azure Cosmos DB PowerShell または Azure CLI コマンドを使用して、物理パーティションごとのスループットを変更できます。
この機能を使用する状況
一般に、次の両方が当てはまるシナリオでは、この機能を使用することをお勧めします。
- コレクションのいくつかのパーティションでは、常に 100% の正規化された使用率が表示されます。
- 待ち時間は常に許容できるよりも長くなっています。
100% の RU 使用量が表示されず、エンドツーエンドの待ち時間を許容できる場合は、パーティションごとに RU/秒を再構成するアクションは必要ありません。
"すべてのパーティション" でワークロードのトラフィックが一貫していて、予測不能なスパイクがときおり発生する場合には、自動スケーリングとバースト容量を使用することをお勧めします。 自動スケーリングとバースト容量により、スループット要件が満たされることが確実になります。 パーティションあたりの RU/秒の量が少ない場合は、パーティション マージを使用して、パーティションの数を減らし、同じプロビジョニングされたスループットの合計に対してパーティションあたりの RU/秒を増やすこともできます。
シナリオ例
小売店で発生するトランザクションを追跡するワークロードがあるとします。 ほとんどのクエリは StoreId
によるものであるため、StoreId
によってパーティション分割します。 ただし、一定期間にわたって一部の店舗は他の店舗よりもアクティビティが多く、ワークロードを処理するために、より多くのスループットを必要とすることがわかりました。 これらの StoreId に対する要求に対して 100% 正規化された RU 消費量が表示されます。 一方、他の店舗はそれほどアクティブではなく、必要なスループットも少なくなります。 パフォーマンス向上のためにスループットをどのように再分散できるかを見てみましょう。
手順 1: より多くのスループットが必要な物理パーティションを特定する
ホット パーティションがあるかどうかを確認するには、2 つの方法があります。
オプション 1: Azure Monitor のメトリックを使用する
ホット パーティションがあるかどうかを確認するには、[分析情報]>[スループット]>[Normalized RU Consumption (%) By PartitionKeyRangeID](PartitionKeyRangeID ごとの正規化された RU 消費量 (%)) に移動します。 フィルター処理して、特定のデータベースとコンテナーを表示します。
各 PartitionKeyRangeId は、1 つの物理パーティションにマップされます。 正規化された RU 消費量が他のパーティションよりも常に多い PartitionKeyRangeId を探します。 たとえば、1 つの値は一貫して 100% ですが、他の値は 30% 以下である場合です。 このようなパターンは、ホット パーティションを示している可能性があります。
オプション 2: 診断ログを使用する
診断ログの CDBPartitionKeyRUConsumption の情報を使用して、第 2 レベルの粒度で最も RU/秒を消費している論理パーティション キー (および対応する物理パーティション) に関する詳細情報を取得できます。 サンプル クエリでは、説明のみを目的として 24 時間を使用しています。パターンを理解するには、少なくとも 7 日間の履歴を使用することをお勧めします。
一定期間にわたって最も 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, 1m), 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 Monitor メトリックである PhysicalPartitionThroughput を使用し、PhysicalPartitionId ディメンションで分割して、物理パーティションごとの 1 秒あたりの RU 数を確認できます。
または、これまでにパーティションごとのスループットを変更していない場合は、この式を使用できます: Current RU/s per partition = Total RU/s / Number of physical partitions
「プロビジョニングされたスループット (RU/秒) のスケーリングに関するベスト プラクティス」の記事にあるガイダンスに従って、物理パーティションの数を決定します。
PowerShell の Get-AzCosmosDBSqlContainerPerPartitionThroughput
および Get-AzCosmosDBMongoDBCollectionPerPartitionThroughput
コマンドを使用して、各物理パーティションの現在の RU/秒を読み取ることもできます。
Install-Module
を使って、プレリリース機能が有効になっている Az.CosmosDB モジュールをインストールします。
$parameters = @{
Name = "Az.CosmosDB"
AllowPrerelease = $true
Force = $true
}
Install-Module @parameters
Get-AzCosmosDBMongoDBCollectionPerPartitionThroughput
コマンドを使用して、各物理パーティションの現在の RU/秒を読み取ります。
// Container with dedicated RU/s
$somePartitionsDedicatedRUContainer = Get-AzCosmosDBMongoDBCollectionPerPartitionThroughput `
-ResourceGroupName "<resource-group-name>" `
-AccountName "<cosmos-account-name>" `
-DatabaseName "<cosmos-database-name>" `
-Name "<cosmos-collection-name>" `
-PhysicalPartitionIds ("<PartitionId>", "<PartitionId">, ...)
$allPartitionsDedicatedRUContainer = Get-AzCosmosDBMongoDBCollectionPerPartitionThroughput `
-ResourceGroupName "<resource-group-name>" `
-AccountName "<cosmos-account-name>" `
-DatabaseName "<cosmos-database-name>" `
-Name "<cosmos-collection-name>" `
-AllPartitions
// Database with shared RU/s
$somePartitionsSharedThroughputDatabase = Get-AzCosmosDBMongoDBDatabasePerPartitionThroughput `
-ResourceGroupName "<resource-group-name>" `
-AccountName "<cosmos-account-name>" `
-DatabaseName "<cosmos-database-name>" `
-PhysicalPartitionIds ("<PartitionId>", "<PartitionId">)
$allPartitionsSharedThroughputDatabase = Get-AzCosmosDBMongoDBDatabasePerPartitionThroughput `
-ResourceGroupName "<resource-group-name>" `
-AccountName "<cosmos-account-name>" `
-DatabaseName "<cosmos-database-name>" `
-AllPartitions
ターゲット パーティションの RU/秒を決定する
次に、最もホットな物理パーティションに指定する RU/秒の数を決定しましょう。 このセットをターゲット パーティションと呼びましょう。 任意の物理パーティションに含めることができる最大 RU/秒は 10,000 RU/秒です。
どちらの方法が最適かは各自のビジネス要件によって変わります。 一般的なアプローチを次に示します。
- RU/秒を 10% 増やし、目的のスループットが達成されるまで繰り返します。
- 適切なパーセンテージがわからない場合、控えめに最初は 10% とすることができます。
- ワークロードのスループットの大部分がこの物理パーティションで必要とされていることが既にわかっている場合は、最初に RU/秒を 2 倍にするか、最大値の 10,000 RU/秒 (いずれか小さい方) に引き上げます。
ソース パーティションの RU/秒を決定する
最後に、他の物理パーティションに対して維持する 1 秒あたりの RU 数を決定しましょう。 この選択により、ターゲット物理パーティションがスループットを取得する元のパーティションが決定されます。
PowerShell API には、RU/秒を再分散するソース パーティションを少なくとも 1 つ指定する必要があります。 再分散後に各物理パーティションに必要なカスタムの最小スループットを指定することもできます。 指定しない場合、既定では、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 Monitor メトリックと診断ログを使用して、トラフィックまたは要求のボリュームが最も少ない物理パーティションを特定する
- 各ソース物理パーティションに対するオフセットに必要な量を計算します。
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 を指定し、再分散後に 1000 RU/秒の最小 RU/秒を持つ必要があることを指定します。 パーティション 1 がターゲット パーティションであり、4000 RU/秒を指定する必要があります。
専用 RU/秒のコレクションの Update-AzCosmosDBMongoDBCollectionPerPartitionThroughput
、または共有 RU/秒を使用するデータベースの Update-AzCosmosDBMongoDBDatabasePerPartitionThroughput
コマンドを使用して、物理パーティション間でスループットを再配布します。 共有スループット データベースでは、物理パーティションの ID は GUID 文字列で表されます。
$SourcePhysicalPartitionObjects = @()
$SourcePhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "0" -Throughput 1000
$SourcePhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "2" -Throughput 1000
$TargetPhysicalPartitionObjects = @()
$TargetPhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "1" -Throughput 4000
// Collection with dedicated RU/s
Update-AzCosmosDBMongoDBCollectionPerPartitionThroughput `
-ResourceGroupName "<resource-group-name>" `
-AccountName "<cosmos-account-name>" `
-DatabaseName "<cosmos-database-name>" `
-Name "<cosmos-collection-name>" `
-SourcePhysicalPartitionThroughputObject $SourcePhysicalPartitionObjects `
-TargetPhysicalPartitionThroughputObject $TargetPhysicalPartitionObjects
// Database with shared RU/s
Update-AzCosmosDBMongoDBDatabasePerPartitionThroughput `
-ResourceGroupName "<resource-group-name>" `
-AccountName "<cosmos-account-name>" `
-DatabaseName "<cosmos-database-name>" `
-SourcePhysicalPartitionThroughputObject $SourcePhysicalPartitionObjects `
-TargetPhysicalPartitionThroughputObject $TargetPhysicalPartitionObjects
再分散が完了したら、Azure Monitor で PhysicalPartitionThroughput メトリックを表示して変更を確認できます。 物理パーティションごとの 1 秒あたりの RU 数を確認するには、PhysicalPartitionId ディメンションで分割します。
必要に応じて、物理パーティションごとの RU/秒をリセットして、コンテナーの RU/秒がすべての物理パーティションに均等に分散されるようにすることもできます。
専用 RU/秒のコレクションには Update-AzCosmosDBMongoDBCollectionPerPartitionThroughput
コマンドを使用し、パラメーター -EqualDistributionPolicy
を持つ共有 RU/秒を持つデータベースの場合は Update-AzCosmosDBMongoDBDatabasePerPartitionThroughput
コマンドを使用して、RU/秒をすべての物理パーティションに均等に分散します。
// Collection with dedicated RU/s
Update-AzCosmosDBMongoDBCollectionPerPartitionThroughput `
-ResourceGroupName "<resource-group-name>" `
-AccountName "<cosmos-account-name>" `
-DatabaseName "<cosmos-database-name>" `
-Name "<cosmos-collection-name>" `
-EqualDistributionPolicy
// Database with shared RU/s
Update-AzCosmosDBMongoDBDatabasePerPartitionThroughput `
-ResourceGroupName "<resource-group-name>" `
-AccountName "<cosmos-account-name>" `
-DatabaseName "<cosmos-database-name>" `
-EqualDistributionPolicy
手順 4: RU/秒の消費量を確認して監視する
再分散が完了したら、Azure Monitor で PhysicalPartitionThroughput メトリックを表示して変更を確認できます。 物理パーティションごとの 1 秒あたりの RU 数を確認するには、PhysicalPartitionId ディメンションで分割します。
パーティションごとの正規化された RU 消費量を監視することをお勧めします。 詳細については、手順 1 を見直して、期待するパフォーマンスが達成されたことを確認します。
変更後、全体的なワークロードが変わっていないと仮定すると、ターゲットとソースの両方の物理パーティションの正規化された RU 消費量は以前よりも多くなる可能性があります。 正規化された RU 消費量が多くなることは、予想された動作です。 基本的には、各パーティションで実際に消費する必要がある値に近い RU/秒を割り当てたので、正規化された RU 消費量が多くなることは、各パーティションで割り当てられた RU/秒が完全に利用されていることを意味します。 また、ホット パーティションで要求を処理するための RU/秒が増えたので、全体的な 429 例外の発生率は減少することがわかります。
制限事項
プレビュー資格条件
プレビューを使用するには、Azure Cosmos DB アカウントが次のすべての条件を満たしている必要があります:
- Azure Cosmos DB アカウントでは、MongoDB 用 API を使用しています。
- バージョンは、> = 3.6 である必要があります。
- Azure Cosmos DB アカウントは、プロビジョニングされたスループット (手動または自動スケーリング) を使用します。 パーティション間でのスループットの分散は、サーバーレス アカウントには適用されません。
プレビューを使用するためにサインアップする必要はありません。 この機能を使用するには、PowerShell または Azure CLI コマンドを使用して、リソースの物理パーティション間でスループットを再配布します。
次のステップ
プロビジョニングされたスループットを使用する方法については、次の記事を参照してください。
- プロビジョニングされたスループットの詳細を確認する。
- 要求ユニットの詳細を確認する。
- ホット パーティションを監視する必要がある場合 「要求ユニットの監視」を参照してください。
- ベスト プラクティスを学習するには 「プロビジョニングされたスループットのスケーリングに関するベスト プラクティス」を参照してください。
- レート制限エラーについて学習します