第 6 章

RDS 与数据库实战

⏱️ 50 分钟
📝 20 题练习
备考助手

📌 核心知识点

引擎选择Multi-AZ vs Read Replica性能优化备份策略

RDS 与数据库实战

📖 RDS 基础知识

Amazon Relational Database Service (RDS) 是 AWS 的托管数据库服务,让您可以更轻松地部署和扩展数据库。

📒 官方文档用户指南FAQ定价实例对比

🖼️ RDS 图解补充

VPC 基础网络架构(AWS 官方)

看图重点:RDS 可达性问题常见根因在子网路由与安全边界。

IAM 策略生效逻辑(AWS 官方)

看图重点:涉及 IAM 数据库认证时要按策略评估链路排查。

AWS Availability Zones 结构示意(AWS 官方)

看图重点:Multi-AZ 的本质是跨 AZ 高可用,不是读扩展。

AWS 数据传输费用

看图重点:跨区复制与备份策略会直接影响数据库网络成本。

成本分配报表示例(AWS 官方)

看图重点:数据库费用应拆到环境和业务线,避免成本黑盒。

支持的数据库引擎

引擎版本适用场景
MySQL5.7, 8.0Web 应用、CMS
PostgreSQL12-16复杂查询、GIS、扩展
MariaDB10.xMySQL 社区分支替代方案
Oracle12c-19c企业应用
SQL Server2016-2022.NET 应用
AuroraMySQL/PostgreSQL高性能云原生

RDS 数据库实例架构(AWS 官方)

看图重点:先区分实例层与存储层,再理解备份、监控和高可用组件如何协同。

其他托管数据库选择

如果需要 MongoDB、Cassandra 等非关系型数据库的托管服务,可以考虑:

  • Amazon DocumentDB - MongoDB 兼容
  • Amazon Keyspaces - Cassandra 兼容
  • 第三方服务:ComposeInstaClustr

Aurora 深入解析

Aurora 是什么?

Aurora 是 AWS 专有的云原生数据库,提供分布式、容错的存储系统,具有自愈存储和自动扩展功能。

Aurora 存储架构
├── 分布式存储层
│   ├── 自动维护 6 个数据副本
│   └── 跨 3 个可用区分布
├── Log-structured 存储(非 B-tree)
│   └── 提高写入性能
├── 独立的缓冲池进程
│   └── 重启实例不会清空缓冲池
└── 共享存储读副本
    └── 极低复制延迟,零数据丢失故障转移

Aurora vs 标准 RDS

Aurora MySQL:
├── 性能: 比标准 MySQL 快 3-5 倍(高并发场景)
├── 存储: 自动扩展到 128 TB(10GB 增量)
├── 可用性: 跨 3 个 AZ 自动 6 副本复制
├── 只读副本: 最多 15 个,共享存储层
├── 故障转移: 更快,因为使用共享存储
└── 复制延迟: 毫秒级(共享存储,无需传输 binlog)

标准 RDS MySQL:
├── 性能: 标准数据库性能
├── 存储: 最大 64 TB(需预配置)
├── 可用性: 需配置 Multi-AZ
├── 只读副本: 最多 5 个,独立存储
├── 故障转移: 约 60-120 秒
└── 复制延迟: 依赖 binlog 传输

RDS Multi-AZ 架构(AWS 官方)

看图重点:Multi-AZ 是高可用主备切换,不是读扩展;读扩展需要 Read Replica。

Aurora 高并发优化

# Aurora 设计用于高并发场景
# 测试显示可以支持高达 5,000 个并发连接

# 最佳实践:
# 1. 使用大型连接池
# 2. 尽可能多地并发执行查询
# 3. Aurora 需要大实例才能发挥最佳性能

# Aurora 对于多 CPU 扩展效果好
# 可能需要选择大实例类型以获得最佳性能

Aurora 迁移路径

# 迁移到 Aurora 的方法(从易到难):

# 1. 从 MySQL 5.6/5.7 快照恢复(最简单)
aws rds restore-db-cluster-from-snapshot \
  --db-cluster-identifier my-aurora-cluster \
  --snapshot-identifier my-mysql-snapshot \
  --engine aurora-mysql

# 2. 从 MySQL dump 导入
mysqldump -h source-mysql ... | mysql -h aurora-endpoint ...

# 3. 设置 Aurora 作为 MySQL 副本(低停机迁移)
# 适用于需要最小化停机时间的场景

# 4. AWS Database Migration Service (DMS)
# 付费服务,适用于复杂迁移

引擎选择指南

MySQL vs MariaDB vs Aurora

# 如果是新项目,使用 MySQL 风格数据库,应该考虑:

# 1. Aurora MySQL
#    - 高可用性和自动扩展
#    - 高并发场景最佳
#    - 某些工作负载可能没有 5 倍提升

# 2. MariaDB
#    - MySQL 的现代社区分支
#    - 某些方面已超越 MySQL
#    - 完全兼容 MySQL

# 3. MySQL
#    - 经典选择
#    - 生态系统成熟
#    - 但 MariaDB 可能更好

选择建议

场景推荐原因
高并发生产环境Aurora自动扩展、高可用
成本敏感的开发环境RDS MySQL/MariaDB价格更低
企业遗留应用RDS Oracle/SQL Server许可证兼容
地理空间应用RDS PostgreSQLPostGIS 扩展
最新 PostgreSQL 特性RDS PostgreSQLAurora 版本可能滞后

Multi-AZ vs Read Replica

Multi-AZ 部署

用于高可用,同步复制到备用实例:

        写入/读取
           │
     ┌─────┴─────┐
     │  主实例   │  AZ-a
     │ (Primary) │
     └─────┬─────┘
           │ 同步复制 (DRBD)
     ┌─────┴─────┐
     │  备用实例  │  AZ-b
     │ (Standby) │
     └───────────┘
  • 故障转移: 自动切换,约 60-120 秒
  • 用途: 灾难恢复
  • 读取: 备用实例不可读
  • 备份: MySQL Multi-AZ 的自动备份从备用实例运行,减少主实例延迟

Read Replica

用于读取扩展,异步复制到只读副本:

        写入
          │
    ┌─────┴─────┐
    │   主实例   │
    └─────┬─────┘
          │ 异步复制 (binlog)
    ┌─────┼─────┐
    │     │     │
  ┌─┴─┐ ┌─┴─┐ ┌─┴─┐
  │ R1│ │ R2│ │ R3│  只读副本
  └───┘ └───┘ └───┘
    │     │     │
  读取  读取  读取

RDS Read Replica 架构(AWS 官方)

看图重点:Read Replica 是为了分担读流量,不承担主备故障切换职责。

RDS Read Replica 与 Standby 对比(AWS 官方)

看图重点:Standby 主要服务高可用,Read Replica 主要服务读扩展,这两个职责不要混用。

  • 扩展: 最多 5 个副本 (Aurora 15 个)
  • 跨区域: 副本可以跨 5 个区域
  • 延迟: 毫秒级复制延迟

对比总结

特性Multi-AZRead Replica
目的高可用读取扩展
复制同步异步
可读
跨区域可以
Aurora 需要通常不需要推荐使用

💡 Aurora 提示: Aurora 只读副本相当于 Multi-AZ 备份,可配置为零数据丢失故障转移目标。因此使用 Aurora 时很少需要配置 Multi-AZ。

💡 RDS 最佳实践

1. 创建自定义参数组

# ❗ 默认参数组不允许动态配置更改!
# 必须创建自定义参数组

aws rds create-db-parameter-group \
  --db-parameter-group-name my-custom-params \
  --db-parameter-group-family mysql8.0 \
  --description "Custom params for production"

# 修改参数
aws rds modify-db-parameter-group \
  --db-parameter-group-name my-custom-params \
  --parameters "ParameterName=max_connections,ParameterValue=500,ApplyMethod=pending-reboot"

2. 时区配置

# RDS 实例默认时区是 UTC
# 如果需要,可以更改为其他时区

# 方法 1: 通过参数组设置
# time_zone = 'Australia/Sydney'

# 方法 2: 创建时指定
aws rds create-db-instance \
  --timezone "Australia/Sydney" \
  ...

3. 成本优化 - 停止未使用的实例

# 使用 Instance Scheduler 自动停止/启动 RDS
# https://aws.amazon.com/solutions/implementations/instance-scheduler/

# 例如:开发环境只在工作时间运行
# 可节省约 60% 的成本

4. MySQL Binary Logs

# MySQL RDS 允许访问 binary logs
# 用于:复制、数据恢复、审计

# 启用 binlog
# 通过参数组设置 binlog_format = ROW

# 注意:Multi-AZ MySQL 使用 DRBD 进行透明复制
# 备份从备用实例运行,减少主实例延迟

5. Performance Schema

# ⚠️ Performance Schema 在 RDS 中默认禁用!
# (尽管 MySQL 5.6.6+ 默认启用)

# 启用需要:
# 1. 在参数组中设置 performance_schema = 1
# 2. 重启 RDS 实例

数据库大小限制

数据库引擎最大存储
Aurora128 TB (10GB 自动增量)
MySQL/MariaDB/PostgreSQL64 TB
Oracle64 TB
SQL Server16 TB (非 Express)

SQL Server 特殊限制:

  • 最小存储:Web/Express 20GB,Standard/Enterprise 200GB
  • 每个实例最多 30 个数据库
  • 存储无法扩展,需要恢复到新实例

性能优化

实例类型选择

db.t3.micro    - 开发/测试 (2 vCPU, 1GB)
db.t3.medium   - 小型生产 (2 vCPU, 4GB)
db.r5.large    - 中型生产 (2 vCPU, 16GB)
db.r5.2xlarge  - 大型生产 (8 vCPU, 64GB)
db.r6g.*       - Graviton2,更好性价比

存储类型

类型IOPS适用场景
gp23,000 baseline通用负载
gp33,000-16,000(可配置)灵活配置
io1/io264,000高性能 OLTP

注意: RDS 实例运行在 EBS 卷上,因此受 EBS 性能限制。如果需要更好性能,必须配置 Provisioned IOPS SSD。

参数优化

-- 连接池设置
max_connections = 实例内存(GB) * 50

-- 缓冲池大小 (MySQL)
innodb_buffer_pool_size = 实例内存 * 0.75

-- 查询缓存 (谨慎使用)
query_cache_size = 0  -- MySQL 8.0 已移除

备份策略

自动备份

# 启用自动备份
aws rds modify-db-instance \
  --db-instance-identifier mydb \
  --backup-retention-period 7 \
  --preferred-backup-window "03:00-04:00"

# ⚠️ 注意:导入数据时如果备份正在运行
# 导入时间会大大延长!

手动快照

# 创建快照
aws rds create-db-snapshot \
  --db-instance-identifier mydb \
  --db-snapshot-identifier mydb-snapshot-20240101

备份建议

环境保留期备份窗口
生产14-35 天低峰期(避免维护窗口)
开发7 天任意
测试1 天任意

安全配置

加密

# 启用存储加密 (创建时)
aws rds create-db-instance \
  --storage-encrypted \
  --kms-key-id arn:aws:kms:...

# 传输加密
--require-ssl

网络隔离

VPC
├── 私有子网 (数据库)
│   └── RDS 实例
├── 安全组
│   └── 只允许应用服务器访问
└── 不要分配公有 IP

⚠️ RDS 常见陷阱

1. 功能限制

# 🔸 RDS 不是完整的数据库服务器!
# 某些功能可能不可用

# PostgreSQL:检查支持的扩展
# https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html

# MySQL:没有 SUPER 权限
# 需要使用 AWS 提供的存储过程

# 如果需要的功能不支持,只能自建数据库

2. DNS 故障转移问题

# 🔸 RDS 故障转移基于 DNS 变更!
# 确保客户端正确处理 DNS 变化

# Java 特别注意:JVM DNS TTL 默认配置可能导致问题
# 参考:https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/java-dg-jvm-ttl.html

# 建议:设置较短的 DNS TTL
networkaddress.cache.ttl=60

3. MySQL 特定限制

# 🔸 没有 SUPER 权限
# 使用 AWS 提供的存储过程来启动/停止复制

# 🔸 复制到非 RDS 实例
# AZ 故障转移时复制会中断!

# 🔸 无法手动 CHANGE MASTER
# 主库故障转移后,所有副本需要重建

# 🔸 MyISAM 表不支持时间点恢复
# 快照前必须锁定并刷新表

4. PostgreSQL 特定限制

# 🔸 没有 superuser 权限
# 提供 rds_superuser 角色,但有限制

# 🔸 某些功能滞后于开源版本
# Aurora PostgreSQL 滞后更明显

# 🔸 难以排查性能问题
# 没有主机访问权限

# 🔸 某些维护工具需要命令行
# 可以使用外部 EC2 服务器

5. SQL Server 特定限制

# 🔸 存储无法扩展!
# 需要恢复到更大存储的新实例

# 🔸 每个实例最多 30 个数据库

# 🔸 只有 db_owner 权限

# ✅ 好消息:支持原生备份/恢复到 S3
# 可用于灾难恢复

6. Aurora 限制

# 🔸 Aurora 1.x 基于 MySQL 5.6.x
# 缺少大多数 5.7 特性

# 🔸 Aurora 2.x 基于 MySQL 5.7.x

# 🔸 不支持 GTID 事务

# 🔸 Aurora PostgreSQL 版本滞后
# 如需最新 PostgreSQL 特性,用标准 RDS

7. 存储空间不足

# 启用存储自动扩展
aws rds modify-db-instance \
  --db-instance-identifier mydb \
  --max-allocated-storage 1000

8. 连接数耗尽

# 使用连接池或 RDS Proxy

# RDS Proxy 特别适合:
# - Lambda 等无服务器应用
# - 避免连接数爆炸
# - 提高故障转移速度

ElastiCache 补充

如果需要缓存层,考虑 ElastiCache:

引擎特点适用场景
Redis支持复杂数据结构Session、排行榜、消息队列
Memcached简单 key/value,更快纯缓存,可水平扩展
# 选择建议:
# - 需要持久化、发布订阅、复杂数据类型 → Redis
# - 纯粹的缓存,需要最大性能 → Memcached

📚 本章小结

  • RDS 简化数据库运维,但有功能限制
  • Aurora 是高并发场景首选,共享存储架构提供更好的可用性
  • 必须创建自定义参数组,默认参数组不允许动态更改
  • Multi-AZ 用于高可用(同步),Read Replica 用于读扩展(异步)
  • Aurora 只读副本相当于 Multi-AZ,通常不需要额外配置
  • 注意 DNS 故障转移问题,特别是 Java 应用
  • 不同引擎有不同限制,选择前需要验证功能支持
  • 备份和安全配置不可忽视
  • 考虑 RDS Proxy 解决连接池问题
📝 章节练习 (20 题)
开始练习