应用层 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
推荐阅读
- Patroni Documentation — PostgreSQL HA 编排
- GitHub Orchestrator — MySQL 拓扑管理
- AWS RDS Multi-AZ / Aurora
- Designing Data-Intensive Applications (Martin Kleppmann) — 一致性 / 复制 / 分片的经典书
- Vitess — MySQL 分片
- PostgreSQL Backup Best Practices
下一篇:缓存与消息队列。