华为云 RDS for MySQL 高可用方案:主备、只读、Proxy 与跨 region
> RDS 控制台点一下"高可用"不等于业务真的高可用——读写分离、连接池、跨 region 容灾都得自己接。
## 背景
华为云 RDS for MySQL 提供开箱即用的高可用选项,但"开箱即用"指的是**实例层面的主备自动切换**,不包含业务侧的读写分离、连接重试、跨 region 容灾。本文把笔者一个日均 200 万 QPS 电商库的高可用方案拆成四层讲清。
## 第一层:主备切换(RDS 内置)
创建 RDS 时选"主备实例",华为云会在两个 AZ 部署主库和备库,通过 binlog 同步。主库故障时 RDS 自动切换到备库,典型切换时间 30 秒以内。
关键参数:
- **同步模式**:`async`(异步)性能最好但可能丢已提交事务;`semisync`(半同步)保证至少一个备库收到才返回,推荐生产用。
- **切换策略**:默认自动切换,可配置切换通知到 SMN。
- **数据复制方式**:异步复制延迟通常 < 1 秒,半同步 < 100ms。
**这一层只解决"主库宕机不丢实例",不解决"业务连接如何切到新主库"**——那是下一层的事。
## 第二层:连接重试与 DDC(业务侧)
主备切换的 30 秒内,业务侧的连接会报 `Connection refused`。三种应对:
1. **应用层重试**:连接池配置 `connectTimeout=5s` + 失败重试 3 次,能覆盖大部分切换窗口。
2. **DDC(数据库代理)**:华为云 RDS 提供数据库代理(DDC),业务连 DDC 地址而非主库直连,切换时 DDC 自动重连新主库,业务无感。
3. **DNS 缓存陷阱**:如果业务用域名连库,注意 JVM 默认缓存 DNS 30 秒,切换后 30 秒内仍连旧 IP。需在 `java.security` 或连接串里设 `networkaddress.cache.ttl=5`。
**推荐组合:DDC + 应用层短重试**,DDC 挡住大部分切换,重试挡住 DDC 自身重连的毫秒级抖动。
## 第三层:读写分离(只读实例 + DDC)
读 QPS 远高于写 QPS 时,加只读实例分担读流量。RDS 最多支持 15 个只读实例,主库 binlog 异步同步过去。
配置读写分离有两种方式:
- **DDC 自动读写分离**:业务连 DDC,DDC 根据 SQL 语句类型(SELECT vs INSERT/UPDATE)自动路由到只读或主库。零代码改动。
- **应用层手动分流**:Spring 用 `@Transactional(readOnly=true)` 注解,框架路由到只读数据源。可控性更强。
只读实例的延迟通常 < 1 秒,但**强一致读(如订单创建后立即查询)必须走主库**,不能走只读,否则可能查不到刚写入的数据。DDC 的路由策略里要把"事务内"的读强制走主库。
## 第四层:跨 region 容灾(DRS)
主备只在单 region 内的两个 AZ,整个 region 故障时仍会丢。对核心库需要跨 region 容灾:
- **DRS(数据复制服务)**:在备 region 部署一个独立 RDS,用 DRS 从主 region 实时同步过去。故障时手动或脚本切换业务到备 region。
- **成本权衡**:跨 region DRS 需要额外一份 RDS 实例费用 + DRS 任务费用,只对真正核心的库做。非核心库靠单 region 主备 + 备份恢复即可。
## 备份与恢复:最后一道保险
RDS 自动备份保留 7 天(可配 730 天),加上 binlog 可恢复到任意时间点。但**备份恢复不是高可用手段,是数据兜底**——恢复时间按库大小从分钟到小时不等,不能当容灾用。
实践配置:
- 自动备份:每天凌晨 2 点,保留 30 天。
- 增量备份:每 5 分钟一次 binlog。
- 跨 region 备份复制:核心库开启,备 region 同样保留 30 天。
## 小结
RDS 高可用是四层叠加:**主备切换挡实例故障、DDC 挡切换抖动、只读挡读流量、DRS 挡 region 故障**。每一层都解决一个不同范围的问题,缺任何一层都有对应的故障窗口。控制台点一下"高可用"只是第一层,剩下三层要业务侧自己接——但接上之后,数据库的可用性才能真正对齐业务的 SLA。
- 点赞
- 收藏
- 关注作者
评论(0)