AWS RDS 数据库
概述
Amazon Relational Database Service (RDS) 是托管式关系数据库服务,支持 MySQL、PostgreSQL、MariaDB、Oracle、SQL Server、Aurora 六种数据库引擎。本节重点介绍 MySQL/PostgreSQL 在生产环境中的配置、高可用与维护实践。
核心优势:
- 全托管式运营 — 自动化补丁、备份、容灾切换
- 多可用区部署 — 主备自动同步,故障自动切换(RTO < 1 分钟)
- 只读副本 — 横向扩展读负载,支持跨区域复制
- 加密存储 — KMS 静态加密 + TLS 传输加密
- 性能洞察 — Enhanced Monitoring + Performance Insights
架构与部署
常见架构选型
| 场景 | 推荐架构 | 说明 |
|---|---|---|
| 开发/测试 | 单 AZ,无 Multi-AZ | 成本优先 |
| 生产标准 | Multi-AZ DB Instance | 主备同城容灾 |
| 读写分离 | Primary + Read Replicas | 横向扩展读能力 |
| 大规模部署 | Aurora Serverless / Aurora Cluster | 自适应容量 |
创建 RDS 实例(MySQL)
# AWS CLI 创建 MySQL RDS 实例
aws rds create-db-instance --db-instance-identifier prod-mysql-primary --db-instance-class db.r6g.xlarge --engine mysql --engine-version 8.0.35 --master-username admin --master-user-password 'YourSecurePassword123!' --allocated-storage 100 --storage-type gp3 --storage-encrypted --kms-key-id arn:aws:kms:us-east-1:123456789012:key/xxxxx --multi-az --backup-retention-period 7 --preferred-backup-window "03:00-04:00" --preferred-maintenance-window "mon:04:00-mon:05:00" --db-name appdb --no-publicly-accessible --vpc-security-group-ids sg-0abcd1234efgh5678 --db-subnet-group-name my-private-subnet-group --enable-performance-insights --performance-insights-retention-period 7 --output json
参数组配置
# 创建自定义参数组
aws rds create-db-parameter-group --db-parameter-group-name prod-mysql-80 --db-parameter-group-family mysql8.0 --description "Production MySQL 8.0 parameters"
# 修改关键参数
aws rds modify-db-parameter-group --db-parameter-group-name prod-mysql-80 --parameters "ParameterName=max_connections,ParameterValue=500,ApplyMethod=immediate" "ParameterName=innodb_buffer_pool_size,ParameterValue=4294967296,ApplyMethod=pending_reboot" "ParameterName=slow_query_log,ParameterValue=1,ApplyMethod=immediate" "ParameterName=long_query_time,ParameterValue=2,ApplyMethod=immediate"
高可用配置
开启 Multi-AZ
# 修改现有实例为 Multi-AZ
aws rds modify-db-instance --db-instance-identifier prod-mysql-primary --multi-az --apply-immediately
读副本配置
# 创建跨区域读副本(PostgreSQL)
aws rds create-db-instance-read-replica --db-instance-identifier prod-pg-read-usw2 --source-db-instance-identifier arn:aws:rds:us-east-1:123456789012:db:prod-pg-primary --region us-west-2 --db-instance-class db.r6g.large --allocated-storage 200 --no-publicly-accessible
# 创建同区域 MySQL 读副本
aws rds create-db-instance-read-replica --db-instance-identifier prod-mysql-replica1 --source-db-instance-identifier prod-mysql-primary --db-instance-class db.r6g.large
备份与恢复
自动化备份
# 修改备份策略
aws rds modify-db-instance --db-instance-identifier prod-mysql-primary --backup-retention-period 14 --preferred-backup-window "03:00-04:00" --backup-plan-enabled
手动快照
# 创建快照
aws rds create-db-snapshot --db-instance-identifier prod-mysql-primary --db-snapshot-identifier prod-mysql-pre-upgrade-20240115
# 从快照恢复实例
aws rds restore-db-instance-from-db-snapshot --db-instance-identifier prod-mysql-restored --db-snapshot-identifier prod-mysql-pre-upgrade-20240115 --db-instance-class db.r6g.xlarge
Point-in-Time 恢复
# PITR 恢复到指定时间
aws rds restore-db-instance-to-point-in-time --source-db-instance-identifier prod-mysql-primary --target-db-instance-identifier prod-mysql-pitr --restore-time "2024-01-15T10:00:00Z" --use-latest-restorable-time
连接与安全
连接字符串格式
mysql://username:password@endpoint:3306/database?ssl=true&ssl_ca=/path/to/rds-ca-bundle.pem
SSL/TLS 配置
# 下载 RDS CA 证书
wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
# MySQL 连接(强制 SSL)
mysql -h prod-mysql-primary.xxxxx.us-east-1.rds.amazonaws.com -u admin -p --ssl-ca=global-bundle.pem --ssl-mode=REQUIRE
安全组规则
| 方向 | 协议 | 端口 | 来源 |
|---|---|---|---|
| 入站 | TCP | 3306 | 应用服务器安全组 |
| 入站 | TCP | 3306 | VPN/跳板机 |
| 出站 | TCP | 443 | S3 endpoint (S3 内点) |
监控与告警
关键监控指标
| 指标 | 说明 | 告警阈值建议 |
|---|---|---|
CPUUtilization |
CPU 使用率 | > 80% 警告,> 95% 严重 |
DatabaseConnections |
当前连接数 | > 80% max_connections |
FreeStorageSpace |
磁盘可用空间 | < 20GB 警告 |
WriteIOPS / ReadIOPS |
磁盘 IOPS | 按 baseline 设定 |
ReplicaLag |
复制延迟(只读副本) | > 30 秒警告 |
DBInstanceStatus |
实例状态 | = available 正常 |
CloudWatch 告警配置
# CPU 告警
aws cloudwatch put-metric-alarm --alarm-name prod-mysql-cpu-high --alarm-description "RDS MySQL CPU 使用率超过 80%" --metric-name CPUUtilization --namespace AWS/RDS --statistic Average --period 300 --evaluation-periods 2 --threshold 80 --comparison-operator GreaterThanThreshold --dimensions "Name=DBInstanceIdentifier,Value=prod-mysql-primary" --alarm-actions arn:aws:sns:us-east-1:123456789012:ops-alerts
常见运维操作
实例重启
# 带故障切换的重启(Multi-AZ)
aws rds reboot-db-instance --db-instance-identifier prod-mysql-primary --force-failover
# 无故障切换重启
aws rds reboot-db-instance --db-instance-identifier prod-mysql-primary --no-force-failover
版本升级
# 查看可用引擎版本
aws rds describe-db-engine-versions --engine mysql --engine-version 8.0
# 升级引擎版本(需先创建快照)
aws rds modify-db-instance --db-instance-identifier prod-mysql-primary --engine-version 8.0.35 --apply-immediately
常见问题
Q: 连接数达到 max_connections 上限?
A: 1) 检查是否有连接泄漏(长事务未提交);2) 设置 wait_timeout 和 interactive_timeout 参数;3) 使用连接池(如 HikariCP、PgBouncer);4) 升级实例规格。
Q: 磁盘空间不足?
A: 1) 清理未使用的快照;2) 删除过期备份;3) 优化表(OPTIMIZE TABLE);4) 调整 innodb_file_per_table=ON 后重建大表;5) 扩容存储(aws rds modify-db-instance --allocated-storage)。
Q: 主从复制延迟大?
A: 1) 检查从库 IO 线程和 SQL 线程状态;2) 网络带宽是否瓶颈;3) 大事务导致复制阻塞;4) 从库负载高无法及时应用;5) 开启 Binary Log 压缩。