程序化方法优化 Amazon RDS 快照成本 数据库博客

优化 Amazon RDS 快照成本的编程方法

作者:Vivek Singh 和 Pavan Pusuluri | 发布于 2024年4月17日
在这篇文章中,我们将探讨如何通过编程策略管理 Amazon RDS 快照,从而优化相关成本。文章将介绍识别和删除旧的或孤立的快照的方法,并提供使用 AWS命令行接口(CLI)和 AWS 成本和使用报告的实例。这些方法将帮助您降低快照存储费用,提升云成本管理效率。

关键要点

  1. 了解快照 :Amazon RDS 提供自动和手动快照,管理快照的状态对于成本优化至关重要。
  2. 管理快照 :使用 AWS CLI 命令识别、删除过期和孤立的快照。
  3. 监控费用 :定期审查 AWS 成本和使用报告,以了解快照相关的费用趋势。
  4. 使用工具 :借助 Amazon Athena 和 AWS 成本探测器,实现深入的成本分析和优化。

Amazon关系数据库服务(RDS)的一个主要优势是能够自动创建数据库实例的存储卷快照。这些快照根据指定的备份保留周期自动保存数据库的备份。尽管过量配置的快照不会引起应用程序中断或性能影响,但会增加总体的 RDS 快照成本。因此,定期审核 RDS 快照的重要性不言而喻,以优化 Amazon RDS 的整体成本。

在本篇文章中,我们将讨论如何通过编程方式管理 RDS 快照,并优化相关的总体成本。我们将探讨通过 AWS CLI命令识别和删除过期或孤立的快照,同时创建定期报告。我们还将展示如何使用 AWS 成本和使用报告来发现快照成本、使用情况和优化趋势。如果您希望将数据保留为 Apache Parquet 格式,可以导出至 Amazon S3,从而进一步降低成本。更详细的内容,请参考《通过自动化将 Amazon RDS 快照导出至 Amazon S3 降低数据归档成本以满足合规性需求》。

什么是 RDS 快照?

Amazon RDS 创建 RDS 存储卷的时间点副本,以备份整个 RDS 数据库。在实例提供时或启用自动快照时,Amazon RDS会生成完整快照。后续的快照会增量备份自上次快照以来更改的数据块。Amazon RDS 快照将在用户指定的保留期内存储在 S3桶中。这些快照可以为高可用性和灾难恢复而跨 AWS 区域共享,或与其他 AWS 账户共享以进行跨账户合作。

RDS快照主要分为两种类型:自动快照和手动快照。自动快照会在每日备份窗口期间触发,备份数据库和事务日志。同时,在单可用区转多可用区转换、数据库引擎升级和创建副本时也会进行自动快照。这些快照会根据特定的保留期进行清除,最长可达 35 天。删除 RDS 实例时,您可以选择保留自动快照,但这些快照将在保留期结束时自动删除。

在某些情况下,业务需要将快照保留超过 35 天以满足合规要求。用户可以随时使用 AWS 管理控制台、AWS CLI 或 RDS API创建手动快照,手动快照将保留,直到被明确删除。手动快照的主要用例包括长期保留、跨区域备份和保护数据库删除。

RDS 快照如何计费?

RDS快照的费用是根据快照存储的数据量和快照保留时间长短进行收取的。当快照被复制到其他区域时,还会产生数据传输费用。对于在一个区域和账户中,其大小不超过所有数据库实例的总配置存储量的快照,不会收取备份费用。例如,如果您在 us-east-1 区域有两个 50 GB 的 Amazon RDS MySQL 实例、三个 100 GB 的 Amazon RDS SQL Server实例和两个 150 GB 的 Amazon RDS PostgreSQL 实例,那么您将有总计 700 GB的备份存储,且不需支付额外费用。如果在该区域的备份存储总计为 800 GB,则将对多出来的 100 GB 收取费用。有关更多信息,请参阅 。

解决方案概述

优化 Amazon RDS 成本的主要步骤包括:

  1. 识别快照数量最多的 RDS 实例。
  2. 确定最旧的 RDS 快照。
  3. 识别孤立的 RDS 快照。

下图展示了此过程及后续步骤。

![RDS快照成本流程图](https://d2908q01vomqb2.cloudfront.net/887309d048beef83ad3eabf2a79a64a389ab1c9f/2024/04/01/rds- 删除)

在本文中,我们将使用 AWS CLI 的 aws rds describe-db-snapshots 命令。让我们通过以下示例理解该命令的主要组件:

bash aws rds describe-db-snapshots \ --db-snapshot-identifier mydbsnapshot

输出示例:

`json { "DBSnapshots": 管理的快照

通过减少快照的总体大小和数量,您可以降低 RDS 快照存储方面的费用。可以使用 AWS 管理控制台、AWS CLI 或 Amazon RDS API删除手动、共享或公共数据库快照。要删除共享或公共快照,您必须登录到拥有该快照的 AWS账户。如果您希望删除自动数据库快照而不删除数据库实例,请将数据库实例的备份保留期更改为 0。这一操作将删除数据库实例的所有自动快照。

识别快照数量最多的 RDS 实例

以下 AWS CLI 命令列出快照数量最多的 RDS 实例:

`bash aws rds describe-db-snapshots --snapshot-type automated --query 'DBSnapshots或 AWS CLI 的 命令来实现。以下是通过 AWS CLI 修改 RDS 数据库快照保留期的示例:

bash aws rds modify-db-instance --db-instance-identifier database-2 --backup- retention-period 3

识别最旧的 RDS 快照

在这一步中,我们按快照创建时间的顺序列出所有 RDS 快照。以下 AWS CLI 命令列出最旧的 RDS 快照及其相关实例名称:

bash aws rds describe-db-snapshots --snapshot-type manual --query 'DBSnapshots[*].[DBInstanceIdentifier,DBSnapshotIdentifier,SnapshotCreateTime]' --output table | sort -k 3 -n

输出示例:

+------------+-----------------------------+----------------------------+ | database-1 | database-1-final-snapshot | 2021-06-02T19:58:36.719Z | | pg1010 | pg1010-final-snapshot | 2022-01-25T18:44:35.417Z | | pg101 | pg101-final-snapshot | 2022-01-27T20:25:38.212Z | | pg11 | manual-pg11-1 | 2023-05-04T20:50:26.052Z | | pg11 | pg11-manual-623 | 2023-06-23T18:14:16.688Z | | pg12 | pg12-final-snapshot | 2022-05-10T18:52:19.666Z | | pg15 | manual-623-pg15 | 2023-06-23T18:15:09.957Z | | testbackup | testbackup | 2021-04-09T15:01:29.801Z | | test-snap | manualtest0401 | 2022-04-01T19:35:28.343Z |

您也可以使用以下脚本列出所有超过 90 天的 RDS 快照:

`bash expiry_date=$(date -d "-90 days" +'%Y-%m-%d') aws rds describe-db- snapshots --query "DBSnapshots 命令来删除快照,以下是通过 AWS CLI 删除 RDS 数据库快照的示例:

bash aws rds delete-db-snapshot --db-snapshot-identifier mydbsnapshot

识别孤立的 RDS 快照

当 RDS 实例被删除时,手动快照将保留在账户中,并计入总备份大小。未再与已删除 RDS 实例关联的快照称为 孤立快照 。您可以找到并删除这些孤立的 RDS 快照,以降低 AWS RDS 快照成本。使用以下脚本列出所有孤立的快照及相关 RDS 实例:


# !/bin/bash

# 当前运行的数据库

echo "正在获取活动 RDS 实例列表:LiveDBs.txt ..." LiveDBs=$(aws rds describe-db-instances --query 'DBInstances[*].[DBInstanceIdentifier]' --output text | sort | uniq) echo -e "$LiveDBs" > LiveDBs.txt

# 获取与快照相关的所有 RDS 实例列表

echo "正在获取与快照相关的所有 RDS 实例列表:AllDBs.txt ..." AllDBs=$(aws rds describe-db-snapshots --snapshot-type manual --query 'DBSnapshots[*].[DBInstanceIdentifier]' --output text | sort | uniq) echo -e "$AllDBs" > AllDBs.txt

# 获取已删除的数据库

echo "正在获取已删除的 RDS 实例列表..." DeletedDBs=`comm -13 <(sort LiveDBs.txt) <(sortAllDBs.txt)`

# 定义输出文件

OutputFile=OrphanSnaps_Report_$(date +%Y%m%d%H%M).csv echo "创建文件 $OutputFile以存储信息。" echo "正在遍历已删除的数据库以查找孤立快照..."

# 循环遍历已删除的数据库查找孤立快照

echo $DeletedDBs | tr ' ' '\n' | while read db; do aws rds describe-db-snapshots --snapshot-type manual --db-instance-identifier $db --query 'DBSnapshots[*].[DBSnapshotIdentifier,AllocatedStorage,DBSnapshotArn,DBInstanceIdentifier]' --output text | sort >> $OutputFile done

# 打印文件

awk '{ print $4}' $OutputFile > DeletedDB_$(date +%Y%m%d%H%M).csv awk '{ print
$1}' $OutputFile > OrphanSnapshopts_$(date +%Y%m%d%H%M).csv echo
"已创建已删除数据库实例列表 : DeletedDB_$(date +%Y%m%d%H%M).csv" echo "已创建孤立 RDS 快照列表 :
OrphanSnapshopts_$(date +%Y%m%d%H%M).csv"

while read snap; do echo "aws rds delete-db-snapshot --db-snapshot-identifier
$snap" >> DeleteSnapshotCommand_$(date +%Y%m%d%H%M).csv done <
OrphanSnapshopts_$(date +%Y%m%d%H%M).csv

echo "已创建删除快照命令 : DeleteSnapshotCommand_$(date +%Y%m%d%H%M).csv" echo
"已创建详细报告: $OutputFile" ```

运行以上脚本将生成五个文件:

  * **LiveDBs.txt** :当前活动的 RDS 实例列表。
  * **AllDBs.txt** :所有与快照相关的 RDS 实例列表,其中包括当前活动的实例和已删除的实例。
  * **OrphanSnapshopts_YYYYMMDDHHMM.csv** :所有孤立快照的列表。
  * **DeletedDB_YYYYMMDDHHMM.csv** :包含所有已删除数据库的列表。
  * **DeleteSnapshotCommand_YYYYMMDDHHMM.csv** :包含删除已识别的孤立快照命令的文件。

最后,`OrphanSnaps_Report_YYYYMMDDHHMM.csv` 包含孤立快照的详细报告,包括快照标识符、分配的存储大小(GiB)、ARN和 RDS 标识符。

在识别孤立快照后,您可以审核这些快照的业务需求。如果业务保留策略允许,删除这些快照可以减少总体快照成本。

## AWS 成本与使用报告

AWS 提供了一些工具,用于详细的计费和使用报告,并主动寻找成本优化的机会。AWS 成本和使用报告(AWS CUR)包含 AWS服务的成本和使用情况。这些可视化帮助您发现成本优化机会。报告中还包括 RDS 快照成本的详细信息。通过分析 AWS CUR数据,您可以识别出快照使用成本的趋势。这份报告同样可以帮助您识别超出保留期的快照,从而更有效地删除或管理它们,降低不必要的成本。AWS CUR帮助您做出明智的快照相关费用优化决策。

以下步骤展示如何使用  配置报告以优化快照成本:

  1. 在 AWS 计费控制台,选择导航面板中的 **成本与使用报告** 。
  2. 选择 **创建报告** 。
  3. 为 **报告名称** 输入名称。
  4. 指定报告路径和格式。

接下来的步骤是设置 Athena。

  1. 在 Athena 控制台中,创建一个数据库以存储 AWS CUR 数据。
  2. 在 **编辑器** 选项卡中,输入 Hive 数据定义语言(DDL)命令:`CREATE DATABASE dbname;`。
  3. 选择 **运行** 或按 **Ctrl+Enter** 。
  4. 从查询编辑器中的 **数据库** 菜单选择该数据库,使其成为当前数据库。
  5. 在 Athena 中创建一个外部表,以对应您的 AWS CUR 数据的架构。
  6. 将表的列映射到适当的 AWS CUR 报告字段,包括与 RDS 快照相关的字段。
  7. 在 Athena 中运行以下查询:

`sql SELECT product_product_name as Resource_Type, line_item_resource_id asDatabase_Name, line_item_usage_type as Storage_Type,
sum(line_item_blended_cost) AS cost FROM mybackupcostreport WHEREline_item_product_code = 'AmazonRDS' AND line_item_usage_type LIKE
'%BackupUsage%' GROUP BY line_item_usage_type,
resource_tags_user_workload_type, product_storage, product_storage_class,
product_storage_media, product_storage_type, month, product_product_name,
line_item_resource_id HAVING sum(line_item_blended_cost) > 0;`

此查询将输出快照相关的成本数据。

## AWS 成本探测器

使用 
可以追踪每个实例的备份存储费用 (`RDS:ChargedBackupUsage`),前提是已将
 添加到 RDS 实例。这些标签使您能够按标签过滤成本。我们建议您这样做,并启用 AWSCUR 以获取最详细的使用和每实例备份成本分析。以下屏幕截图显示了带有 `ChargedBackupUsage` 标签的实例的 Amazon RDS备份费用。

![AWS成本探测器](https://d2908q01vomqb2.cloudfront.net/887309d048beef83ad3eabf2a79a64a389ab1c9f/2024

Leave a Reply

Required fields are marked *