适用于数据库的 FinOps 最佳做法

本文概述了一系列经过验证的适用于数据库服务的 FinOps 做法。 它提供了优化成本、提高效率和使用 Azure Resource Graph (ARG) 查询来深入了解数据库资源的策略。 通过遵循这些做法,可以确保数据库服务经济高效,并与组织的财务目标保持一致。


Cosmos DB (宇宙数据库)

以下章节提供 Cosmos DB 的 ARG 查询。 这些查询可帮助你深入了解 Cosmos DB 帐户,并确保这些帐户配置了相应的请求单位(RU)。 通过分析使用模式并从 Azure Advisor 中获得建议,可以优化 RUs,提高成本效益。

查询:确认 Cosmos DB 请求单位

此 ARG 查询分析 Azure 环境中的 Cosmos DB 帐户,以确保使用适当的 RU 进行配置。

描述

此查询标识 Cosmos DB 帐户,提供根据使用模式优化其请求单位的建议。 它会显示 Azure 顾问提供的调整 RU 以提高效率的建议。

类别

优化

查询

advisorresources
| where type =~ 'microsoft.advisor/recommendations'
| where properties.impactedField == 'microsoft.documentdb/databaseaccounts'
    and properties.recommendationTypeId == '8b993855-1b3f-4392-8860-6ed4f5afd8a7'
| order by id asc
| project 
    id, subscriptionId, resourceGroup,
    CosmosDBAccountName = properties.extendedProperties.GlobalDatabaseAccountName,
    DatabaseName = properties.extendedProperties.DatabaseName,
    CollectionName = properties.extendedProperties.CollectionName,
    EstimatedAnnualSavings = bin(toreal(properties.extendedProperties.annualSavingsAmount), 1),
    SavingsCurrency = properties.extendedProperties.savingsCurrency

查询:将会受益于切换到另一个吞吐量模式的 Cosmos DB 集合

此 ARG 查询标识 Azure 环境中的 Cosmos DB 集合,这些集合可以根据 Azure Advisor 的建议将吞吐量模式切换,以获得更多好处。

描述

此查询显示 Cosmos DB 集合,这些集合具有切换吞吐量模式的建议(例如,从手动缩放切换到自动缩放,反之亦然),以优化性能和成本。 它使用 Azure 顾问建议来突出显示潜在的改进。

类别

优化

优点

  • 成本优化:识别 Cosmos DB 集合,通过根据使用模式和建议切换到更合适的吞吐量模式来节省成本。
  • 性能管理: 确保 Cosmos DB 集合使用最佳吞吐量模式,增强性能,避免过度预配或预配不足。

查询

advisorresources
| where type =~ 'microsoft.advisor/recommendations'
| where properties.impactedField == 'microsoft.documentdb/databaseaccounts'
    and properties.recommendationTypeId in (
        ' cdf51428-a41b-4735-ba23-39f3b7cde20c',
        ' 6aa7a0df-192f-4dfa-bd61-f43db4843e7d'
    )
| order by id asc
| project 
    id, subscriptionId, resourceGroup,
    CosmosDBAccountName = properties.extendedProperties.GlobalDatabaseAccountName,
    DatabaseName = properties.extendedProperties.DatabaseName,
    CollectionName = properties.extendedProperties.CollectionName,
    EstimatedAnnualSavings = bin(toreal(properties.extendedProperties.annualSavingsAmount), 1),
    SavingsCurrency = properties.extendedProperties.savingsCurrency

查询:Cosmos DB 备份模式详细信息

此 ARG 查询分析使用“定期”备份策略且未启用多个写入位置的 Cosmos DB 帐户。

类别

优化

查询

resources
| where type == "microsoft.documentdb/databaseaccounts"
| where resourceGroup in ({ResourceGroup})
| where properties.backupPolicy.type == 'Periodic'
    and tobool(properties.enableMultipleWriteLocations) == false
| extend BackupCopies = toreal(properties.backupPolicy.periodicModeProperties.backupRetentionIntervalInHours)
    / (toreal(properties.backupPolicy.periodicModeProperties.backupIntervalInMinutes) / real(60))
| where BackupCopies >= 10
    or (BackupCopies > 2
        and toint(properties.backupPolicy.periodicModeProperties.backupRetentionIntervalInHours) <= 168)
| order by id asc
| project id, CosmosDBAccountName=name, resourceGroup, subscriptionId, BackupCopies

SQL 数据库

以下部分为SQL 数据库提供 ARG 查询。 这些查询可帮助你识别可能处于空闲状态、旧数据库、开发中或用于测试目的的 SQL 数据库。 通过分析这些数据库,可以通过停用或重新利用未充分利用的资源来优化成本和提高效率。

查询:SQL DB 空闲

此 ARG 查询标识具有名称的 SQL 数据库,这些数据库指示它们可能是旧数据库、开发中或用于测试目的。

类别

优化

查询

resources
| where type == "microsoft.sql/servers/databases"
| where name contains "old" or name contains "Dev"or  name contains "test"
| where resourceGroup in ({ResourceGroup})
| extend SQLDBName = name, Type = sku.name, Tier = sku.tier, Location = location
| order by id asc
| project id, SQLDBName, Type, Tier, resourceGroup, Location, subscriptionId

查询:未使用的弹性池分析

此 ARG 查询通过分析与每个弹性池关联的数据库数来确定 Azure SQL 环境中潜在的空闲弹性池。

类别

优化

查询

resources
| where type == "microsoft.sql/servers/elasticpools"
| extend elasticPoolId = tolower(tostring(id))
| extend elasticPoolName = name
| extend elasticPoolRG = resourceGroup
| extend skuName = tostring(sku.name)
| extend skuTier = tostring(sku.tier)
| extend skuCapacity = tostring(sku.capacity)
| join kind=leftouter (
    resources
    | where type == "microsoft.sql/servers/databases"
    | extend elasticPoolId = tolower(tostring(properties.elasticPoolId))
) on elasticPoolId
| summarize databaseCount = countif(isnotempty(elasticPoolId1)) by 
    elasticPoolId,
    elasticPoolName,
    serverResourceGroup = resourceGroup,
    name,
    skuName,
    skuTier,
    skuCapacity,
    elasticPoolRG
| where databaseCount == 0
| project elasticPoolId,
    elasticPoolName,
    databaseCount,
    elasticPoolRG,
    skuName,
    skuTier,
    skuCapacity

提供反馈

请您给我们一个简短的评价,让我们知道我们做得怎么样。 我们将使用这些评审来改进和扩展 FinOps 工具和资源。

如果您在寻找特定的东西,可以为现有想法投票或者创建新想法。 与他人分享想法,以获得更多的选票。 我们专注于拥有最多选票的想法。


相关资源:

相关解决方案: