亚马逊AWS官方博客

使用 CloudWatch 实现按业务分组自动化统一监控多个 RDS Aurora 集群的方案

需求背景

客户通常有多个业务使用 RDS/Aurora 集群,或者 1 个业务有多个子系统使用不同的数个 RDS/Aurora 集群,通常需要按照业务维度统一监控该业务的所有 RDS 集群的指标,以便更好的了解该业务的各个数据库的运行情况,及各子系统的健康程度。有时做性能分析或健康度巡检的场景下,需要同时在一个图表查看多个 RDS 集群的监控,比如某个后端核心集群的负载升高是由于入口系统的流量上升,则可以第一时间查看核心数据库和入口系统的数据库负载情况,如果入口同时上升,则说明可能是入口流量提高导致。或者某个业务系统做了分库分表,使用了 8 个 RDS 集群,监控时需要作为一个逻辑业务集群进行整体监控,以便对比各个分片数据库的监控指标。目前,AWS 的 RDS console 内的数据库监控,每个数据库集群的 CloudWatch 监控指标是独立的。有客户反馈,使用 CloudWatch dashboard 实现统一监控,也需要手动一一添加集群到 Dashboard,不够方便和自动化。事实上,AWS 也提供了类似的解决方案和 API,把某些 RDS 集群纳入一个界面统一监控。本文重点讲解如何通过 AWS CloudWatch dashborad 功能和 RDS 现有的 API 实现按业务维度监控 RDS 集群。

解决方案

IT 资源的分组监控或可观测性工程,一个重要的思路便是按照业务分组或技术领域分组来实施,其中一个方法是资源分组(Resource Group),资源分组通常是给资源打标签(tag),不管是物理机、容器还是云资源,都可以通过打标签的通用方式进行业务分组。AWS 提供了给各种业务资源打标签的功能,也提供了 Resource Group 服务,它可以配合 Tags 进行资源分组,先定义好 Tag(比如:“RG: preproduction”),在创建 Resource Group(“Pro-preproduction-group”)时选择该 Tag,这样所有被打上“RG: preproduction” tag 的资源,都被纳入了“RDS-preproduction-group”资源组。而 CloudWatch 的 Automatic dashboard 支持自动化根据 Resource Group 统一监控所有 RDS 实例。因此,我们可以结合 RDS 集群 Tags、Resource Group 服务和 CloudWatch automatic dashboard 实现资源分组监控。如果 Automatic Dashboard 的指标不能满足你的需求,本文也提供了自定义 Dashboard 模版的方式。并使用自动化脚本,批量添加某个资源组(通过 Tag 定义)的 Aurora 集群到自定义 Dashboard。也支持批量给 RDS / Aurora 添加或删除Tag,方便快速把已有 RDS 资源纳入业务组。

下面以 Aurora MySQL 和 RDS 集群为例,详细介绍:

1. 使用 Automatic dashboards 结合资源组实现按资源组统一监控

添加资源组 Resource Group

打开 AWS Resource Groups 服务,点击 Create,资源组类型 Resource Type 选择为 RDS 实例 AWS::RDS::DBInstance,Tags 自定义。比如定义一组预发布资源组,名字叫 RDS-preproduction-group,Tags 定义为 RG=pre, 即通过这个 tag 去分类所有的 RDS 实例,1 个 RDS / Aurora 的 Instance 只要被 tag 为 RG=pre,则自动被纳入这个预发布资源组。如图 1 所示,有 1 个 Aurora 和 1 个 RDS for PostgreSQL 的实例被 Tag 为 RG:pre,则在 AWS Resource Group – resources – Save Resource Groups 列表中会列出资源组中的所有 DBInstance 资源。

图 1

如果我们需要新建 1 个 Aurora cluster 或新增 Aurora replica,均可以在 Instance 级的 Tags 中增加 RG:pre的tag,这样该实例自动被索引到资源组 RDS-preproduction-group。

图 2

监控资源组的所有 RDS 实例

进入 Cloud Watch,点击 Dashboards,如图 3 所示,然后选择:Automatic dashboards,选择 RDS(注意不是 RDS cluster),这里需要与 Resource Group 中的资源类型 AWS::RDS::DBInstance 保持一致。

图 3

如图 4,进入 RDS 的 dashboard 后,看到一个 Filter by Resource group 的筛选器,选择刚刚自定义的资源组:RDS-preproduction-group 即可查看预发布资源组的所有 RDS 实例的指标监控数据。

图 4

如图 4 所示,Automatic dashboard 可查看该资源组的所有常见监控指标。支持监控的指标包括:

  • CPUUtilization
  • DatabaseConnections
  • FreeStorageSpace
  • FreeableMemory
  • ReadLatency
  • ReadThroughput
  • ReadIOPS
  • WriteLatency
  • WriteThroughput
  • WriteIOPS

可见,主要的 CPU 和可用内存、可用存储、读写延迟和 IOPS 都可以监控,基本可以反应数据库整体性能状态。因此,通过自定义 Tag 和资源组的方式,可以在 CloudWatch automatic dashborad 实现自动把多个 RDS 实例或集群按业务组(资源组)进行统一监控。

2. 使用 Custom dashboards 结合 CloudWatch API 实现自动、灵活的统一监控

如果 Automatic dashboards 的指标不能满足您的监控需求,您也可以通过自定义 CloudWatch Custom dashboards 功能来实现更加灵活的自定义监控。Custom dashboards 更加灵活,支持更多的指标,支持用户结合业务需求定制可视化图表。自定义 dashboard 是一个非常好的监控方式,用户往往需要快速自动的把新 RDS / Aurora 集群加入到已定义好的 dashboard 模版。即用工具自动发现 RDS / Aurora 服务并自动添加到所属业务分类或资源组的监控。这个需求,我们可以通过 RDS 和 CloudWatch 的 API 来实现,CloudWatch 提供了 get_dashboard 接口获取已定义的 dashboard,put_dashboard 接口可以更新或新建 1 个 dashboard,RDS API 支持获取集群的实例信息和 Tag 信息,那么我们可以基于这些接口编写工具实现以上的自动化需求。下面是一个 demo。

Custom dashboards demo 有如下功能:

  1. 用户使用工具提供的默认的监控模版初始化 1 个 CloudWatch Dashboard,用户只需要为 dashboard 取名,并输入 1 个已部署好的 Aurora 集群的集群 ID
  2. 用户可以把存储在本地的 dashboard 模版,作为工具的输入,工具根据该模版为用户创建 1 个新的 CloudWatch Dashboard
  3. 用户通过 AWS Console 自定义 CloudWatch Dashboard,并作为后续自动监控其他集群的模版
  4. 用户添加新部署的集群到某个 dashboard,可以通过扫描集群资源 tag 的方式批量添加到 dashboard;也可以精确指定集群 ID 添加
  5. 用户也可以下载某个 dashboard 的监控模版,作为本地备份,或作为其他业务的监控模版
  6. 用户可以批量为多个集群(不限制数量)打上同一个 Tag
  7. 工具名:dashboard_custom.py,获取链接:github

以下是使用方法和效果演示。

前提

  1. 通过 AWS CLI 配置 AWS access key/secret key,确保你有权限调用 AWS SDK api。详情参考:Configuration and credential file settings – AWS Command Line Interface
  2. 安装 Python 3.0 + 运行环境

Step 1. 初始化 1 个 Aurora 集群的 Dashboard

Dashboard 命名为 jinchuan_dash2,指定 1 个 Aurora 集群名 aurora-2-standard-cluster 及 region,使用脚本自带的默认 dashboard 模版(不输入模版则为默认模版),生成 1 个集群的初始 dashboard。action 参数– init 表示新建 dashboard。

$ python dashboard_custom.py --init --dashName jinchuan_dash2 --clusterId aurora-2-standard-cluster --region ap-northeast-1 

isInit =  True

Your RDS cluster have 2 instances.
the dashboard jinchuan_dash2 created in cloudWatch.
  • 下图 8 是初始化创建的 dashboard,为了方便与添加其他集群后对比,这里图 5 和图 6 只展示 CPUUtilization 这个指标。

图 5

我们看到 aurora-2-standard-cluster 的 Writer 和 Reader 实例,都添加了 CPUUtilization 指标。

Step 2. 按照集群 ID 添加新部署集群到已建的 dashboard

  • 输入参数:
    • 已存在 dashboard 名字 dashName: jinchuan_dash2 及 region
    • 本次添加的 clusterId 集群名:aurora-2-io-opti

执行以下脚本:

$ python dashboard_custom.py --update --dashName jinchuan_dash2 --clusterId aurora-2-io-opti --region ap-northeast-1

图 6

如图 6 所示,与图 5 相比,我们添加了一个新集群 aurora-2-io-opti 的 Writer 和 Reader 实例到统一的 Dashboard。

Step 3. 可以通过自动扫描 Aurora 集群的 Tag(资源组)添加实例到统一监控

注意在集群级别打 Tag 即可,不用在每个 Aurora 实例上打 Tag。如图 7,Aurora 在 Cluster 打了一个 tag: “RG: pre”,RG 表示 ResourceGroup,pre 表示预发布环境,即表明这是一个预发布业务组的资源。

图 7

对于很多用户,实际账户中已经部署有多个 Aurora 集群,并没有提前通过 Tag 配合设置资源组管理资源。脚本也提供了一个 action 选项(–addtag),批量为已部署的 Aurora 集群添加 Tag。

  • 批量为多个 Aurora 集群添加 Tag
    • 多个集群名用英文半角逗号,分隔即可
      $ python dashboard_custom.py --addtag -c aurora-2-standard-cluster,aurora-2-io-opti -r ap-northeast-1 --tag "RG:pre"
      
      
      isTagging =  True
      
      You have 2 RDS clusters want to tag.
      2 RDS clusters have been tagged!
      
  • 批量删除多个 Aurora 集群的 Tag
    • 使用 action 选项(–rmtag)
      $ python dashboard_custom.py --rmtag -c aurora-2-standard-cluster,aurora-2-io-opti -r ap-northeast-1 --tag "busi:jinchuan"
      
      
      
      removeTag =  True
      You have 2 RDS clusters to remove tag.
      2 RDS clusters'tag busi:jinchuan have been removed!
      
  • 执行脚本,扫描 Tags 中含有”RG=pre”的集群,添加到统一 Dashboard 中
    • 更新 Dashboard 的 action 选项时 —update
    • –tag “RG:pre”指定资源组
      $ python dashboard_custom.py --update --dashName jinchuan_dash2 --tag "RG:pre" --region ap-northeast-1
      
      isInit =  False
      Your RDS cluster size: 4
      [{'DBClusterIdentifier': 'aurora-2-io-opti', 'DBInstanceIdentifier': 'aurora-io-opti-ro', 'Role': 'READER'}, {'DBClusterIdentifier': 'aurora-2-io-opti', 'DBInstanceIdentifier': 'aurora-2-io-opti-instance-1', 'Role': 'WRITER'}, {'DBClusterIdentifier': 'aurora-2-standard-cluster', 'DBInstanceIdentifier': 'aurora-standard-ro', 'Role': 'READER'}, {'DBClusterIdentifier': 'aurora-2-standard-cluster', 'DBInstanceIdentifier': 'aurora-2-standard', 'Role': 'WRITER'}]
      Cluster number is: 4, 2 instances's metric InsertLatency not added this time because existed! 
      Cluster number is: 4, 2 instances's metric FreeableMemory not added this time because existed! 
      Cluster number is: 4, 2 instances's metric WriteIOPS not added this time because existed! 
      Cluster number is: 4, 2 instances's metric ReadIOPS not added this time because existed! 
      Cluster number is: 4, 2 instances's metric NetworkThroughput not added this time because existed! 
      Cluster number is: 4, 2 instances's metric CPUUtilization not added this time because existed! 
      Cluster number is: 4, 2 instances's metric SelectLatency not added this time because existed! 
      Cluster number is: 4, 2 instances's metric Queries not added this time because existed! 
      Cluster number is: 4, 2 instances's metric DMLThroughput not added this time because existed! 
      Cluster number is: 4, 2 instances's metric DatabaseConnections not added this time because existed! 
      Cluster number is: 4, 2 instances's metric Deadlocks not added this time because existed!
      # 因为init时有2个已经添加,这里表示不重复添加
      

Aurora 集群资源的 tag 可以自定义,只要在执行批量脚本时,把该 tag 作为一个整体参数输入工具,工具则会按照 tag 扫描资源并添加。需要注意:目前 tag 参数只支持一个键值对(比如“RG:pre”)。如果命令行脚本输入的 tag(比如“RG:pro”)并未配置给任何 RDS Cluster,则显示没有找到符合条件的 cluster,如下所示:

$ python dashboard_custom.py --update --dashName jinchuan_dash2 --tag "RG:pro" --region ap-northeast-1
isInit =  False
Your RDS cluster size: 0
Your RDS cluster has no instances: None

Step 4. 查看整体 Dashboard

登陆 CloudWatch console,选择 Dashboards,Custom dashboards,就会看到用户自定义的 dashboard。点击 dashboard 名字,如图 8 所示,这是 1 个业务组(预发布业务)的所有实例的统一监控。

图 8

如果图 8 的指标不满足你的需求,你也可以在 AWS CloudWatch 上先自定义需要的指标,创建 1 个 dashboard(比如是 jinchuan_dash1), 然后使用脚本批量添加集群,在 Step2 或 3 中把—dashName 后的参数修改为 jinchuan_dash1 即可。

Step 5. 自动添加其他集群

定制好 dashboard 并符合自身监控需求后,用户可以再次执行 Step2 或 Step3,更换参数 ClusterId 或 Tag 扫描 Aurora 集群资源,即可添加多个不同的 Aurora 集群到统一 Dashboard,实现按照业务组或资源组等维度进行统一监控。

Appendix

脚本使用的 SDK,参考官方说明:CloudWatch Create dashboard API

资源组服务介绍:Resource Group 介绍

本篇作者

金川

AWS 数据库解决方案架构师,负责基于 AWS 的数据库的解决方案咨询与架构设计。在加入 AWS 之前曾在华为、阿里云等公司工作多年,在数据库选型与架构设计、数据库优化、数据迁移、大数据和数仓建设方面有丰富的技术经验,在金融、互联网、通信等行业有丰富的设计和实施经验。