大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
RDS 数据库
这一课你将能做到
- 创建 RDS MySQL 实例,配置 Multi-AZ 高可用,并理解自动备份和快照的区别
- 根据业务负载选择合适的 RDS 实例类型和存储类型(gp3/io1)
- 实现本站 Spring Boot 应用连接 RDS,配置读写分离和故障转移
为什么要学
RDS 是 AWS 的托管关系型数据库,免去了自己装 MySQL、配主从、做备份的运维负担。本站目前用阿里云 RDS,AWS RDS 是它的直接对标。面试中「RDS Multi-AZ 原理」「怎么选实例类型」「怎么做读写分离」是必问题。
人话:RDS 就是 AWS 帮你管好的 MySQL/PostgreSQL。你不需要自己装数据库、配主从复制、做定时备份,AWS 全包了。你只需要选规格、设参数、连上去用。
先建立图像
RDS 架构图(Multi-AZ):
┌─────────────────────────────────────────┐
│ VPC │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ AZ-1a │ │ AZ-1b │ │
│ │ │ │ │ │
│ │ RDS 主实例 │───→│ RDS 备实例 │ │
│ │ (同步复制) │ │ (Standby) │ │
│ │ │ │ │ │
│ └──────┬──────┘ └─────────────┘ │
│ │ │
│ ┌────┴────┐ │
│ │ 应用服务器 │ ←── 只连主实例 Endpoint │
│ │ (EC2) │ │
│ └─────────┘ │
└─────────────────────────────────────────┘
RDS 实例类型速查:
| 类型 | 系列 | 特点 | 适用场景 |
|---|---|---|---|
| db.t3/db.t4g | 通用型(突发) | 基线 CPU + 积分 | 开发测试、低负载 |
| db.m5/db.m6i | 通用型 | 均衡 CPU/内存 | 中小型生产库 |
| db.r5/db.r6i | 内存优化型 | 大内存 | 高并发、大缓存 |
| db.x2g | 内存极致型 | 超大内存 | 内存数据库、实时分析 |
存储类型对比:
| 类型 | IOPS | 吞吐 | 适用场景 |
|---|---|---|---|
| gp3 | 3000-16000 | 125-1000 MB/s | 通用,性价比最高 |
| io1/io2 | 1000-64000 | 高 | 高性能 OLTP |
| st1 | 低 | 高吞吐 | 数据仓库、日志 |
| sc1 | 低 | 低 | 冷数据、不常访问 |
跟着做
步骤 1:创建 RDS 子网组
# RDS 必须放在子网组里(至少两个 AZ)
aws rds create-db-subnet-group --db-subnet-group-name codenav-db-subnet --db-subnet-group-description "CodeNav DB Subnet Group" --subnet-ids subnet-db1a subnet-db1b
步骤 2:创建 RDS 参数组(可选)
# 自定义参数(如时区、慢查询日志)
aws rds create-db-parameter-group --db-parameter-group-name codenav-mysql-params --db-parameter-group-family mysql8.0 --description "CodeNav MySQL Parameters"
aws rds modify-db-parameter-group --db-parameter-group-name codenav-mysql-params --parameters "ParameterName=time_zone,ParameterValue=Asia/Shanghai,ApplyMethod=immediate" "ParameterName=slow_query_log,ParameterValue=1,ApplyMethod=immediate"
步骤 3:创建 RDS MySQL 实例(Multi-AZ)
aws rds create-db-instance --db-instance-identifier codenav-mysql --db-instance-class db.t3.micro --engine mysql --engine-version 8.0.35 --master-username admin --master-user-password YourPassword123! --allocated-storage 20 --storage-type gp3 --vpc-security-group-ids sg-dbxxxx --db-subnet-group-name codenav-db-subnet --multi-az --backup-retention-period 7 --preferred-backup-window "03:00-04:00" --preferred-maintenance-window "sun:04:00-sun:05:00" --storage-encrypted --no-publicly-accessible
关键参数说明:
--multi-az:开启 Multi-AZ,自动创建备实例,同步复制--no-publicly-accessible:不分配公网 IP,只能从 VPC 内访问--storage-encrypted:启用存储加密(KMS)--backup-retention-period 7:保留 7 天自动备份
步骤 4:获取连接信息
# 查看实例状态
aws rds describe-db-instances --db-instance-identifier codenav-mysql --query "DBInstances[0].{Status:DBInstanceStatus,Endpoint:Endpoint.Address,Port:Endpoint.Port}"
# 等待状态变成 available
步骤 5:Spring Boot 连接 RDS
application-aws.yml:
spring:
datasource:
url: jdbc:mysql://codenav-mysql.xxxxxxxx.ap-southeast-1.rds.amazonaws.com:3306/codenav?useSSL=true&serverTimezone=Asia/Shanghai
username: admin
password: ${DB_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: validate
生产环境不要把密码写死在配置文件里,用环境变量或 AWS Secrets Manager。
步骤 6:创建只读副本(Read Replica)
# 创建只读副本(用于读写分离)
aws rds create-db-instance-read-replica --db-instance-identifier codenav-mysql-read --source-db-instance-identifier codenav-mysql --db-instance-class db.t3.micro
步骤 7:手动快照与恢复
# 创建手动快照
aws rds create-db-snapshot --db-instance-identifier codenav-mysql --db-snapshot-identifier codenav-mysql-snapshot-20241007
# 从快照恢复(会创建新实例)
aws rds restore-db-instance-from-db-snapshot --db-instance-identifier codenav-mysql-restored --db-snapshot-identifier codenav-mysql-snapshot-20241007
讲清楚要点
- Multi-AZ vs Read Replica:Multi-AZ 是高可用方案(同步复制,自动故障转移,备用实例不可读)。Read Replica 是读写分离方案(异步复制,可提升读性能,可手动提升为主库)。
- 自动备份 vs 手动快照:自动备份按保留期自动删除,支持时间点恢复(PITR)。手动快照永久保留,直到你删。重要操作前打手动快照。
- 故障转移(Failover):Multi-AZ 模式下,主实例故障时 AWS 自动切到备实例,DNS 端点不变,应用无感知。切换时间通常 60-120 秒。
- 存储自动扩展:开启
MaxAllocatedStorage后,磁盘写满时自动扩容,避免宕机。gp3 的 IOPS 和吞吐可以独立调整,不用换存储类型。 - 性能洞察(Performance Insights):RDS 的免费监控工具,可视化显示数据库负载、慢查询、等待事件。生产环境必开。
你可能会懵的地方
-
RDS 和 Aurora 有什么区别? Aurora 是 AWS 自研的 MySQL/PostgreSQL 兼容数据库,存储自动扩展(10GB-128TB),性能是标准 MySQL 的 5 倍,但贵 20%。RDS 是标准 MySQL/PostgreSQL/SQL Server/Oracle/MariaDB。本站初期用 RDS MySQL,流量大了可迁 Aurora。
-
Multi-AZ 的备实例能读吗? 不能。Multi-AZ 的备实例是纯 standby,不接收读流量。要读写分离得另外建 Read Replica。
-
RDS 怎么扩容? 垂直扩容:改实例类型(如 db.t3.small → db.m5.large),会重启。水平扩容:加 Read Replica 分担读流量。存储扩容:改 Allocated Storage,在线扩容不重启。
-
RDS 参数组改错了会出事吗? 静态参数(如
innodb_buffer_pool_size)需要重启生效,改错可能导致启动失败。动态参数(如slow_query_log)立即生效。建议先在测试环境验证。 -
怎么从阿里云 RDS 迁到 AWS RDS? 用 AWS DMS(Database Migration Service)做在线迁移,或用 mysqldump 导出导入。DMS 支持持续复制(CDC),可以做到接近零停机。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| RDS 开公网访问 | 数据库暴露公网,被爆破 | 放私有子网,安全组只许应用层访问 |
| 用 db.t3.micro 跑生产 | CPU 积分耗尽,性能暴跌 | 生产至少 db.t3.small 或 db.m5 |
| 不关自动备份 | 无法恢复到任意时间点 | 保留 7-35 天自动备份 |
| 主库和 Read Replica 同 AZ | AZ 故障时读写都挂 | Read Replica 放不同 AZ |
| 密码硬编码在代码里 | 泄露风险 | 用 Secrets Manager 或 IAM 数据库认证 |
卡点急救
- 连接超时:检查安全组是否允许应用服务器的 IP/安全组访问 3306;检查 RDS 是否在私有子网且应用服务器在同一 VPC。
- 磁盘写满(Storage Full):开启存储自动扩展,或手动扩容。临时方案:清理 binlog(
CALL mysql.rds_rotate_binlog;)。 - 主从延迟高(Replica Lag):Read Replica 配置太低,或有大事务。升级 Replica 实例类型,或拆大事务。
面试常问
-
RDS Multi-AZ 和 Read Replica 的区别? Multi-AZ 是高可用:同步复制,备实例不可读,自动故障转移,用于容灾。Read Replica 是读写分离:异步复制,可读,可提升为主库,用于扩展读性能。两者可以一起用。
-
RDS 怎么做备份恢复? 自动备份支持时间点恢复(PITR),保留期内任意一秒。手动快照永久保留。恢复时会创建新实例,原实例不动。
-
怎么选 RDS 实例类型? 看 CPU、内存、网络、EBS 带宽。通用型(m5/m6i)适合大多数 Web 应用。内存优化型(r5/r6i)适合高并发、大缓存场景。存储型(i4i)适合本地 NVMe 超高 IOPS。
自测三问
- Multi-AZ 模式下,主实例故障时应用需要改连接地址吗?为什么?
- 自动备份和手动快照的核心区别是什么?
- 为什么生产环境不建议用 db.t3.micro?
小结一句话
RDS 是托管数据库,Multi-AZ 保高可用,Read Replica 做读写分离,自动备份防丢数据,私有子网保安全。
延伸
- AWS RDS 官方文档
- RDS 最佳实践
- 下一课:DynamoDB——学会用 NoSQL 处理海量键值数据。