前置知识: 云计算

云数据库服务

6 min高级

云数据库服务选型、托管关系型数据库、云原生数据库、NoSQL托管服务、数据库迁移策略、多区域复制与容灾。

1. 云数据库服务概述

1.1 托管数据库 vs 自建数据库

维度托管数据库自建数据库
运维负担低(自动备份/升级/监控)高(全链路自行负责)
可用性内置多 AZ 高可用需自行搭建主从/集群
弹性按需伸缩,存储自动扩展容量规划,扩容复杂
成本按使用付费,有溢价前期投入大,长期可能更低
灵活性受限于云厂商功能完全控制配置与插件
迁移风险厂商锁定无锁定

1.2 云数据库服务分类

flowchart LR
    S[云数据库服务]
    S --> R[关系型<br/>RDS/Cloud SQL/MySQL/PostgreSQL/SQL Server/Oracle]
    S --> N[NoSQL<br/>DynamoDB/MongoDB Atlas/ElastiCache/Firestore]
    S --> C[云原生/新架构<br/>Aurora/PolarDB/TiDB Cloud/CockroachDB/PlanetScale]

2. 托管关系型数据库

2.1 AWS RDS

RDS 支持多种数据库引擎,提供统一的托管能力:

引擎版本最大存储最大实例
MySQL8.064 TBdb.r6g.16xlarge
PostgreSQL1664 TBdb.r6g.16xlarge
MariaDB10.1164 TBdb.r6g.16xlarge
Oracle19c64 TBdb.r6g.16xlarge
SQL Server202216 TBdb.r6g.16xlarge

多 AZ 部署架构:

flowchart TD
    subgraph Region[AWS Region]
        subgraph AZA[AZ-A]
            P[Primary R/W]
        end
        subgraph AZB[AZ-B]
            S1[Standby 不可读]
        end
        RR[Read Replica<br/>异步复制,跨区域可选,可读]
    end
    P <-->|同步复制| S1
    P --> RR

经典 Multi-AZ 部署中,Standby 只是热备,不对外提供读服务,应用仅通过主端点 访问;需要可读的备库应使用 Read Replica,或 MySQL 8.0/PostgreSQL 的 Multi-AZ DB Cluster(两个可读 Standby + 读写分离端点)。

2.2 阿里云 RDS

与 AWS RDS 类似,但针对国内场景优化:

  • X-Engine:阿里自研存储引擎,压缩率高达 10:1
  • SQL 审计:内置 SQL 审计与性能洞察
  • CloudDBA:智能诊断与优化建议
  • 多租户隔离:资源组级别的 CPU/内存隔离

2.3 高可用与故障切换

RDS 多 AZ 故障切换流程:

1. 主实例故障检测(30-60秒)
2. DNS 切换到备用实例
3. 备用实例提升为主实例
4. 自动创建新的备用实例
5. 应用通过新 DNS 端点重连

总故障切换时间通常在 1-5 分钟。

3. 云原生数据库

3.1 Amazon Aurora

Aurora 是 AWS 自研的云原生关系数据库,核心创新在于存储计算分离:

flowchart TD
    subgraph Aurora[Aurora 架构]
        subgraph Compute[计算层]
            W[Writer Instance]
            R1[Reader 1 Instance]
            R2[Reader 2 Instance]
        end
        subgraph Storage[Aurora Storage 6 副本/3 AZ]
            P1[P1 AZ-A] P2[P2 AZ-A] P3[P3 AZ-B] P4[P4 AZ-B] P5[P5 AZ-C] P6[P6 AZ-C]
        end
        W --> Storage
        R1 --> Storage
        R2 --> Storage
    end

Aurora 关键特性:

  • 日志即数据库:计算节点只写 Redo Log 到存储层,存储节点自行构建数据页
  • 6 副本写入:4/6 确认即写入成功,兼顾性能与可靠性
  • 读副本延迟:亚毫秒级(共享存储,无需复制数据)
  • 快速克隆:Copy-on-Write 克隆,秒级创建

Aurora 写入流程:

写入延迟=max⁡(4 个最快副本确认时间)\text{写入延迟} = \max(\text{4 个最快副本确认时间})

可靠性方面,官方口径是存储层面向 99.99% 以上可用性、跨 3 个 AZ 的 6 副本冗余 自动修复——不要用单一数字公式外推,实际 SLA 以当期官方文档为准。

3.2 阿里云 PolarDB

PolarDB 采用类似的存储计算分离架构:

  • PolarFS:分布式文件系统,RDMA 网络低延迟
  • 共享存储:一写多读,读节点直接共享存储
  • 物理复制:基于 Redo Log 的物理复制,延迟 < 1ms
  • Serverless:自动弹性,按 ACU 计费

3.3 TiDB Cloud

TiDB 是开源的 HTAP(混合事务/分析处理)数据库:

flowchart TD
    subgraph TiDBCloud[TiDB Cloud 架构]
        TDB[TiDB SQL 层<br/>解析 → 优化 → 执行 → 返回]
        TKV[TiKV 行存/OLTP<br/>Raft 复制]
        TF[TiFlash 列存/OLAP<br/>异步复制]
        PD[PD 调度器]
    end
    TDB --> TKV
    TDB --> TF
    TKV --> PD
    TF --> PD

HTAP 查询路由:

查询类型={OLTP⇒TiKV(行存)OLAP⇒TiFlash(列存)\text{查询类型} = \begin{cases} \text{OLTP} \Rightarrow \text{TiKV(行存)} \\ \text{OLAP} \Rightarrow \text{TiFlash(列存)} \end{cases}

4. NoSQL 托管服务

4.1 DynamoDB

AWS DynamoDB 是全托管的键值/文档数据库:

核心概念:

概念描述
Table数据集合
Item一条记录(最大 400KB)
Attribute字段
Partition Key分区键(必需)
Sort Key排序键(可选)
GSI全局二级索引
LSI本地二级索引

容量模式:

  • 预置容量:指定 RCU/WCU,适合可预测负载
  • 按需容量:自动伸缩,适合不可预测负载
RCU={1强一致读 ≤4KB0.5最终一致读 ≤4KB(即 1 RCU 可撑 2 次最终一致读)\text{RCU} = \begin{cases} 1 & \text{强一致读 } \leq 4\text{KB} \\ 0.5 & \text{最终一致读 } \leq 4\text{KB(即 1 RCU 可撑 2 次最终一致读)} \end{cases} WCU=1 per 1KB write\text{WCU} = 1 \text{ per } 1\text{KB write}

DAX(DynamoDB Accelerator):内存缓存,微秒级延迟,写穿透策略。

4.2 MongoDB Atlas

全托管 MongoDB 服务,多云支持:

  • 集群类型:副本集、分片集群、Serverless(实例按需启停)
  • Atlas Search:内置全文搜索(基于 Lucene)
  • Atlas Vector Search:向量检索,支撑 RAG 场景
  • Atlas Data Federation:统一查询 S3 等外部数据源
  • 自动分片:基于分片键自动数据分布

早期的 Atlas App Services(无服务器后端)与 Device Sync 已于 2025 年 9 月停止服务, 新方案不要基于它们设计。

4.3 ElastiCache / Redis 云服务

托管 Redis/Memcached 服务:

特性RedisMemcached
数据结构丰富(String/List/Set/Hash/ZSet)简单 KV
持久化RDB + AOF无
集群Redis Cluster客户端分片
复制主从复制无
适用场景缓存 + 数据存储纯缓存

5. 数据库迁移策略

5.1 迁移方法论

评估 → 规划 → 迁移 → 验证 → 切换 → 优化
 │       │       │       │       │       │
 ▼       ▼       ▼       ▼       ▼       ▼
源端分析  迁移方案  全量+增量  数据校验  灰度切换  性能调优
兼容性    回滚计划  CDC同步   功能测试  流量切换  成本优化

5.2 同构迁移 vs 异构迁移

同构迁移(MySQL → RDS MySQL):

  • 使用原生工具(mysqldump、DTS)
  • 兼容性高,风险低
  • 主要关注版本差异和字符集

异构迁移(Oracle → PostgreSQL):

  • Schema 转换(数据类型、存储过程、SQL 方言)
  • 使用 AWS SCT / 阿里云 ADAM 评估兼容性
  • 应用代码适配工作量可能很大

5.3 最小停机迁移(CDC)

基于变更数据捕获(CDC)的迁移流程:

1. 全量导出源库数据 → 导入目标库
2. 启动 CDC 捕获增量变更
3. 持续同步增量数据到目标库
4. 验证数据一致性
5. 短暂停机(秒级),同步最后增量
6. 切换应用到目标库

CDC 工具:

工具源端目标端特点
AWS DMS多种多种全托管
DebeziumMySQL/PG/OracleKafka开源,基于日志
CanalMySQLKafka/自定义阿里开源
Cloud Canal多种多种商业化 CDC

5.4 数据校验

迁移后必须进行数据校验:

校验方法={行数对比快速验证Checksum 对比精确验证业务抽样验证语义验证\text{校验方法} = \begin{cases} \text{行数对比} & \text{快速验证} \\ \text{Checksum 对比} & \text{精确验证} \\ \text{业务抽样验证} & \text{语义验证} \end{cases}

6. 多区域复制与容灾

6.1 跨区域复制策略

策略复制方式RPO成本适用场景
同步复制写入时同步0高金融交易
异步复制后台同步秒级-分钟级中一般业务
半同步至少1个从确认接近0中高关键业务

6.2 Aurora Global Database

Aurora 全球数据库支持跨区域只读和灾难恢复:

flowchart LR
    subgraph P[主区域 us-1]
        PW[Writer]
        PS[Storage 6副本]
        PW --> PS
    end
    subgraph B[备区域 eu-1]
        BR[Reader]
        BS[Storage 6副本]
        BR --> BS
    end
    PS -->|复制| BS
  • 跨区域复制延迟通常 < 1 秒
  • 备区域可挂载最多 16 个读实例
  • 灾难恢复 RTO < 1 分钟(托管的集群切换)

6.3 DynamoDB Global Tables

DynamoDB 全球表支持多区域多活写入:

  • 所有区域均可读写
  • 基于最后写入者胜出(LWW)解决冲突
  • 复制延迟通常 < 1 秒
  • 适合全球分布的应用

6.4 容灾演练

容灾方案必须定期验证:

  • 桌面演练:团队讨论故障场景与应对步骤
  • 组件演练:模拟单个组件故障(数据库主从切换)
  • 全量演练:模拟区域级故障,验证完整恢复流程
  • 混沌工程:生产环境注入故障(Chaos Monkey、Litmus)

小结

  • 初学者要点:托管数据库买的是”运维责任转移”,溢价换来自动备份/高可用/监控; RDS 多 AZ 保可用、Read Replica 扩读、Aurora 用存储计算分离同时改善两者; 选型先问访问模式——关系型、键值、缓存各有其位。
  • 进阶注意:故障切换 1-5 分钟内应用会断连,连接池必须支持自动重连与 DNS 重解析; CDC 迁移的切换窗口靠”最后一公里”增量收敛,校验(行数 + checksum + 抽样)不可省; DynamoDB 按需容量单价约为预置的 2-3 倍,稳定负载切回预置可省一半。