第 2 章 · 高可用与容灾设计
本章讲解 HA(高可用) 与 DR(容灾) 的策略、RTO/RPO/SLA 量化、故障域设计与小紫云计算落地要点。
前置:PaaS 第 15 章;运维第 4 章;架构第 1 章 NFR。
2.1 核心指标
| 指标 | 含义 | 计算/示例 | 业务含义 |
|---|
| SLA | 对外可用性承诺 | 99.9% = 年停机 ≤ 8.76h | 合同赔偿阈值 |
| SLO | 内部目标(常严于 SLA) | 99.95% | 告警与容量依据 |
| SLI | 可测量指标 | 成功请求数 / 总请求数 | Prometheus 采集 |
| RTO | 恢复服务目标时间 | 30 分钟 | 灾备演练及格线 |
| RPO | 可接受数据丢失窗口 | 5 分钟 | 备份频率下限 |
| MTTR | 平均修复时间 | < 20 分钟 | on-call 考核 |
| MTBF | 平均故障间隔 | 越高越好 | 稳定性趋势 |
关系:RPO 越小 → 同步复制/更频备份 → 成本越高;RTO 越小 → 热备/自动切换 → 架构越复杂。
2.1.1 SLA 与允许停机对照
| SLA | 年停机 | 月停机 | 适用场景 |
|---|
| 99% | 3.65 天 | 7.2 小时 | 内部工具 |
| 99.9% | 8.76 小时 | 43.8 分钟 | 标准电商 |
| 99.95% | 4.38 小时 | 21.9 分钟 | 核心交易 |
| 99.99% | 52.6 分钟 | 4.38 分钟 | 支付/金融 |
2.2 高可用层次
| 层次 | 手段 | 目标 | 小紫实践 |
|---|
| 应用 | 多副本 + 探针 + 滚动发布 | 单 Pod 挂不影响服务 | Deployment replicas≥3 |
| 接入 | 多 Ingress / LB / 健康检查 | 入口无单点 | 双节点 Traefik + VIP |
| 数据 | 主从 / 哨兵 / 分片集群 | DB 故障自动切换 | 外置 RDS 或自建主从 |
| 存储 | 多副本卷 | 节点盘故障不丢数据 | Longhorn replica=3 |
| 集群 | 多 Master / 多 Worker | 控制面与调度可靠 | kubeadm 多节点(云计算 ch3) |
| 机房 | 同城双活 / 异地冷备 | 区域级灾难 | 第二集群 + 备份恢复 |
# 应用 HA — 滚动更新零不可用(配合 PDB)
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-api
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
spec:
containers:
- name: api
livenessProbe:
httpGet: { path: /health/live, port: 8080 }
initialDelaySeconds: 30
readinessProbe:
httpGet: { path: /health/ready, port: 8080 }
periodSeconds: 5
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: order-api-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: order-api
2.3 无状态优先
有状态 Pod ──► 难扩、难迁、备份复杂、发布慢
无状态 Pod ──► 加副本即可扛流量,随时销毁重建
| 状态类型 | 外置位置 | PaaS 组件 | 注意 |
|---|
| 会话 | Redis | redis 商店 | 设置合理 TTL;大促前扩容内存 |
| 上传文件 | MinIO | minio | 禁止写容器本地盘 |
| 异步任务 | Kafka / RabbitMQ | kafka / rabbitmq | 消费者多副本 + 幂等 |
| 事务数据 | MySQL | mysql | 单副本商店模板需 HA 改造 |
| 本地缓存 | 尽量避免 | — | 用 Redis 代替 |
行业案例 · 某票务平台:Session 存 Tomcat 内存,滚动发布时用户批量登出,峰值投诉 2000+。改造为 Redis Session + spring-session 后,发布期间 零强制登出。
2.4 有状态组件 HA 现实
| 组件 | 商店默认 | 生产 HA 方向 | RPO 参考 |
|---|
| MySQL | 1 副本 + PVC | 主从 + MHA;或云 RDS Multi-AZ | 主从异步 < 1s~数秒 |
| Redis | 1 副本 | Sentinel 3 节点;或云缓存 | AOF everysec |
| Kafka | 单容器 KRaft | 3 Broker,replication.factor=3 | 取决于 acks |
| Elasticsearch | single-node | 3 数据节点,副本分片=1 | 近实时 |
| MinIO | 单节点 | 分布式 4+ 节点纠删码 | 取决于同步策略 |
PaaS ch15 §15.2.2:商店多数有状态默认单副本。生产 HA 通常选 外置托管 或 自定义多实例 YAML,先在 test-* Namespace 验证。
2.5 容灾拓扑
2.5.1 同城双活(复杂,金融/超大流量)
┌── GSLB / DNS 权重 ──┐
▼ ▼
集群 A(主 60%) 集群 B(主 40%)
│ │
└──── 数据双向/单向复制 ──┘
| 项 | 要求 |
|---|
| 数据 | 库级双向或分片单元化;冲突解决策略预定义 |
| 入口 | GSLB 健康检查 + 流量调度 |
| 演练 | 季度切流;RTO 目标常 < 5min |
2.5.2 异地冷备(中小企业常见)
生产集群 ──定时备份──► MinIO 异地桶 ──► 灾备集群按需恢复
│ │
└── 实时监控 / 告警 ─────┘
| 步骤 | 操作 | RTO 影响 |
|---|
| 1 | Namespace + PVC 快照导出 | — |
| 2 | mysqldump / pg_dump 逻辑备份 | RPO = 备份间隔 |
| 3 | 灾备集群导入 YAML + 还原卷 | 恢复耗时计入 RTO |
| 4 | DNS 切到灾备 Ingress | 传播时间 1~10min |
行业案例 · 某 SaaS 服务商:仅做 PVC 快照未做逻辑备份,Longhorn 元数据损坏后 无法挂载卷,RTO 超预期 6 小时。整改:快照 + 每日 mysqldump + 恢复演练。
2.6 故障域与反亲和