第 31 章
云数据库对比
云数据库对比:RDS vs Aurora vs PolarDB
云数据库彻底改变了运维方式:自动备份、一键扩容、多可用区 HA、按需计费。但不同云厂商的产品在架构、性能、成本和生态上差异显著,选型错误代价极高。
云数据库全景
| 产品 | 厂商 | 架构特点 | MySQL 兼容 | 最大存储 |
|---|---|---|---|---|
| RDS for MySQL | AWS | 传统主从,共享存储(EBS) | 完全兼容 | 64 TB |
| Aurora MySQL | AWS | 存储计算分离,6 副本存储 | 兼容(有差异) | 128 TB |
| PolarDB for MySQL | 阿里云 | 存储计算分离,共享分布式存储 | 高度兼容 | 100 TB |
| Cloud SQL | GCP | 传统主从,区域存储 | 完全兼容 | 64 TB |
| Azure Database | 微软 | 传统主从 + Flexible Server | 完全兼容 | 16 TB |
| TDSQL / CynosDB | 腾讯云 | 存储计算分离 | 高度兼容 | 100 TB |
Amazon RDS for MySQL
AWSRDS for MySQL
托管的传统 MySQL,底层基于 EBS 存储。最大优势是完全兼容原生 MySQL,迁移无缝;最大局限是性能受单机 EBS IOPS 瓶颈限制。
关键特性
| 特性 | 说明 |
|---|---|
| 多可用区(Multi-AZ) | 同步复制到备用实例,故障自动切换(60-120 秒) |
| 只读副本 | 异步复制,最多 5 个,可跨区域(Cross-Region Read Replica) |
| 存储类型 | gp2 / gp3(通用)/ io1 / io2(高 IOPS,最高 256K IOPS) |
| 自动备份 | 每日快照 + Binlog,点恢复(PITR)精度 5 分钟 |
| 参数组 | 通过 Parameter Group 修改大多数 MySQL 参数 |
| 加密 | 静态加密(AES-256)+ 传输加密(TLS)+ KMS 托管密钥 |
适用场景与限制
✅ 适合:
- 现有 MySQL 应用上云,需要完全兼容
- 中小规模,IOPS 需求 < 64K
- 开发/测试环境(db.t3.micro 极便宜)
❌ 限制:
- 不能修改 super_read_only 等底层参数
- 不支持 MyISAM 表(全量备份期间会锁表)
- 存储扩容只能向上,不能缩减
Amazon Aurora MySQL
AWSAurora MySQL
AWS 自研的云原生数据库,存储层重新设计:数据在 3 个可用区的 6 个副本中存储,写入只需 4/6 副本确认即可返回,读取只需 3/6 副本。InnoDB Redo Log 直接写存储层,绕过了 double-write buffer。
Aurora 架构
┌─────────────────────────────────────┐
│ Writer Instance Reader Instance │
│ (compute) (compute) │
└──────────┬──────────────────────────┘
│ 日志写入 (非数据页)
┌──────────▼──────────────────────────┐
│ Aurora 分布式存储层 │
│ AZ-1: [copy1][copy2] │
│ AZ-2: [copy3][copy4] │
│ AZ-3: [copy5][copy6] (6 副本) │
└─────────────────────────────────────┘
写入仲裁: 4/6 读取仲裁: 3/6
Aurora vs RDS 性能对比
| 指标 | RDS MySQL | Aurora MySQL |
|---|---|---|
| 写入 TPS(官方声称) | 基准 | 5x(实际 1.5-3x) |
| 故障切换时间 | 60-120 秒 | 10-30 秒 |
| 只读副本延迟 | 毫秒-秒级 | 通常 <100ms |
| 最大存储 | 64 TB | 128 TB(自动扩展) |
| 价格(同规格) | 1x | 约 1.2-1.5x |
Aurora Serverless v2
# 配置 Aurora Serverless v2 扩缩容范围
aws rds modify-db-cluster \
--db-cluster-identifier my-cluster \
--serverless-v2-scaling-configuration MinCapacity=0.5,MaxCapacity=128
-- 1 ACU ≈ 2 GB RAM,0.5 ACU 是最小单位
-- 可在数秒内从 0.5 ACU 扩展到 128 ACU
-- 适合:流量波动大的 SaaS / 开发测试环境
Aurora 的隐藏限制
注意这些 Aurora 与原生 MySQL 的差异:
• 不支持 MyISAM(静默转换为 InnoDB,可能出 bug)
• AUTO_INCREMENT 在故障切换后可能不连续(GAP 更大)
• 某些 FULLTEXT 索引行为不同
• 不支持 XA 事务(Aurora MySQL 2.x)
• 存储引擎层不开放,无法安装插件
阿里云 PolarDB for MySQL
阿里云PolarDB for MySQL
阿里云自研,架构与 Aurora 类似,一写多读,底层使用 PolarFS 分布式存储。在中国公有云市场占有率第一,深度集成阿里云生态(DMS、DTS、MaxCompute)。
| 特性 | PolarDB | Aurora |
|---|---|---|
| 只读节点数 | 最多 15 个 | 最多 15 个 |
| 只读延迟 | <1ms(物理复制) | <100ms(物理复制) |
| 最大规格 | 88 核 710 GB | 128 核 1 TB(r6g.16xlarge) |
| Global Database | 支持(多Region) | 支持(Aurora Global DB) |
| HTAP | 支持(IMC 列式内存引擎) | 不支持(需 Redshift) |
| 价格(中国区) | 较低 | 较高 |
PolarDB HTAP 特性
-- 开启 In-Memory Column Store (IMC),无需修改 SQL
-- 优化器自动决定是否使用列式引擎
SET polar_enable_imci = ON;
-- 指定 HINT 强制使用 IMCI(分析查询)
SELECT /*+ IMCI */ department, SUM(salary)
FROM employees
GROUP BY department;
-- 在只读节点执行,不影响主库写入性能
Google Cloud Spanner
Cloud Spanner 是 Google 的全球分布式数据库,提供真正的全球强一致性(TrueTime API),但与 MySQL 兼容性有限(通过 MySQL 接口层访问),价格昂贵。适合需要全球多区域写入的应用。
# Cloud Spanner 定价示例(us-central1 单区域)
Processing units: $0.09/100 PU/hour
Storage: $0.30/GB/month
# 1000 PU (最小建议生产配置) ≈ $720/月 起步
# 适合:跨国金融/游戏/SaaS,不适合成本敏感的国内业务
深度对比:Aurora vs PolarDB
| 维度 | Aurora MySQL | PolarDB for MySQL | 胜出 |
|---|---|---|---|
| 写性能(OLTP) | 高 | 相当 | 平局 |
| 只读副本延迟 | <100ms | <1ms | PolarDB |
| 最大规格 | 1 TB RAM | 710 GB RAM | Aurora |
| HTAP 支持 | 不支持 | 支持 IMCI | PolarDB |
| 全球部署 | Aurora Global DB | PolarDB Global DB | 平局 |
| 中国合规 | AWS 中国区限制多 | 完整支持 | PolarDB |
| MySQL 兼容性 | 差异较多 | 高度兼容 | PolarDB |
| 生态成熟度 | 全球最丰富 | 国内最丰富 | 看场景 |
| 价格(中国区) | 较高 | 较低 | PolarDB |
上云迁移方案
自建 MySQL → 云数据库迁移步骤
阶段 1: 全量迁移
mysqldump / Xtrabackup → 云数据库初始化
阶段 2: 增量同步(实时 CDC)
源库 Binlog → DTS/DMS/Debezium → 目标云库
阶段 3: 数据校验
pt-table-checksum / 云厂商校验工具
阶段 4: 业务切流
修改应用连接串 → 灰度切换 → 全量切换
阶段 5: 清理
下线源库,保留观察期(建议 7 天)
# AWS DMS(Database Migration Service)迁移配置示例
aws dms create-replication-task \
--replication-task-identifier mysql-to-aurora \
--source-endpoint-arn arn:aws:dms:... \
--target-endpoint-arn arn:aws:dms:... \
--migration-type full-load-and-cdc \
--table-mappings file://table-mappings.json \
--replication-task-settings file://task-settings.json
成本优化
AWS 费用优化技巧
# 1. 使用 Reserved Instances(预留实例)节省 30-60%
aws rds purchase-reserved-db-instances-offering \
--reserved-db-instances-offering-id ... \
--db-instance-count 1 \
--reserved-db-instance-id my-reserved-instance
# 2. 使用 gp3 替代 gp2(同 IOPS 费用更低)
aws rds modify-db-instance \
--db-instance-identifier mydb \
--storage-type gp3 \
--iops 3000 \
--storage-throughput 125
# 3. Aurora Serverless v2 适合低流量环境
# 最小 0.5 ACU ≈ 按 $0.12/ACU-hour 计费
# 4. 停止非生产实例
aws rds stop-db-instance --db-instance-identifier dev-db
# 注意:停止后最多 7 天自动重启
选型指南
| 场景 | 推荐产品 | 原因 |
|---|---|---|
| 国内 OLTP + 低延迟只读 | PolarDB for MySQL | <1ms 只读延迟,价格合理,高度兼容 |
| AWS 生态 + 海外业务 | Aurora MySQL | 生态最成熟,全球可用区 |
| 流量极不稳定的 SaaS | Aurora Serverless v2 | 秒级弹性伸缩,按用量付费 |
| 国内 OLAP + HTAP | PolarDB + IMCI | 无需额外 ETL,列式引擎加速分析 |
| 全球强一致写入 | Cloud Spanner | 唯一真正全球分布式 ACID |
| 成本极敏感 / 开发测试 | RDS MySQL t3.micro | 最低 $13/月,完全兼容 |
| 现有 MySQL 迁移,不改代码 | RDS MySQL | 完全兼容,无需任何代码修改 |
实践建议:对于国内出海 SaaS 产品,推荐主库使用 PolarDB(国内区域)+ Aurora(海外区域),通过 Global Database 功能实现跨地域读写分离,兼顾国内低延迟和海外可用性。