应用层 HA 容易,数据层难

无状态服务多副本几乎免费——但数据库

  • 写一致性要求让多主难做
  • 跨区复制有延迟
  • 数据规模大到一定程度(上百 GB 起)单机扛不住

每一步都要小心翼翼。

经典 HA 拓扑(PostgreSQL / MySQL 类)

1. 主从(Primary + Replica)

写 → Primary
读 → Primary 或 Replica
故障 → 手动/自动 把 Replica 提升为 Primary

主流方案:

  • PostgreSQL:流复制(streaming replication)+ Patroni / repmgr 做编排
  • MySQL:异步 / 半同步复制 + Orchestrator / MHA / MySQL Group Replication

托管服务(AWS RDS / Cloud SQL / 阿里 RDS / 腾讯 CDB)默认做了主从——几乎不用自己搞

2. 多副本(Multi-Replica)

Primary
  ├── Replica 1(同区)
  ├── Replica 2(同区,HA)
  └── Replica 3(异区,灾备 / 读分流)

读写分离:写打 Primary,读分散到 Replica——但要接受 replica 滞后(异步复制 → 几毫秒到几秒延迟)。

3. 自动故障转移(Auto Failover)

工具:

工具 数据库 备注
Patroni PostgreSQL 业内事实标准,基于 etcd / Consul
repmgr PostgreSQL 开源老牌
Orchestrator MySQL GitHub 出品,已捐给 OpenArk
MySQL Group Replication / InnoDB Cluster MySQL 官方多主方案
托管服务自带 各家 RDS 几次点击启用

⚠ 自动 failover 有自身风险:脑裂(split-brain)—— 网络分区时两边都以为自己是 master,写入冲突。Patroni 等用分布式锁(etcd)避免这个。

分片(Sharding)

数据规模超过单机能扛 → 切分到多台。两种维度:

  • 水平分片(Sharding):按某个键(user_id / 时间)切到不同 DB
  • 垂直分片:不同的表 / 模块切到不同 DB

水平分片复杂得多——应用层要知道"这条数据在哪个分片"。常用工具:

  • Vitess(CNCF Graduated):MySQL 上的分片层,YouTube 出品
  • Citus:PostgreSQL 分片扩展(Microsoft 收购)
  • TiDB / OceanBase / CockroachDB:分布式 SQL,原生分片

多数公司不需要分片——单机 + 主从扛 99% 业务。考虑分片前先问:"是不是某些查询不优化导致以为单机不够?"

NoSQL 的 HA

  • MongoDB:Replica Set + Sharding(自带)
  • Cassandra / ScyllaDB:去中心化多主,原生支持
  • Redis:Sentinel(HA) + Cluster(分片)
  • DynamoDB / Cosmos DB / 阿里 OTS:托管,HA 透明

备份的几种维度

维度 含义
全量 完整数据库 dump(pg_dump / mysqldump)
增量 自上次后变化(WAL / binlog)
PITR(Point-in-Time Recovery) 恢复到任意时间点
快照 块设备级冷拷贝(云盘快照)

生产数据库至少要 PITR——单纯每日全量丢失窗口太大。

备份不等于演练(再说一次)

每个季度强制做一次:

# 1. 拉一份生产备份到隔离环境
# 2. restore 看耗时
pg_restore --dbname=test_restore backup.dump
# 3. 跑应用 / 测试关键路径
# 4. 看数据完整性(对账)

如果发现:

  • 备份比预期慢 5 倍 → 灾难时 RTO 不够
  • 某些表没备份成功 → 修复 + 加监控
  • 应用在 restore 库上跑不起来 → 缺 sequence / extension / 角色

演练就是为了发现这些,平时不练真出事时 100% 出洋相。

反模式

  • 只跑 backup 不跑 restore 测试:经典翻车
  • 备份和数据库在同一机器 / 同一可用区:火灾一起烧
  • 备份没加密:泄露 = 全部数据泄露
  • 依赖云商默认 7 天保留:不够;改长 + 异地复制
  • DBA 一人独扛:bus factor 1
  • 做了 PITR 但没监控备份是否成功:发现失败已是几个月后

一个最低实践清单

  • 启用主从(托管服务一键)
  • 启用 PITR
  • 备份保留 ≥ 30 天,关键库 ≥ 90 天
  • 跨区域复制(云上一键启用)
  • 季度做一次 restore 演练
  • 备份成功状态接告警
  • 数据库 schema 改动有审批 + 双人 review

推荐阅读

下一篇:缓存与消息队列。