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_timeoutinteractive_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 压缩。