36.3 冷备 / 温备 / 热备
一句话
冷、温、热的区别不在“数据同步得多快”,而在恢复时还有多少活要人干:冷备要人找机器、装环境、导数据,温备环境和数据都就位只等启动,热备连启动都不用、自动切;RTO 的杠杆是预置与自动化,不是更快的硬盘。
三种形态:差在“人”和“自动化”
| 形态 | 数据是否就位 | 环境是否就位 | 切换谁来做 | 典型 RTO | 典型 RPO |
|---|---|---|---|---|---|
| 冷备 | 有备份,可能需要先买/借机器 | 没有,需现装 | 人工 | 小时级 | 上次备份(小时~天) |
| 温备 | 定期同步(日志/快照/复制) | 已预装、可随时启动 | 人工或半自动 | 分钟~1 小时 | 分钟~小时 |
| 热备 | 实时同步 | 常驻运行 | 自动检测 + 自动切流 | 秒级 | 秒级或 0 |
🔑 记忆锚点:冷备是“东西在仓库”,温备是“东西在车上、人待命”,热备是“两套都在跑”。三者的成本差是数量级的,但 RTO 的差不是靠“买更快的设备”缩小的。
把 RTO 拆开看:数据只占一小部分
一次真实恢复要经过五步,任何一步都能把 RTO 拖长:
发现故障 → 决策/拉人 → 准备环境 → 恢复数据 → 校验/切流
| 形态 | 发现 | 决策 | 准备环境 | 恢复数据 | 校验 | RTO 合计 |
|---|---|---|---|---|---|---|
| 冷备 | 0.25h | 0.50h | 6.00h | 1.46h | 0.50h | 8.71h |
| 温备 | 0.25h | 0.25h | 0.50h | 0.15h | 0.25h | 1.40h |
| 热备 | 0.02h | 0 | 0.02h | 0.01h | 0.05h | 0.10h |
同样的数据(1 TiB),冷备 8.71 小时里真正搬数据只有 1.46 小时(17%),剩下 7.25 小时是“找机器、装系统、装依赖、配网络、等人拍板”。所以:
- 把存储换快 1 倍,冷备 RTO 只从 8.71h 降到 8.0h(省 8%);
- 预置一套环境(把“准备”从 6h 压到 0.5h),RTO 直接掉到 2.2h;
- 再把“决策”变成值班表 + 预案(0.5h → 0.25h),才进入温备区间。
⚠️ RTO 不是技术指标,是组织指标。没有值班表、没有恢复手册、没有演练的团队,无论买多贵的存储,RTO 都按“第二天上班再处理”算。
一年停多久:把 RTO 换算成可用性
按每年 4 次故障估算(不含计划内维护):
| 形态 | RTO | 年停机 | 年可用性 | 相对成本 |
|---|---|---|---|---|
| 冷备 | 8.71h | 34.8h | 99.60% | 1.0× |
| 温备 | 1.40h | 5.6h | 99.94% | 1.4× |
| 热备 | 0.10h | 0.4h | 99.995% | 2.2× |
读法:冷备到温备,多花 40% 成本,年停机从 34.8h 降到 5.6h(6 倍);温备到热备,再多花 57% 成本,年停机从 5.6h 降到 0.4h(14 倍)。
这就是“9 的边际成本”:99.6% → 99.94% → 99.995%,每一段都要多买一套东西,而且越往后越依赖自动化而不是硬件——热备的 0.1h 里,人不参与决策,全靠健康检查与自动切流(见 35.4 故障检测)。
热备的三个前提,缺一个就退化成温备
买了一主一备、数据实时同步,不等于热备:
| 前提 | 缺了会怎样 | 实际 RTO |
|---|---|---|
| 自动检测 | 靠人发现“服务挂了” | +15~30 分钟 |
| 自动决策 + 切流 | 检测到但不敢自动切,等人确认 | +10~30 分钟 |
| 备端容量足够 | 切过去直接被打挂,再切回来 | 故障放大 |
| 数据同步可验证 | 切过去发现落后 2 小时 / 数据损坏 | 不可用 |
| 回切方案 | 主机恢复后两边都写,脑裂 | 数据不一致 |
🔑 热备的本质是“自动切换的合法性”,不是“多一台机器”。合法性来自三样东西:租约/仲裁(防脑裂)、fencing(防旧主继续写)、可验证的同步延迟。这些比机器贵得多,也难得多。
成本结构:钱花在哪
| 项 | 冷备 | 温备 | 热备 |
|---|---|---|---|
| 计算资源 | 0(故障时才开) | 小规格常驻(能跑起来) | 与生产同规格常驻 |
| 存储 | 备份存储(可归档层) | 备份 + 同步副本 | 双份在线存储 |
| 网络 | 备份传输 | 持续复制(跨区流量) | 同步复制(低延迟专线) |
| 人 | 故障时临时拉人 | 值班 + 预案 | 7×24 值班 + 自动化平台 |
| 演练 | 半年一次 | 每季度 | 每月/混沌工程 |
| 相对成本 | 1.0× | 1.4× | 2.2× |
一个常被忽略的数字:每季度演练一次、每次 4 人 × 4 小时,一年 64 人时,只占 4 人团队 0.8% 的工时。这点投入换来的是“RTO 从纸面数字变成可复现数字”。不做演练的冷备,真实 RTO 通常是估算值的 2–3 倍(经验值,取决于团队熟悉度)。
可运行的 RTO 账本
package main
import "fmt"
// 一次故障恢复要经过的步骤(单位:小时)。数字是「未预先演练过的团队」的典型值。
type tier struct {
name string
detect float64 // 发现故障
decide float64 // 决策/拉人
prep float64 // 找机器、装环境、开机
restor float64 // 恢复数据
verify float64 // 校验与切流
rpo float64 // 小时
cost float64 // 相对成本(以冷备为 1)
}
func main() {
const incidentsPerYear = 4.0
hoursPerYear := 365 * 24.0
tiers := []tier{
{"冷备", 0.25, 0.50, 6.00, 1.46, 0.50, 24, 1.0},
{"温备", 0.25, 0.25, 0.50, 0.15, 0.25, 0.25, 1.4},
{"热备", 0.02, 0.00, 0.02, 0.01, 0.05, 0.001, 2.2},
}
fmt.Printf("%-6s %8s %8s %8s %8s %8s %8s %8s %8s %7s\n",
"形态", "发现h", "决策h", "准备h", "恢复h", "校验h", "RTO", "年停机", "可用性", "成本")
for _, t := range tiers {
rto := t.detect + t.decide + t.prep + t.restor + t.verify
down := rto * incidentsPerYear
avail := 1 - down/hoursPerYear
fmt.Printf("%-6s %8.2f %8.2f %8.2f %8.2f %8.2f %7.2fh %7.1fh %8.4f%% %6.1fx\n",
t.name, t.detect, t.decide, t.prep, t.restor, t.verify, rto, down, avail*100, t.cost)
}
// 关键:把「准备」压掉,冷备就变成温备;把「决策」压掉,温备就接近热备
cold := tiers[0]
rto := cold.detect + cold.decide + cold.prep + cold.restor + cold.verify
fmt.Printf("\n冷备的 %.2fh 里,真正搬数据只有 %.2fh(%.0f%%),其余 %.2fh 是找机器/装环境/等人\n",
rto, cold.restor, cold.restor/rto*100, rto-cold.restor)
fmt.Printf("RTO 从 %.2fh 压到 1h 的杠杆:预置环境(省 %.1fh)+ 值班表(省 %.1fh),不是换更快的存储\n",
rto, cold.prep, cold.decide)
// 演练成本:每季度一次,每次 4 人 × 4h
drillHours, drillPeople := 4.0, 4.0
fmt.Printf("每季度演练一次:每年 %.0f 人时,只占 4 人团队的 %.1f%% 工时\n",
drillHours*drillPeople*4, drillHours*drillPeople*4/(4*2000)*100)
}
输出:
形态 发现h 决策h 准备h 恢复h 校验h RTO 年停机 可用性 成本
冷备 0.25 0.50 6.00 1.46 0.50 8.71h 34.8h 99.6023% 1.0x
温备 0.25 0.25 0.50 0.15 0.25 1.40h 5.6h 99.9361% 1.4x
热备 0.02 0.00 0.02 0.01 0.05 0.10h 0.4h 99.9954% 2.2x
冷备的 8.71h 里,真正搬数据只有 1.46h(17%),其余 7.25h 是找机器/装环境/等人
RTO 从 8.71h 压到 1h 的杠杆:预置环境(省 6.0h)+ 值班表(省 0.5h),不是换更快的存储
每季度演练一次:每年 64 人时,只占 4 人团队的 0.8% 工时
选型:先看 RTO/RPO,再看钱
| 业务 | 可接受停机 | 选 | 理由 |
|---|---|---|---|
| 内部报表、离线任务 | 1 天 | 冷备 | 重跑即可,人工成本低于常驻资源 |
| 一般业务系统 | 1–4 小时 | 温备 | 环境预置,值班表覆盖 |
| 交易、支付、登录 | < 5 分钟 | 热备 | 自动切换 + 容量冗余 |
| 只读 CDN / 静态站 | 秒级 | 多活/边缘 | 无状态,切流即可 |
| 合规留存数据 | 不要求在线 | 冷备 + 归档 | 见 39.3 存储分级 |
反模式
| 反模式 | 后果 |
|---|---|
| 只买冷备,却承诺 99.99% | 承诺无法兑现,故障时按天算停机 |
| 有热备但没有自动切流 | 实际 RTO = 人工响应时间,钱白花 |
| 热备切过去容量不够 | 备端被打挂,故障从单点变成双点 |
| 从不演练 | 真实 RTO 是估算值的 2–3 倍,恢复手册过期 |
| 备份与灾备混为一谈 | 数据能恢复,但服务几小时起不来 |
| 只做数据同步,不做回切方案 | 主机恢复后双写,脑裂 |
| 冷备机器“随时能买” | 云上配额不足/库存紧张时买不到 |
| 演练只演“切过去”,不演“切回来” | 回切才是最容易出事的一步 |
自检
Q1 冷备 RTO 8.71 小时,其中搬数据只占 1.46 小时。如果把存储吞吐提高一倍,RTO 能降到多少?真正该做什么?
▸ 答案:只能省 0.73 小时(1.46 → 0.73),RTO 约 7.98 小时,降幅 8%。因为瓶颈在“准备环境 6 小时”——找机器、装系统、装依赖、配网络、等审批。正确动作是预置:备一套已装好的环境(哪怕关机),把 6 小时压到 0.5 小时,RTO 立刻到 2.2 小时;再配值班表和恢复脚本,进入 1 小时以内。存储吞吐只在数据量极大(几十 TB)时才成为瓶颈。
Q2 你们买了一主一备、数据实时同步,对外宣称 RTO < 1 分钟。真故障时用了 40 分钟才恢复。最可能缺什么?
▸ 答案:缺自动检测与自动切流(以及切流后的容量验证)。数据同步只保证“数据在”,不保证“服务能接管”:没有健康检查 → 靠人发现;没有自动决策 → 等人确认;没有 DNS/网关切换 → 手工改配置;备端容量不足 → 切过去被打挂。40 分钟 ≈ 发现 15 分钟 + 确认 10 分钟 + 手工切流 15 分钟,正好是“有热备数据、没有热备自动化”的典型值。
Q3 RPO = 0 一定比 RPO = 5 分钟贵很多吗?什么情况下两者成本接近?
▸ 答案:不一定。RPO=0 靠同步复制实现,成本主要是“多一份在线副本 + 写延迟”,在同城双活(RTT 1–2ms)里代价很小;只有跨地域同步才会把写延迟推到几十毫秒并需要专线。若业务本来就有同城双活(为了单机房故障),把复制改成同步只增加很小的成本,RPO 就从分钟级变成 0。反过来,如果只有单机房 + 异地异步,为了 RPO=0 上跨地域同步,才是昂贵的那一步(见 36.4 两地三中心与多活)。
Q4 备份和灾备各解决什么问题?只做备份、不做灾备,能不能达到 99.99%?
▸ 答案:备份解决数据不丢(RPO),灾备解决服务不停(RTO)。只做备份,数据能恢复但恢复要几小时(冷备 8.71h),一年 4 次故障就是 34.8h 停机,可用性 99.60%——离 99.99%(年停机 52.6 分钟)差两个数量级。99.99% 需要“分钟级接管”,也就是温备起步、热备达标,并且要靠自动化切流而不是人工。
Q5 为什么“每季度演练一次”这种看起来很低频的动作,反而比升级硬件更能降低真实 RTO?
▸ 答案:因为真实 RTO 的瓶颈是人:不演练的团队不知道备份放在哪、恢复脚本怎么跑、依赖哪些密钥、切换后要改哪些 DNS;这些知识在故障当天现学,时间会翻 2–3 倍。演练把“隐性步骤”变成“清单”,把“等人”变成“值班表”,把 6 小时的准备压到 1 小时以内。硬件只能优化那 17% 的数据搬运时间,演练优化的是剩下的 83%。
跨篇相关:RTO/RPO 的定义与 9 的换算见 36.1 RTO / RPO;备份本身怎么选策略见 36.2 备份策略;跨机房的热备属于多活拓扑,见 36.4 两地三中心与多活;自动切换的检测依据见 35.4 故障检测。