파티션 간 처리량 재배포(미리 보기)
적용 대상: NoSQL MongoDB
기본적으로 Azure Cosmos DB는 데이터베이스 또는 컨테이너의 프로비저닝된 처리량을 모든 물리적 파티션 간에 동일하게 배포합니다. 그러나 워크로드 편향이나 파티션 키 선택으로 인해 특정 논리 및 이에 따라 물리적 파티션에 다른 파티션보다 더 많은 처리량이 필요한 시나리오가 발생할 수 있습니다. 이러한 시나리오를 위해 Azure Cosmos DB에서는 물리적 파티션 간에 프로비저닝된 처리량을 재배포하는 기능을 제공합니다. 파티션 간에 처리량을 재배포하면 가장 많이 사용되는 파티션을 기준으로 전체 처리량을 구성하지 않고도 더 나은 성능을 얻을 수 있습니다.
처리량 재배포 기능은 프로비저닝된 처리량(수동 및 자동 스케일링)을 사용하는 데이터베이스와 컨테이너에 적용되며 서버리스 컨테이너에는 적용되지 않습니다. Azure Cosmos DB PowerShell 또는 Azure CLI 명령을 사용하여 물리적 파티션당 처리량을 변경할 수 있습니다.
이 기능을 사용하는 시기
일반적으로 이 기능은 다음 두 가지 모두에 해당하는 시나리오에 사용하는 것이 좋습니다.
- 429개 응답의 전체 비율이 일관되게 1~5%보다 크게 표시됨
- 일관되고 예측 가능한 핫 파티션이 있음
429개 응답이 표시되지 않고 엔드투엔드 대기 시간이 허용되는 경우 파티션당 RU/s를 다시 구성하는 작업이 필요하지 않습니다. 모든 파티션에서 가끔 예측할 수 없는 급증과 일관된 트래픽이 포함된 워크로드가 있는 경우 자동 스케일링 및 버스트 용량(미리 보기)을 사용하는 것이 좋습니다. 자동 스케일링 및 버스트 용량을 사용하면 처리량 요구 사항을 충족할 수 있습니다. 파티션당 RU/s의 양이 적은 경우 파티션 병합(미리 보기)을 사용하여 파티션 수를 줄이고 프로비전된 동일한 총 처리량에 대해 파티션당 더 많은 RU/s를 보장할 수도 있습니다.
예제 시나리오
소매점에서 발생하는 트랜잭션을 추적하는 워크로드가 있다고 가정해 보겠습니다. 대부분의 쿼리는 StoreId
에 의해 이루어지므로 StoreId
별로 분할합니다. 그러나 시간이 지남에 따라 일부 매장은 다른 매장보다 활동이 많으며 워크로드를 제공하기 위해 더 많은 처리량이 필요하다는 것을 알 수 있습니다. 해당 StoreId에 대한 요청의 비율 제한(429)이 표시되며 429개 응답의 전체 비율은 1~5%보다 큽니다. 한편, 다른 매장은 덜 활성화되고 더 적은 처리량이 필요합니다. 성능 향상을 위해 처리량을 재배포하는 방법을 살펴보겠습니다.
1단계: 더 많은 처리량이 필요한 물리적 파티션 식별
핫 파티션이 있는지 확인하는 방법에는 두 가지가 있습니다.
옵션 1: Azure Monitor 메트릭 사용
핫 파티션이 있는지 확인하려면 인사이트>처리량>PartitionKeyRangeID별 정규화된 RU 사용량(%)으로 이동합니다. 특정 데이터베이스 및 컨테이너로 필터링합니다.
각 PartitionKeyRangeId는 하나의 물리적 파티션에 매핑됩니다. 다른 파티션보다 일관되게 정규화된 RU 사용량이 더 높은 하나의 PartitionKeyRangeId를 검색합니다. 예를 들어, 하나의 값은 일관되게 100%이지만 다른 값은 30% 이하입니다. 이와 같은 패턴은 핫 파티션을 나타낼 수 있습니다.
옵션 2: 진단 로그 사용
진단 로그의 CDBPartitionKeyRUConsumption 정보를 사용하여 두 번째 수준 세분성에서 가장 많은 RU/s를 사용하는 논리 파티션 키(및 해당 물리적 파티션)에 대한 추가 정보를 얻을 수 있습니다. 샘플 쿼리는 설명 목적으로만 24시간을 사용합니다. 패턴을 이해하려면 최소 7일의 기록을 사용하는 것이 좋습니다.
시간 경과에 따라 가장 많은 RU/s를 사용하는 물리적 파티션(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/s를 사용하는 상위 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/s 결정
각 물리적 파티션에 대한 현재 RU/s 확인
먼저 각 물리적 파티션에 대한 현재 RU/s를 확인해 보겠습니다. Azure Monitor 메트릭 PhysicalPartitionThroughput을 사용하고 PhysicalPartitionId 차원으로 분할하여 실제 파티션당 RU/s 수를 확인할 수 있습니다.
또는 이전에 파티션당 처리량을 변경하지 않은 경우 Current RU/s per partition = Total RU/s / Number of physical partitions
수식을 사용할 수 있습니다.
프로비저닝된 처리량(RU/s) 스케일링 모범 사례 문서의 참고 자료에 따라 물리적 파티션 수를 확인합니다.
또한 Get-AzCosmosDBSqlContainerPerPartitionThroughput
및 Get-AzCosmosDBMongoDBCollectionPerPartitionThroughput
PowerShell 명령을 사용하여 각 실제 파티션에서 현재 RU/s를 읽을 수 있습니다.
Install-Module
를 사용하여 시험판 기능이 사용하도록 설정된 Az.CosmosDB 모듈을 설치합니다.
$parameters = @{
Name = "Az.CosmosDB"
AllowPrerelease = $true
Force = $true
}
Install-Module @parameters
각 실제 파티션의 현재 RU/s를 읽으려면 Get-AzCosmosDBSqlContainerPerPartitionThroughput
또는 Get-AzCosmosDBSqlDatabasePerPartitionThroughput
명령을 사용합니다.
// 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/s 확인
다음으로, 가장 많이 사용되는 물리적 파티션에 제공할 RU/s 수를 결정해 보겠습니다. 이 세트를 대상 파티션이라고 하겠습니다. 실제 파티션에서 포함할 수 있는 최대 RU/s는 10,000RU/s입니다.
적합한 접근 방식은 워크로드 요구 사항에 따라 다릅니다. 일반적인 접근 방식은 다음과 같습니다.
- 백분율을 기준으로 RU/s를 늘려서 429개 응답의 비율을 측정하고 원하는 처리량이 달성될 때까지 반복합니다.
- 적합한 백분율을 잘 모르는 경우 10%로 보수적으로 시작할 수 있습니다.
- 이 물리적 파티션에 워크로드 처리량의 대부분이 필요하다는 것을 이미 알고 있으면 RU/s를 두 배로 늘리거나 최대 10,000RU/s로 늘리는 것 중 더 낮은 값으로 시작할 수 있습니다.
- RU/s를
Total consumed RU/s of the physical partition + (Number of 429 responses per second * Average RU charge per request to the partition)
으로 늘리기- 이 접근 방식은 요청 비율이 제한되지 않은 경우 “실제” RU/s 사용률을 예측하려고 합니다.
원본 파티션에 대한 RU/s 확인
마지막으로, 다른 물리적 파티션에서 유지할 RU/s 수를 결정하겠습니다. 이 선택은 대상 실제 파티션에서 처리량을 가져오는 원본 파티션을 결정합니다.
PowerShell API에서 RU/s를 재배포할 하나 이상의 원본 파티션을 지정해야 합니다. 또한 재배포 후 각 실제 파티션에 있어야 하는 사용자 지정 최소 처리량을 지정할 수 있습니다. 지정하지 않으면 기본적으로 Azure Cosmos DB는 재배포 후 각 물리적 파티션에 최소 100RU/s가 있는지 확인합니다. 최소 처리량을 명시적으로 지정하는 것이 좋습니다.
적합한 접근 방식은 워크로드 요구 사항에 따라 다릅니다. 일반적인 접근 방식은 다음과 같습니다.
- 모든 원본 파티션에서 동일하게 RU/s 사용(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/s 사용
- 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단계: 프로그래밍 방식으로 파티션 간 처리량 변경
Update-AzCosmosDBSqlContainerPerPartitionThroughput
PowerShell 명령을 사용하여 처리량을 재배포할 수 있습니다.
아래 예제를 이해하려면 총 6,000RU/s(수동 6,000RU/s 또는 자동 스케일링 6,000RU/s) 및 3개의 물리적 파티션이 있는 컨테이너를 예로 들어 보겠습니다. 분석에 따라 다음과 같은 레이아웃이 필요합니다.
- 물리적 파티션 0: 1,000RU/s
- 물리적 파티션 1: 4,000RU/s
- 물리적 파티션 2: 1,000RU/s
파티션 0과 2를 원본 파티션으로 지정하고 재배포 후 최소 RU/s가 1,000RU/s가 되도록 지정합니다. 파티션 1은 대상 파티션이며, 여기에 4000RU/s가 있도록 지정합니다.
전용 RU/s가 있는 컨테이너의 경우 Update-AzCosmosDBSqlContainerPerPartitionThroughput
을 사용하고 공유 RU/s가 있는 데이터베이스의 경우 Update-AzCosmosDBSqlDatabasePerPartitionThroughput
명령을 사용하여 실제 파티션 전체에 처리량을 재배포합니다. 공유 처리량 데이터베이스에서 실제 파티션의 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
// 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 Monitor에서 PhysicalPartitionThroughput 메트릭을 확인하여 변경 내용을 확인할 수 있습니다. PhysicalPartitionId 차원으로 분할하여 물리적 파티션당 포함할 RU/s 수를 확인합니다.
필요한 경우 컨테이너의 RU가 모든 실제 파티션에 균등하게 배포되도록 실제 파티션당 RU를 다시 설정할 수도 있습니다.
전용 RU/s가 있는 컨테이너에는 Update-AzCosmosDBSqlContainerPerPartitionThroughput
명령을 사용하고 매개 변수가 -EqualDistributionPolicy
인 공유 RU/s가 있는 데이터베이스에는 Update-AzCosmosDBSqlDatabasePerPartitionThroughput
명령을 사용하여 RU/s를 모든 실제 파티션에 균등하게 배포합니다.
// 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/s 사용률 확인 및 모니터링
재배포를 완료한 후에는 Azure Monitor에서 PhysicalPartitionThroughput 메트릭을 확인하여 변경 내용을 확인할 수 있습니다. PhysicalPartitionId 차원으로 분할하여 물리적 파티션당 포함할 RU/s 수를 확인합니다.
429개 응답의 전체 비율과 RU/s 사용률을 모니터링하는 것이 좋습니다. 자세한 내용은 1단계를 검토하여 필요한 성능을 달성했는지 유효성을 검사합니다.
변경 후 전체 워크로드가 변경되지 않았다고 가정하면 대상 및 원본 물리적 파티션에는 모두 이전보다 더 높은 정규화된 RU 사용률이 있는 것을 알 수 있습니다. 정규화된 RU 사용률이 더 높아야 합니다. 기본적으로 각 파티션이 실제로 사용해야 하는 것에 더 가깝게 RU/s를 할당했으므로 더 높은 정규화된 RU 사용률은 각 파티션이 할당된 RU/s를 완전히 활용하고 있음을 의미합니다. 이제 핫 파티션에 요청을 처리할 RU/s가 더 많으므로 429개 예외의 전체 비율이 더 낮게 표시될 것으로 예상합니다.
제한 사항
미리 보기 자격 조건
미리 보기를 사용하려면 Azure Cosmos DB 계정이 다음 기준을 모두 충족해야 합니다.
- Azure Cosmos DB 계정은 NoSQL용 API 또는 MongoDB용 API를 사용하고 있습니다.
- API for MongoDB를 사용하는 경우 버전은 3.6 이상이어야 합니다.
- Azure Cosmos DB 계정은 프로비저닝된 처리량(수동 또는 자동 크기 조정)을 사용하고 있습니다. 파티션 간 처리량 배포가 서버리스 계정에 적용되지 않습니다.
미리 보기를 사용하기 위해 등록할 필요는 없습니다. 이 기능을 사용하려면 PowerShell 또는 Azure CLI 명령을 사용하여 리소스의 실제 파티션 전체에 처리량을 재배포합니다.
다음 단계
다음 문서를 사용하여 프로비저닝된 처리량을 사용하는 방법에 대해 알아봅니다.
- 프로비저닝된 처리량에 대해 자세히 알아봅니다.
- 요청 단위에 대해 자세히 알아봅니다.
- 핫 파티션을 모니터링해야 하나요? 모니터링 요청 단위를 참조하세요.
- 모범 사례를 알아보고 싶으신가요? 프로비저닝된 처리량 스케일링 모범 사례를 참조하세요.