Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
По умолчанию Azure Cosmos DB распределяет подготовленную пропускную способность равномерно по всем физическим секциям. Тем не менее, если рабочая нагрузка смещена (например, если некоторые разделы постоянно нуждаются в большей пропускной способности из-за горячих ключей или неравномерного трафика), можно перераспределить пропускную способность для оптимизации производительности. Эта функция доступна для баз данных и контейнеров с выделенной пропускной способностью (вручном или автоматическом масштабировании) и может управляться через команды Azure Cosmos DB PowerShell или Azure CLI.
Например, если вы секционируете данные по StoreId в розничном приложении, то некоторые магазины могут иметь более высокую активность, чем другие. Если вы заметили частое ограничение скорости (429 ошибок) для этих занятых хранилищ, распространение пропускной способности позволяет выделить больше ресурсов в горячие секции, что повышает производительность без увеличения общей пропускной способности.
Замечание
В настоящее время по умолчанию политики предложения пропускной способности имеют значение "Равно". После распространения пропускной способности с помощью этой функции политика теперь будет иметь значение Custom, которое позволяет изменять предложение пропускной способности только через этот API. Изменение пропускной способности с помощью портала Azure будет заблокировано, но клиенты могут изменить политику на "Равно" (см. ниже), чтобы избежать этого.
Предпосылки
- Существующая учетная запись 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 Cosmos DB, используя метрики Azure Monitor, проанализируйте нормализованное потребление RU для каждого физического раздела, чтобы выявить разделы с непропорционально высоким уровнем использования.
Войдите на портал Azure (https://portal.azure.com).
Перейдите в раздел "Аналитика " для учетной записи Azure Cosmos DB на портале Azure.
Выберите пропускную способность.
Откройте нормализованное потребление (%) по PartitionKeyRangeID.
Фильтрация по определенной базе данных и контейнеру.
Просмотрите диаграмму для каждой из них
PartitionKeyRangeId, которая сопоставляется с физическим разделом.Определите любой
PartitionKeyRangeId, который последовательно показывает более высокое нормализованное потребление RU, чем другие. Например, если одно значение всегда равно 100 процентам, а другие — на 30 процентов или меньше, этот шаблон указывает на горячую секцию.
Определение горячих секций с помощью журналов диагностики
Используйте сведения из CDBPartitionKeyRUConsumption в журналах диагностики учетной записи, чтобы узнать, какие логические ключи секций и физические секции потребляют больше всего РУ/с с точностью до секунд.
Перейдите к разделу журналов диагностики для учетной записи Azure Cosmos DB.
Найдите физический раздел (
PartitionKeyRangeId), который со временем потребляет больше всего RU/s, с помощью этого запроса.CDBPartitionKeyRUConsumption | where TimeGenerated >= ago(24hr) | where DatabaseName == "MyDB" and CollectionName == "MyCollection" // Replace with your database and collection name | where isnotempty(PartitionKey) and isnotempty(PartitionKeyRangeId) | summarize sum(RequestCharge) by bin(TimeGenerated, 1s), PartitionKeyRangeId | render timechartДля физической секции найдите первые 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 your PartitionKeyRangeId | summarize sum(RequestCharge) by bin(TimeGenerated, 1hour), PartitionKey | order by sum_RequestCharge desc | take 10
Подсказка
Эти примеры запросов используют 24 часа для иллюстрации, но лучше всего использовать по крайней мере семь дней журнала для наблюдения за паттернами использования.
Определение текущей пропускной способности для каждой физической секции
Чтобы проверить текущие единицы запросов в секунду (RU/s) для каждого физического раздела, используйте метрику PhysicalPartitionThroughput и сгруппируйте по PhysicalPartitionId. Если пропускная способность для каждой секции никогда не была изменена, оцените ЕЗ/с на секцию, разделив общий ЕЗ/с на число физических секций.
Чтение текущих единиц запросов в секунду для каждой физической секции с помощью az cosmosdb sql container retrieve-partition-throughput.
// 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/s на каждой физической секции.
# 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/s).
Вычисление пропускной способности для целевого раздела
Затем давайте определим, сколько RU/s нужно предоставить самой горячей физической разделу. Назовите этот набор целевым разделом.
Перед настройкой пропускной способности в целевых секциях следует учитывать следующие моменты:
Вы можете уменьшить или увеличить пропускную способность в секции.
Физические секции могут содержать не более 10 000 RU/s.
Пользователи могут задать пропускную способность целевого раздела до максимального значения 20 000 ЕЗ/с.
- Установка пропускной способности раздела больше 10 000 ЕЗ/с приводит к его разделению, что может занять некоторое время.
Если задано значение RU/s партиции выше 10 000, партиция сначала получает 10 000 RU/s. Затем Azure Cosmos DB автоматически разделяет секцию и равномерно распределяет указанную пропускную способность между новыми секциями.
- Если физическая секция использует 5000 ЕЗ/с, и вы устанавливаете её пропускную способность на 15 000 ЕЗ/с, Azure Cosmos DB сначала назначает 10 000 ЕЗ/с исходной секции. Затем он автоматически разбивает раздел на два, оба с производительностью до 7500 RU/с.
Если окончательная сумма пропускной способности во всех секциях не равна текущей общей пропускной способности предложения, эта операция обновляет пропускную способность предложения соответствующим образом.
Наилучший подход зависит от требований рабочей нагрузки. Ниже приведены типичные подходы.
Увеличьте производительность в RU/с на указанный процент, измеряйте частоту ответов с кодом 429 и повторяйте, пока не достигнете требуемой пропускной способности.
Если вы не уверены в правильном проценте, начните с 10% быть консервативным.
Если вы знаете, что этот физический раздел требует наибольшей части пропускной способности, начните с корректировки RU/с. Удвоите ЕЗ/с или увеличьте их до максимума в 10 000 ЕЗ/с, в зависимости от того, что меньше.
Увеличьте количество RU в
Total consumed RU/s of the physical partition + (Number of 429 responses per second * Average RU charge per request to the partition).- Этот подход оценивает, каким бы было "реальное" потребление RU/с, если бы запросы не были ограничены по скорости.
Программно изменяя пропускную способность между секциями
Для перераспределения пропускной способности можно использовать команду Update-AzCosmosDBSqlContainerPerPartitionThroughput в PowerShell. Давайте рассмотрим пример с контейнером с 6000 запросов в секунду (6000 ручных запросов в секунду или автоматически масштабируемых 6000 запросов в секунду) и тремя физическими секциями. В этом примере требуется следующее распределение пропускной способности:
| Физический раздел | Назначено RU/s |
|---|---|
| 0 | 2 000 |
| 1 | 4,000 |
| 2 | 1,000 |
После перераспределения общая производительность предложения будет обновлена с 6 000 RU/с до 7 000 RU/с.
Обновите ЕЗ/с для каждой физической секции с помощью az cosmosdb sql container redistribute-partition-throughput.
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 "<PartitionId3=Throughput PartitionId4=Throughput...>"
Используйте команду Update-AzCosmosDBSqlContainerPerPartitionThroughput для контейнеров с выделенными ЕЗ/с или команду Update-AzCosmosDBSqlDatabasePerPartitionThroughput для баз данных с общими ЕЗ/с для перераспределения пропускной способности между физическими секциями. В базах данных общей пропускной способности строка GUID представляет уникальные идентификаторы физических секций.
$TargetPhysicalPartitionObjects = @()
$TargetPhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "0" -Throughput 2000
$TargetPhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "1" -Throughput 4000
$TargetPhysicalPartitionObjects += New-AzCosmosDBPhysicalPartitionThroughputObject -Id "2" -Throughput 1000
# Container with dedicated RU/s
$containerParams = @{
ResourceGroupName = "<resource-group-name>"
AccountName = "<cosmos-account-name>"
DatabaseName = "<cosmos-database-name>"
Name = "<cosmos-container-name>"
TargetPhysicalPartitionThroughputObject = $TargetPhysicalPartitionObjects
}
Update-AzCosmosDBSqlContainerPerPartitionThroughput @containerParams
Проверка пропускной способности после перераспределения
После завершения распространения пропускной способности проверьте метрику PhysicalPartitionThroughput в Azure Monitor. Разделите по измерению PhysicalPartitionId, чтобы узнать, сколько RU/s имеет каждый физический раздел. При необходимости сбросьте RU/сек для каждого физического раздела, чтобы равномерно распределять пропускную способность по всем физическим разделам.
Это важно
После перераспределения пропускной способности предложения можно изменить только с той же командой перераспределения. Чтобы равномерно распределить пропускную способность по всем секциям, используйте следующую команду.
Обновите ЕЗ/с для каждой физической секции с помощью az cosmosdb sql container redistribute-partition-throughput параметра --evenly-distribute.
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
Используйте команду Update-AzCosmosDBSqlContainerPerPartitionThroughput для контейнеров с выделенными ЕЗ/с, или команду Update-AzCosmosDBSqlDatabasePerPartitionThroughput для баз данных с общими ЕЗ/с с параметром -EqualDistributionPolicy, чтобы равномерно распределять ЕЗ/с во всех физических разделах.
# 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 Cosmos DB на портале Azure.
Проверьте метрику PhysicalPartitionThroughput в Azure Monitor. Разделите по измерению PhysicalPartitionId, чтобы просмотреть RU/s, назначенные каждому физическому разделу.
Отслеживайте общую скорость 429 ответов и потребления единиц запросов в секунду.
Просмотрите нормализованное потребление ресурсов для каждого раздела.
Замечание
Ожидается более высокое нормализованное потребление ЕЗ после перераспределения, поскольку ЕЗ/с выделяются ближе к потребностям каждого раздела. Дополнительные сведения см. в нормализованном потреблении.
Убедитесь, что общая частота исключений 429 уменьшается. Горячие разделы теперь должны иметь больше RU/с, что снижает ограничение скорости и улучшает производительность.
Ограничения
Хотя эта функция находится в предварительной версии, учетная запись Azure Cosmos DB должна соответствовать всем следующим критериям:
Учетная запись Azure Cosmos DB использует API для NoSQL или API для MongoDB.
- Если вы используете API для MongoDB, версия должна быть больше или равна 3.6.
Учетная запись Azure Cosmos DB использует резервированную пропускную способность (ручное или автомасштабирование). Распределение пропускной способности между секциями не применяется к бессерверным учетным записям.