Share via


파티션 간 처리량 재배포(미리 보기)

적용 대상: 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% 이하입니다. 이와 같은 패턴은 핫 파티션을 나타낼 수 있습니다.

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

옵션 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-AzCosmosDBSqlContainerPerPartitionThroughputGet-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 명령을 사용하여 리소스의 실제 파티션 전체에 처리량을 재배포합니다.

다음 단계

다음 문서를 사용하여 프로비저닝된 처리량을 사용하는 방법에 대해 알아봅니다.