独立站灾难恢复:RTO/RPO定义、恢复流程与年度演练
一、RTO和RPO:先搞清楚你能接受丢多少、停多久
RTO(Recovery Time Objective,恢复时间目标)是站点从出故障到恢复对外服务的最长可接受时间。RPO(Recovery Point Objective,恢复点目标)是恢复后能容忍丢多久之前的数据。这两个数字定下来,你的备份频率和备灾投入就定下来了——它们是成本和可用性的交换。
反直觉的判断:对B2B独立站,追求99.99%可用性是过度投入。B2B站的访客量小,询盘以邮件和表单为主,停4小时和停1小时对业务的实际影响差别不大;但备灾成本差别巨大——要做到RTO 15分钟,需要双活机房、实时数据库同步,每月成本是单机房方案的5到10倍。
| 站点类型 | RTO目标 | RPO目标 | 可用性 | 备灾方案 |
|---|---|---|---|---|
| 核心询盘站 | ≤1小时 | ≤15分钟 | 99.9% | 异地备机+binlog实时同步 |
| 普通B2B站 | ≤4小时 | ≤4小时 | 99.5% | 单机房+每日备份+异地恢复 |
| 博客/内容站 | ≤24小时 | ≤24小时 | 99% | 每周备份+手动恢复 |
| 电商/支付站 | ≤15分钟 | ≤1分钟 | 99.99% | 多活+实时同步(成本极高) |
场景示例:一个工业装备出海站,月询盘量30条左右,客单价50万人民币。停站4小时,按询盘密度算大概少收1到2条询盘,损失有限。这种站配单机房加每日备份,RTO 4小时、RPO 4小时就够,每月备灾成本不到200元。如果硬上双活,每月多花2000元买的可用性,对业务没有可测量的回报。
怎么判断你的站属于哪一类,先看月询盘量和客单价:月询盘超过100条、客单价低于1万的,偏电商属性,RTO要压到1小时;月询盘低于30条、客单价超过10万的,偏项目型,RTO 4小时完全可以接受。
二、恢复流程:四步走,提前写在纸上
灾难恢复预案不能只存在脑子里。事故发生时,当事人可能是凌晨被叫醒、可能在出差、可能根本不是最熟系统的人。预案必须写成文档,步骤具体到命令行级别,谁在什么时间做什么,一目了然。
标准恢复流程四步:第一步切流量,把DNS或CDN切换到备机IP;第二步恢复数据,从异地对象存储拉最近备份,恢复文件和数据库;第三步验证,走一遍首页、产品列表、询盘表单提交、邮件送达;第四步通知相关方,销售、客服、管理层同步站点恢复时间。被黑后的特殊恢复流程见网站被黑之后。
| 步骤 | 动作 | 负责人 | 预计耗时 | 验收标准 |
|---|---|---|---|---|
| 1 故障确认 | 监控告警触发,确认主站不可用 | 值班运维 | 5分钟 | 连续3次探测失败 |
| 2 切流量 | DNS TTL降到60秒,切到备机IP | 运维 | 10分钟 | 全球DNS生效 |
| 3 恢复数据 | 从S3拉备份,恢复文件和数据库 | 运维 | 1至2小时 | 站点可访问 |
| 4 功能验证 | 首页、产品页、询盘表单全走一遍 | 运维+销售 | 30分钟 | 表单提交邮件收到 |
| 5 通知 | 销售客服知道站点已恢复 | 市场负责人 | 10分钟 | 群内通知到位 |
| 6 复盘 | 24小时内写事故报告 | 技术负责人 | 1个工作日 | 根因和改进项 |
场景示例:一个出海站凌晨3点告警,主站502。值班运维按预案走:第一步确认是MySQL崩溃,重启无效;第二步把DNS切到备机,TTL已经提前设成60秒,10分钟全球生效;第三步从S3拉前一天晚上的备份恢复数据库,40分钟搞定;第四步用手机提交一条测试询盘,邮件30秒后收到;第五步群里通知销售,早上8点上班时站点已经正常。整个过程RTO约1小时,RPO约6小时,符合预案目标。
DNS切换和CDN配合的细节,见CDN全球加速里的节点故障切换。换域名和301交接的思路类似,见站点重构与换域名。
三、备机和冷备:不是每次都要双活
备灾方案分三档:冷备、温备、双活。冷备是只有备份文件,出事后临时起一台机器恢复;温备是备机一直开着空跑,数据异步同步;双活是两个机房同时跑流量,实时同步。成本从低到高,RTO从长到短。
多数B2B独立站选冷备加温备混合就够:备机一直开着但不接流量,每天同步一次数据,出事后只需要改DNS切过去,RTO能压到1到2小时。双活对单人或小团队是过度投入,运维复杂度高到你维护不起。
| 方案 | 备机状态 | RTO | 月度成本增量 | 适合场景 |
|---|---|---|---|---|
| 冷备 | 无备机,只有备份 | 4至8小时 | 0元 | 博客、内容站 |
| 温备 | 备机常开,每日同步 | 1至2小时 | 约300至500元 | 主流B2B询盘站 |
| 热备 | 备机常开,实时同步 | 15至30分钟 | 约1500至3000元 | 核心业务站 |
| 双活 | 两地同时服务 | 秒级 | 约5000元以上 | 电商、支付 |
反直觉提醒:DNS切换不是即时的。即使TTL设成60秒,全球DNS生效也要5到15分钟,部分用户的本地DNS缓存会坚持旧地址几个小时。所以切流量前要做好心理预期:切完不是所有人立刻访问备机,要有过渡期。预案里要写清楚”DNS切换后等待15分钟再验证全球访问”。
四、年度演练:把预案跑一遍,发现纸面问题
灾难恢复预案最大的风险是”写了等于做了”。文档里写得天花乱坠,真到出事故时发现备机密码不知道、备份文件拉不下来、SMTP配置写死在旧服务器上。这些问题只有实际演练一次才能暴露。
年度演练安排在业务低峰的周日凌晨,全程计时。演练不是真把主站切走——而是在测试环境里完整走一遍恢复流程,从拉备份到验证表单,记录每一步实际耗时。把实际RTO和预案目标对比,超过目标就升级方案。演练结束写一份复盘,更新预案。
| 演练项 | 检查内容 | 常见问题 | 改进方向 |
|---|---|---|---|
| 备份可用性 | 从S3拉最近备份能否解压 | gzip损坏、密钥过期 | 加备份完整性校验 |
| 备机启动 | 备机能否5分钟内起来 | 备机长期没开机,软件过期 | 每月启动一次备机 |
| DNS切换 | TTL是否真的60秒 | 忘了提前降TTL | TTL固定设60秒 |
| 数据库恢复 | 导入后中文是否正常 | 字符集错误,乱码 | 恢复脚本固定字符集 |
| 表单邮件 | 提交测试询盘能否收到 | SMTP密码写死在旧配置 | SMTP用环境变量 |
| 人员就绪 | 值班人是否联系得上 | 离职交接没做 | 联系人每季度更新 |
场景示例:一个团队第一次做年度演练,按预案拉备份、恢复数据库、访问站点,前40分钟很顺利。到了验证询盘表单这一步,提交后半天没收到邮件——原来SMTP密码写在wp-config.php里,旧服务器的邮件服务早就停了。这个问题如果真在事故中发现,又要多花1小时排查。演练的价值就是提前发现这种纸面问题。
备份策略的详细配置见网站备份与恢复演练,监控告警阈值见站点监控与告警,日常维护清单见官网维护期每月六件事。
FAQ 常见问题
RTO和RPO到底是什么,怎么定?
B2B独立站要不要做双活?
灾难恢复预案怎么写,要多细?
年度演练怎么做,要不要停站?
DNS切换要多久,为什么切了用户还在访问旧站?
被黑和硬件故障的恢复流程一样吗?
写在最后
灾难恢复这件事,最危险的心态是”我们有备份就够了”。备份解决的是数据不丢,灾难恢复解决的是出事后多快能恢复服务、谁来做、怎么做。这两件事差着一整套预案和演练。没有预案的备份,出事时照样手忙脚乱;没有演练的预案,真用的时候照样卡住。
落地三步:第一,按月询盘量和客单价定RTO/RPO,多数B2B站4小时就够,不要盲目追高;第二,写一份命令行级别的恢复预案,存在密码管理器和云盘两处;第三,每年在测试环境完整演练一次,记录实际RTO/RPO,超过目标就升级方案。这三步做完,你才知道自己的站出事后到底多久能回来。
一句可以记住的话:RTO不是越高越好,4小时和15分钟的备灾成本差10倍——先算清楚停站4小时到底损失多少,再决定你要备灾到什么程度。
