如何获取RDS集群实例最大连接数,配置CloudWatch告警阈值为其75%?
解决思路:基于RDS实例最大连接数75%设置CloudWatch告警阈值
针对你遇到的问题,这里提供三种实用的解决思路,适配不同场景需求:
方法一:预定义实例类型与最大连接数映射表
Aurora MySQL的默认max_connections值与实例类型、引擎版本强相关,官方文档有明确对应关系。你可以预先整理一个映射表,直接在代码中根据实例类型获取最大连接数,再计算75%作为阈值。
代码示例
// 预定义对应引擎版本(2.09.2)的实例类型与最大连接数映射 const auroraMysqlMaxConnections = { 't3.medium': 1000, // 请根据官方文档确认对应版本的实际值 't3.large': 2000, // 按需添加其他需要的实例类型 }; // 定义实例类型(可复用) const instanceType = ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MEDIUM); // 创建RDS集群 const TestCluster = new rds.DatabaseCluster(this, "TestDbCluster", { engine: rds.DatabaseClusterEngine.auroraMysql({ version: rds.AuroraMysqlEngineVersion.VER_2_09_2, }), instances: 1, instanceProps: { instanceType: instanceType, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED, }, vpc: vpc, }, clusterIdentifier: "TestDbCluster", }); // 计算告警阈值 const maxConnections = auroraMysqlMaxConnections[instanceType.toString()]; const threshold = maxConnections * 0.75; // 创建CloudWatch告警 const ConnectionsMetric = TestCluster.metricDatabaseConnections(); const dbConnectionsAlarm = ConnectionsMetric.createAlarm(this, "TestAlarm", { alarmName: "DB-DbConnections-Alarm", threshold: threshold, evaluationPeriods: 1, });
优缺点
- 优点:实现简单,无额外资源开销
- 缺点:需要手动维护映射表,引擎版本升级或实例类型变更时需同步更新
方法二:通过自定义资源动态查询集群参数
利用CDK的自定义资源(Custom Resource)调用AWS SDK查询RDS集群的max_connections参数值,动态计算阈值,适配实例类型和参数的变更。
代码示例
import { CustomResource, CustomResourceProvider } from 'aws-cdk-lib/custom-resources'; import { PolicyStatement } from 'aws-cdk-lib/aws-iam'; import { Fn } from 'aws-cdk-lib'; // 创建RDS集群 const TestCluster = new rds.DatabaseCluster(this, "TestDbCluster", { engine: rds.DatabaseClusterEngine.auroraMysql({ version: rds.AuroraMysqlEngineVersion.VER_2_09_2, }), instances: 1, instanceProps: { instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MEDIUM), vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED, }, vpc: vpc, }, clusterIdentifier: "TestDbCluster", }); // 自定义资源:查询集群的max_connections参数 const maxConnectionsResource = new CustomResource(this, 'MaxConnectionsResource', { serviceToken: CustomResourceProvider.getOrCreate(this, 'Custom::RDSMaxConnections', { policyStatements: [ new PolicyStatement({ actions: ['rds:DescribeDBClusterParameters'], resources: [TestCluster.clusterArn], }) ], onCreate: { service: 'RDS', action: 'describeDBClusterParameters', parameters: { DBClusterParameterGroupName: TestCluster.clusterParameterGroup!.parameterGroupName, Filters: [{ Name: 'parameter-name', Values: ['max_connections'] }] }, physicalResourceId: { id: Date.now().toString() }, }, onUpdate: { service: 'RDS', action: 'describeDBClusterParameters', parameters: { DBClusterParameterGroupName: TestCluster.clusterParameterGroup!.parameterGroupName, Filters: [{ Name: 'parameter-name', Values: ['max_connections'] }] }, physicalResourceId: { id: Date.now().toString() }, }, }), }); // 从自定义资源中提取参数值,计算75%阈值 const maxConnections = maxConnectionsResource.getAttString('Parameters.0.ParameterValue'); const threshold = Fn.toNumber(maxConnections) * 0.75; // 创建CloudWatch告警 const ConnectionsMetric = TestCluster.metricDatabaseConnections(); const dbConnectionsAlarm = ConnectionsMetric.createAlarm(this, "TestAlarm", { alarmName: "DB-DbConnections-Alarm", threshold: threshold, evaluationPeriods: 1, });
优缺点
- 优点:动态获取参数值,无需手动维护映射,适配实例类型和参数变更
- 缺点:引入自定义资源,增加少量部署复杂度(会创建一个Lambda函数)
方法三:使用CloudWatch Metric Math实现比例告警
通过定期推送max_connections到CloudWatch自定义指标,再用Metric Math计算当前连接数占最大连接数的比例,直接对比例阈值(75%)告警。
步骤说明
- 编写Lambda函数:定期调用RDS API查询
max_connections,并推送到CloudWatch自定义指标 - 在CDK中创建Metric Math告警,对比当前连接数与最大连接数的比例
告警代码示例
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch'; const ConnectionsMetric = TestCluster.metricDatabaseConnections(); // 自定义指标:预先通过Lambda推送的max_connections值 const maxConnectionsMetric = new cloudwatch.Metric({ namespace: 'Custom/RDS', metricName: 'MaxConnections', dimensionsMap: { DBClusterIdentifier: TestCluster.clusterIdentifier }, }); // 创建比例告警:当连接数占比超过75%时触发 const dbConnectionsAlarm = new cloudwatch.Alarm(this, "TestAlarm", { alarmName: "DB-DbConnections-Ratio-Alarm", evaluationPeriods: 1, metric: ConnectionsMetric.divide(maxConnectionsMetric).multiply(100), // 计算百分比 threshold: 75, comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD, });
优缺点
- 优点:基于运行时实际参数值,告警更精准
- 缺点:需要额外配置Lambda和CloudWatch指标推送,增加运维成本
内容的提问来源于stack exchange,提问作者ShanWave007
相关产品推荐
相关产品推荐

