引言
可用性是衡量系统质量的核心指标。不同等级的可用性对应着截然不同的停机时间:
| 可用性 | 年停机时间 | 月停机时间 | 适用场景 |
|---|---|---|---|
| 99.9% (3个9) | 8.76 小时 | 43.8 分钟 | 一般业务系统 |
| 99.99% (4个9) | 52.56 分钟 | 4.38 分钟 | 核心业务系统 |
| 99.999% (5个9) | 5.26 分钟 | 26.3 秒 | 金融、医疗等关键系统 |
每提升一个 9,架构复杂度和成本呈指数级增长。本文将系统性地介绍如何构建真正高可用的后端系统。
目录
- 1. 高可用设计原则
- 2. 多可用区部署(Multi-AZ)
- 3. 多活架构对比
- 4. 数据库高可用
- 5. 故障检测机制
- 6. RTO 与 RPO
- 7. 灾备方案设计
- 8. 混沌工程
- 9. 故障演练清单
- 10. 总结
- 11. 延伸阅读
1. 高可用设计原则
1.1 消除单点故障
单点故障(SPOF)是高可用架构的最大敌人。核心策略包括:冗余部署(每个关键组件至少 2 个实例)、负载均衡(避免单实例过载)、无状态设计(便于水平扩展)、数据复制(主从或多副本架构)。
1.2 故障隔离
防止局部故障扩散为全局故障:舱壁模式(Bulkhead) 将系统划分为独立隔离区;熔断器(Circuit Breaker) 在故障率超阈值时快速失败;限流 防止突发流量压垮系统;超时与重试 避免雪崩效应。
1.3 自动恢复
高可用系统必须具备无需人工干预的自愈能力:自动重启(容器崩溃后恢复)、自动扩缩容(根据负载调整实例数)、自动故障转移(主节点故障时切换到备节点)。
2. 多可用区部署(Multi-AZ)
2.1 架构设计
多可用区部署将应用分布在同一地域的多个物理隔离数据中心,每个 AZ 拥有独立的电力、网络和冷却系统:
┌─────────────────┐
│ Load Balancer │
└────────┬────────┘
┌───────────────┼───────────────┐
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ AZ-1 │ │ AZ-2 │ │ AZ-3 │
│ App Pods │ │ App Pods │ │ App Pods │
│ DB Primary│ │ DB Read │ │ DB Read │
└───────────┘ └───────────┘ └───────────┘
关键要点:每个 AZ 至少 2 个实例,数据库主从分布在不同 AZ,LB 跨 AZ 分发流量。
2.2 DNS 路由策略
- 加权轮询:按权重分配流量到各 AZ(如 33/33/34)
- 延迟路由:自动选择延迟最低的路径
- 故障转移路由:主 AZ 健康检查失败时自动切换到备用 AZ
3. 多活架构对比
3.1 Active-Active vs Active-Passive
| 维度 | Active-Active | Active-Passive |
|---|---|---|
| 流量分发 | 所有节点同时处理 | 仅主节点处理 |
| 资源利用率 | 高 | 低(备用空闲) |
| 故障转移时间 | 秒级 | 分钟级 |
| 数据一致性 | 复杂(需处理冲突) | 简单(单主写入) |
| 实现复杂度 | 高 | 中等 |
3.2 适用场景分析
Active-Active 适合:读多写少业务、对可用性要求极高的核心系统、需要水平扩展读能力的场景。
Active-Passive 适合:写密集型业务、数据一致性要求极高、团队运维能力有限、成本敏感型项目。
4. 数据库高可用
4.1 主从复制与读写分离
同步复制(强一致,高延迟)、异步复制(性能好,可能丢数据)、半同步复制(平衡一致性和性能)。读写分离通过代理层将写请求路由到主库,读请求分发到从库。
4.2 PostgreSQL 自动故障转移
Patroni + etcd 是 PostgreSQL 最流行的高可用方案:
# patroni.yml 关键配置
bootstrap:
dcs:
ttl: 30
loop_wait: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
parameters:
hot_standby: "on"
wal_level: replica
故障转移流程:Patroni 监控主库 → 故障时选举延迟最低的从库为新主 → 更新 DNS/VIP → 其他从库自动跟随新主。
5. 故障检测机制
5.1 健康检查与心跳
常见方式包括 HTTP 健康检查(/health 端点)、TCP 端口检测、心跳机制(节点定期发送心跳到 etcd/ZooKeeper,超时未发送则认为故障)。
# Kubernetes 探针配置
livenessProbe:
httpGet: { path: /health, port: 8080 }
periodSeconds: 10
failureThreshold: 3
5.2 Phi Accrual Failure Detector
自适应故障检测算法:不直接判断"是否故障",而是计算故障置信度(Phi 值)。根据历史心跳动态调整阈值,适应网络抖动,减少误判。被 Cassandra、Akka 等系统广泛采用。
6. RTO 与 RPO
6.1 定义与计算
- RTO(Recovery Time Objective):从故障到完全恢复的最大允许时间 = 检测时间 + 决策时间 + 恢复时间 + 验证时间
- RPO(Recovery Point Objective):允许丢失的最大数据量(以时间衡量)= 最后备份时间 - 故障时间
6.2 业务等级目标设定
| 业务等级 | RTO 目标 | RPO 目标 | 典型场景 |
|---|---|---|---|
| Tier 0(关键) | < 5 分钟 | 0(零丢失) | 金融交易、支付 |
| Tier 1(重要) | < 1 小时 | < 5 分钟 | 核心业务系统 |
| Tier 2(一般) | < 4 小时 | < 1 小时 | 内部管理系统 |
| Tier 3(低优) | < 24 小时 | < 24 小时 | 报表、日志分析 |
7. 灾备方案设计
7.1 冷备、温备、热备对比
| 方案 | 数据同步 | 启动时间 | 成本 | 适用场景 |
|---|---|---|---|---|
| 冷备 | 定期备份 | 小时级 | 低 | 非关键业务 |
| 温备 | 异步复制 | 分钟级 | 中 | 一般业务 |
| 热备 | 实时同步 | 秒级 | 高 | 核心系统 |
7.2 跨区域复制策略
- 数据库:PostgreSQL 流复制跨 Region,配置 SSL 和异步复制
- 对象存储:S3 Cross-Region Replication(CRR)
- 消息队列:Kafka MirrorMaker 2.0 或 RabbitMQ Federation
8. 混沌工程
8.1 Chaos Monkey 实践
Netflix 开源的混沌工程工具,核心原则:在生产环境执行、随机选择目标、在业务高峰期执行。
chaosmonkey config \
--mean-time-between-failure=2h \
--enabled=true
8.2 LitmusChaos 实践
面向 Kubernetes 的混沌工程平台:
kubectl apply -f https://litmuschaos.github.io/litmus/litmus-operator-v2.14.0.yaml
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: pod-delete
spec:
appinfo:
appns: 'default'
applabel: 'app=nginx'
appkind: 'deployment'
experiments:
- name: pod-delete
spec:
components:
env:
- name: TOTAL_CHAOS_DURATION
value: '30'
9. 故障演练清单
基础设施层: 随机终止实例、模拟 AZ 故障、网络分区、数据库主从切换、缓存/消息队列故障。
应用层: 超时测试、熔断触发验证、限流策略、降级策略。
数据层: 备份恢复演练、数据一致性验证、跨区域切换测试。
流程层: On-Call 响应流程、沟通与升级机制、事后复盘(Postmortem)。
建议每季度至少一次全面演练,每月一次专项演练。
10. 总结
构建高可用架构需要多维度综合考虑:消除单点故障与故障隔离是设计基础;多 AZ 部署与多活架构是部署保障;数据库高可用与智能故障检测是核心支撑;合理的 RTO/RPO 目标与灾备方案是兜底策略;混沌工程与定期演练是持续验证手段。
高可用不是一次性项目,而是需要持续投入和演练的过程。没有经过演练的高可用架构,都不是真正的高可用架构。
11. 延伸阅读
- Designing Data-Intensive Applications - Martin Kleppmann
- Site Reliability Engineering - Google
- Chaos Engineering - Casey Rosenthal
- Patroni Documentation
- Netflix Chaos Monkey
- LitmusChaos Documentation
- AWS Well-Architected - Reliability Pillar
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。