简介:这份文档面向企业网络管理员、IT运维与信息安全相关从业者,系统讲解企业业务网络数据备份与灾难恢复的整体设计思路,适合需要规划应急方案、评估容错技术选型的中级技术人员参考。内容围绕网络备份的含义、双机容错系统、数据库备份、网络故障与灾难恢复、备份任务管理、服务器备份分类等模块展开,并结合桂林怡海实业的企业网络场景,介绍Novell与Windows NT平台下的容错解决方案,如Standby Server for NetWare、LifeKeeper for NT、NTCluster、Octopus等产品的实现机制与适用条件。压缩包内共1个doc文档,约240KB,便于直接查阅与打印成册。已有312人学习下载,可作为编写企业备份方案、梳理容错架构与制定恢复流程时的参考资料,帮助读者理解动态实时备份与静态后备备份如何配合形成完整保护体系。
1. 一份企业数据备份方案文档,真正值钱的是「恢复那一段」
某公司机房交接那次,前任网管留下的移动硬盘里躺着三个 T 的业务数据,主服务器宕机当天,从里面翻出来的最新一份拷贝是四个月前的,目录服务、权限项、注册配置一概没有,只有一堆散装文件。那时候才明白,一份企业数据备份方案文档里最不该被跳过的不是「备份什么」,而是「怎么恢复、多久恢复、谁去按那个键」。这份资料是一套完整的业务网络数据备份方案,分成双机容错、数据库抽取式备份、备份任务编排、灾难恢复计划四块,还带了备份软件选型与备份介质选型的判断依据。它适合三类人:中小规模机房的自建运维、系统集成商的方案岗、以及要接手历史遗留环境、必须先摸清家底再动手的人。
2. 拆解方案骨架:三层容错与两类备份的边界
方案文档的价值不在篇幅,在于它把「哪些故障归哪一层管」划清楚了。很多机房出事,不是因为没买设备,而是把硬件容错当成了数据备份,把数据备份当成了灾难恢复,三层各干各的活,混着用就一定会翻车。
2.1 硬件级物理容错与软件级备份,是两条命不是一条
方案里把网络备份定义成「硬件级物理容错 + 软件级数据备份」,这个拆法很关键。硬件级容错解决的是「机器坏了业务不停」,靠的是双机热备、共享存储、冗余电源风扇这类手段,它的目标函数是可用性,不是数据完整性。软件级备份解决的是「数据被删了、被改错了、被加密了还能退回去」,靠的是归档、保留周期、历史版本,目标函数是可回滚性。
这两条命互相顶替不了。双机热备最典型的盲区是逻辑损坏:主库上一条误删语句执行下去,镜像端在毫秒级同步了同样的删除,两台机器数据一起没,容错做得再漂亮也救不回来。反过来,备份也顶不了容错:从磁带恢复一个 500G 的库,即便一切顺利也要几小时,这期间业务是停的,而双机切换的停机窗口通常按秒算。
所以合格的方案一定是先算清楚:哪些系统属于「停一分钟就掉钱」,上双机;哪些数据属于「丢了就再也造不出来」,上备份;两者重叠的核心系统,两条都要。方案文档里那句「最关键的设备是文件服务器,必须采用双机热备份容错技术」,说的就是前者;而「各类数据库的备份不能靠拷文件」,说的是后者。
我一般会建议客户先画一张故障影响表,横轴是故障类型(硬盘坏、主机宕、误删除、病毒加密、机房断电、站点级灾难),纵轴是核心系统,每一格填「靠什么手段恢复、预计多久」。填不满的格子,就是这套方案要补的地方。这张表比任何产品选型清单都先做。
2.2 在线容错与后备备份:数据分档,别一锅端
方案把服务器备份分成在线容错式(实时动态)和后备式(静态)两类,并且明确两者要「紧密配合」。落到实操上,这是数据分档的问题,不是产品二选一的问题。
第一档是运行态数据,包括数据库的数据文件、日志文件、目录服务库。这类数据的特点是持续变化且互相有依赖,只能靠容错和在线镜像保证连续,拷贝式备份对它基本无效——你复制过去的数据文件很可能是「半写」状态,恢复起来直接起不来。
第二档是配置与身份数据,包括权限设置、存储分配、网络地址、系统配置参数、用户属性、登录脚本、应用软件的可执行文件和配置文件。这类数据平时几乎不变,一变就是大事,最适合做「变更即备份 + 定期全量」,并且要保留多个历史版本,因为你需要的是「回到改坏之前那一版」,不是「最新那一版」。
第三档是业务归档数据,历史工单、财务凭证、合同附件。这类数据体量大、访问频率低,适合走磁带或低成本大容量介质,保留周期按合规要求定,通常比运行态数据长得多。
分档之后再看方案里那句「备份用机并不要求与主服务器一致,可选用原有旧设备」就有意义了:容错节点的性能只要能扛住切换后的业务峰值就行,不需要和主库同配置;而备份存储要的是容量和顺序写性能,旧服务器挂个磁带机或大容量盘柜完全够用。这也是这套方案对预算有限的机房最实用的一个判断——钱花在容错链路的可靠性上,备份侧可以省。
2.3 先把资产盘清楚:四张表决定后面所有参数
方案文档给的是框架,落到自己机房必须补一层盘点。我习惯让团队填四张表,填完之前不谈产品型号。
第一张是系统清单:主机名、角色(数据库/文件/目录/应用)、操作系统大类、承载业务、责任人。角色决定它进不进容错域,责任人决定故障时找谁确认。
第二张是数据清单:路径或库名、日均增量、全量大小、变更规律(全天均匀 / 集中在月末)、可容忍丢失时长、可容忍停机时长。后两个数字直接对应 RPO 和 RTO,是后面所有参数的源头。
第三张是依赖清单:应用依赖哪个数据库实例、哪个共享目录、哪个域名解析、哪个证书。恢复顺序错了,系统起来了也用不了,这是恢复演练最常见的翻车点。
第四张是介质与链路清单:现有磁带机型号与代次、盘柜剩余容量、备份网络是独立网段还是和业务混跑、异地存放点有没有。方案里提到磁带机因为纠错能力和写后即读通道技术,在容量与单位成本上更适合企业单位,这个结论放在今天依然成立,但前提是你的备份网络别和业务抢带宽,否则备份窗口一定失控。
四张表填完,你会发现原方案里那些看起来抽象的要求——跨平台实时在线备份、自动恢复机制、定时与实时自动备份、故障提示——每一条都能对到具体主机和具体路径上。这也是判断一份方案能不能落地的唯一标准:它能不能被翻译成一张带主机名的任务表。
3. 双机热备的落地参数:切换时间、镜像方式与脑裂
双机热备是这套方案里最容易被讲成玄学的部分。厂商演示时都是「拔网线,业务无感」,真到自己机房,切换慢、切不过去、切过去又切回来,全是参数和链路的问题。
3.1 主备镜像的三条链路:共享阵列、纯软件镜像、混合
方案里提到容错产品既能支持共享磁盘阵列柜方式,也能支持纯软件容错的扩展方式。这两条路的差别,决定了你后面所有的运维动作。
共享阵列方式:两台服务器都接到同一个盘柜,同一时刻只有主节点挂载并读写,备节点通过心跳和预留锁判断状态,主节点故障后备节点抢占卷。优点是数据只有一份,不存在同步延迟;缺点是盘柜本身成了单点,方案里强调的「硬件级物理容错」在盘柜这一层是打折扣的,所以盘柜要配双控制器、双电源、双链路。
纯软件镜像方式:两台服务器各自有本地磁盘,通过专用链路做块级镜像,主节点写成功后才返回,备节点落盘确认。优点是省掉了盘柜这个单点和大笔预算,方案里「可利用原有设备、节省投资」说的就是这条路;缺点是镜像链路的带宽和时延直接决定写性能,链路一断,镜像就退化成单机。
混合方式:关键库走共享阵列,次要系统走软件镜像。这是我在中小机房最常见的落地形态,因为预算通常只够给一两个核心系统配盘柜。
选型的判断点其实很简单:问业务方「写性能下降 20% 能不能接受」。能接受,软件镜像够用;不能接受,就得上阵列。另外要确认镜像链路是独立物理网卡直连,别走业务交换机,更别走跨机房链路——跨机房镜像的时延抖动会让上层应用莫名超时,这类问题查起来极其费劲。
3.2 心跳、切换阈值、回切延迟:三个参数怎么定
双机热备的参数不多,但每一个都直接影响「会不会误切」。
心跳间隔决定多快能发现对方没了。设太短,一次网络抖动就触发切换;设太长,真宕机了要等很久。常见做法是 1 秒一次心跳,连续丢 3 次判定异常,也就是 3 秒左右发现。这个值要大于你网络里 P99 的抖动时延,不然就是给自己埋雷。
切换阈值决定「发现异常之后还要观察多久才动手」。我给的建议是 15 到 30 秒,核心库可以取上限。这几十秒是留给「假故障」的:交换机重启、网卡协商、上层临时拥塞,都会造成秒级不可达,熬过去就没事,熬不过去再切。
回切延迟是最容易被忽略的一个。主节点恢复后如果立刻抢回虚拟地址,业务会在短时间内抖两次,数据库连接池全部重建。我的习惯是回切一律手动,或者至少设 5 分钟以上的延迟窗口,并且要求值班人确认主节点数据追平之后再切。
| 参数 | 建议取值 | 设定依据 | 设错的后果 |
|---|---|---|---|
| 心跳间隔 | 1s | 大于网络 P99 抖动时延 | 过短:频繁误判;过长:故障发现慢 |
| 丢失判定次数 | 3 次 | 覆盖交换机重启等瞬断 | 过少:抖动即切换 |
| 切换阈值 | 15~30s | 留给假故障的观察窗 | 过短:业务抖两次 |
| 回切延迟 | ≥5min 或手动 | 等主节点数据追平 | 过短:连接池反复重建 |
| 心跳链路 | 独立物理口直连 | 与业务流量隔离 | 混跑:业务高峰误切 |
3.3 切换前的健康检查脚本
自动化切换最大的风险不是「切不过去」,是「不该切的时候切了」。所以我习惯在切换动作前面插一道健康检查,把「主库真的死了吗」这件事用多个维度确认一遍。
#!/usr/bin/env bash # pre_failover_check.sh —— 切换前健康检查,任一检查不通过即中止切换 set -uo pipefail PRIMARY_IP="${PRIMARY_IP:-10.0.0.11}" # 主节点业务地址 VIP="${VIP:-10.0.0.10}" # 对外提供服务的虚拟地址 DB_PORT="${DB_PORT:-1521}" # 数据库监听端口 PING_COUNT="${PING_COUNT:-3}" DB_TIMEOUT="${DB_TIMEOUT:-5}" LOG_DIR="${LOG_DIR:-/var/log/ha}" mkdir -p "$LOG_DIR" LOG="${LOG_DIR}/precheck_$(date +%Y%m%d_%H%M%S).log" fail=0 log() { echo "[$(date '+%F %T')] $*" | tee -a "$LOG"; } # 1) 主节点网络可达性:还能 ping 通说明大概率是网络抖动,不是宕机 if ping -c "$PING_COUNT" -W 2 "$PRIMARY_IP" >/dev/null 2>&1; then log "PRIMARY_ALIVE 主节点仍有响应,疑似抖动,终止切换" fail=1 else log "PRIMARY_DOWN 主节点无响应" fi # 2) 数据库端口探测:主机活着但实例已死的情况必须单独识别 if timeout "$DB_TIMEOUT" bash -c "</dev/tcp/${PRIMARY_IP}/${DB_PORT}" 2>/dev/null; then log "DB_PORT_OPEN 数据库端口仍可连,需人工确认后再切" fail=1 else log "DB_PORT_CLOSED 数据库端口不可连" fi # 3) VIP 冲突检查:地址还被占着就漂移,会造成双主对外服务 if ping -c 1 -W 1 "$VIP" >/dev/null 2>&1; then log "VIP_IN_USE 虚拟地址仍被占用,禁止漂移" fail=1 fi # 4) 备节点磁盘余量:接管后写不进去等于白切 usage=$(df -P / | awk 'NR==2 {gsub("%","",$5); print $5}') if [ "$usage" -ge 85 ]; then log "STANDBY_DISK_LOW 备节点根分区已用 ${usage}%,拒绝接管" fail=1 fi if [ "$fail" -ne 0 ]; then log "RESULT=ABORT 详见 $LOG" exit 1 fi log "RESULT=PROCEED 允许执行切换" exit 0这段脚本的逻辑是「宁可漏切,不可误切」,跟很多默认配置的思路相反,但实测下来更稳。四项检查里,第一项和第二项是互补的:主节点完全失联走正常切换流程;主节点网络还在但数据库实例挂了,属于需要人工介入的灰区,脚本直接拦下来。第三项防的是最凶的一种情况——心跳误判导致备节点接管,但主节点还活着,两个节点同时持有对外地址,客户端连到哪台全看运气,数据立刻分叉。第四项是收尾检查,备节点磁盘满了接管过来,业务照样起不来。
参数上,PING_COUNT和DB_TIMEOUT要根据你的网络质量调,跨机房链路建议把超时放宽到 10 秒,否则正常的链路切换也会被判定成故障。VIP一定要填对外地址而不是节点地址,这两个填混了,第三项检查等于失效。
3.4 主备同时倒下:灾难恢复盘是最后的后悔药
方案里把「主从服务器皆瘫痪」单独拎出来讲,这是有经验的写法。双机热备能扛单点硬件故障,扛不了机房进水、勒索加密、以及最常见的一种——运维在备节点上也执行了一遍同样的错误命令。
这时候唯一的出路是离线备份加灾难恢复盘。方案描述的流程是:先恢复硬件,连好磁带库,找出最近一次完全备份的磁带,用灾难恢复盘启动,然后按提示重建磁盘、恢复系统设定信息,再自动挂载完全备份恢复系统文件与数据库文件。整个流程的关键在于「灾难恢复盘」这一个物件,它必须包含引导环境、存储控制器驱动、网络驱动,以及指向备份服务器的配置。
我见过最典型的翻车是恢复盘做出来半年没用,真要用的时候发现主板换了、阵列卡型号变了,驱动对不上,盘起不来。所以恢复介质必须跟着硬件变更走,硬件一动就重制一次,并且在盘上标注制作日期和对应的硬件配置。这件事没有捷径,只能靠制度。
4. 备份策略与任务编排:完全、增量、差异怎么排
方案给了三种备份方式的定义,但没给组合方式。而实际运维里,决定你恢复要花多久的,恰恰是这三者的排列顺序。
4.1 完全、增量、差异:组合方式决定恢复链长度
完全备份把系统文件和数据库整份归档,包括系统设定、目录服务信息和注册数据。它的价值是「恢复起点唯一」,拿到一盘带就能开始;代价是每次都要写满整个数据量,备份窗口和介质消耗都按全量算。
增量备份只备「上一次备份之后新增」的数据。注意这里的「上一次」是任意一次,可能是昨天的增量,也可能是上周的全备。它的优点是每次跑得极快、占空间极小;缺点是恢复链条长——要恢复周五的状态,得拿周日的全备加周一到周五的五盘增量,按顺序叠上去,中间任何一盘损坏或者顺序错乱,整条链就断了。
差异备份备的是「上一次完全备份之后修改」的数据。它每天的量会越来越大,但恢复只需要两盘:最近一次全备加最近一次差异。
| 方式 | 单次数据量 | 恢复所需盘数 | 适合的数据 | 主要风险 |
|---|---|---|---|---|
| 完全备份 | 全量 | 1 | 系统数据、库文件、配置 | 窗口长、介质贵 |
| 增量备份 | 最小 | 1 + N | 变化频繁的业务流水 | 链条长,一盘坏全断 |
| 差异备份 | 逐日增长 | 2 | 变化有规律的业务数据 | 后期接近全量 |
落到实际编排,我一般这么排:每周一次完全备份放在业务最低谷的窗口,每天一次差异备份覆盖工作日,对变化特别频繁的流水类数据再加一次增量。这样恢复任意一天,最多只需要两盘带,链条长度可控;同时每天的实际写入量又远小于全量。
有一类数据要单独说:数据库。方案里那句「能否将所需要的数据从庞大的数据库文件中抽取出来进行备份,是网络备份的重要一环」,说的就是别直接拷数据文件。数据库必须走逻辑导出或者备份接口,导出的是一致性快照,恢复时能直接灌回去。直接拷贝数据文件的做法,在数据库运行期间拿到的多半是半写状态,恢复时轻则报错,重则静默损坏,这种损坏你可能要几个月后才发现。
4.2 备份窗口、保留周期与容量估算
备份窗口是很多人拍脑袋定的,最后表现为「备份任务天天跑超时」。算法其实不复杂:窗口时长 = 数据量 ÷ 实际写入吞吐,实际吞吐要按介质真实速率的三分之一到一半估,别按标称值。
举个具体例子。某机房全量数据 800G,磁带机标称持续写 120MB/s,按一半算 60MB/s,全备理论耗时约 3.8 小时;加上数据库导出和校验回读,实际按 5 小时排。日增量 12G、日差异在月中约 60G,增量加差异的日常任务不到 1 小时。这样周全备放在周六凌晨,日常任务放在凌晨 2 点,窗口都不会挤到业务时间。
保留周期要按「最坏情况回溯多久」来定,不是按「介质能装多少」来定。一起数据被篡改的事故,往往要一两周后才被发现,所以完全备份至少保留 4 周。有合规要求的行业按监管年限走,通常按月备、年备单独归档并异地存放。
容量估算的公式:所需容量 = 全备大小 × 保留份数 + 日增量 × 保留天数 × 1.3(含索引与校验开销)。按上面例子,4 周全备 3.2T,日增量 30 天约 360G,乘 1.3 系数后约 4.6T,配一个 6T 的磁带库或者盘柜留出 30% 余量是合理的。
提示:估算时把「恢复演练占用的介质」也算进去。演练用的磁带不能和在线保留的混在一起,否则一次演练就把生产保留周期打断了。
4.3 一份可抄的备份任务脚本
方案要求「自动定时和实时自动备份,出现差错时提示机房人员」,落到实现上,任务是靠调度器拉起的,脚本要自己负责「跑对、跑完、跑坏要能看出来」。
#!/usr/bin/env bash # backup_job.sh —— 完全/差异/增量三档任务统一入口 set -euo pipefail BACKUP_ROOT="${BACKUP_ROOT:-/backup}" DATA_DIRS="${DATA_DIRS:-/srv/app /etc/opt/app}" # 需要归档的目录,空格分隔 DB_DUMP_CMD="${DB_DUMP_CMD:-}" # 留空表示本次不导出数据库 LEVEL="${1:-diff}" # full | diff | incr STAMP="$(date +%Y%m%d_%H%M%S)" WORK="${BACKUP_ROOT}/stage/${LEVEL}_${STAMP}" LOG="${BACKUP_ROOT}/logs/${LEVEL}_${STAMP}.log" mkdir -p "$WORK" "$(dirname "$LOG")" "${BACKUP_ROOT}/snapshot" "${BACKUP_ROOT}/pool/${LEVEL}" exec >>"$LOG" 2>&1 echo "[$(date '+%F %T')] START level=${LEVEL}" # 1) 数据库:先做一致性导出,再归档,避免拷到半写页 if [ -n "$DB_DUMP_CMD" ]; then $DB_DUMP_CMD > "${WORK}/db_${STAMP}.dmp" gzip -9 "${WORK}/db_${STAMP}.dmp" fi # 2) 文件层:按档位选择基准快照文件,决定「和谁比」 case "$LEVEL" in full) TAR_MODE="-g ${BACKUP_ROOT}/snapshot/full.snar" ;; incr) TAR_MODE="-g ${BACKUP_ROOT}/snapshot/incr.snar" ;; diff) rm -f "${BACKUP_ROOT}/snapshot/diff.snar" # 每次重建基准=相对上次全备 TAR_MODE="-g ${BACKUP_ROOT}/snapshot/diff.snar" ;; esac # 3) 归档并做完整性校验,归档损坏比没有备份更危险 tar -czf "${WORK}/files_${STAMP}.tar.gz" $TAR_MODE $DATA_DIRS gzip -t "${WORK}/files_${STAMP}.tar.gz" # 4) 生成清单,恢复时靠它决定取哪一盘 ( cd "$WORK" && find . -type f -printf '%p %s\n' ) > "${WORK}/MANIFEST.txt" # 5) 落到二级介质并刷盘 cp -a "$WORK"/. "${BACKUP_ROOT}/pool/${LEVEL}/" sync echo "[$(date '+%F %T')] DONE size=$(du -sh "$WORK" | cut -f1)"脚本的核心在第二步。-g指定的快照文件记录的是「上次归档时各文件的状态」,tar 据此判断哪些文件变过。完全备份和增量备份各用一个独立快照文件,保证增量始终相对上一次任意档位;差异备份每次执行前删掉自己的快照文件,这样它永远相对最近一次全备,恢复时只需要两盘。这三行是最容易写错的地方,一旦共用同一个快照文件,差异备份就会退化成增量,恢复链瞬间变长。
第三步的gzip -t是必做项。磁带和盘柜的写入错误往往不报错,等到恢复时才发现归档尾部缺失,那时候没有后悔药。校验失败就让脚本以非零码退出,让调度器的告警抓到。
参数上,DB_DUMP_CMD留空是有意的:不同数据库的导出命令差异很大,把命令作为环境变量传入,脚本本身不绑定具体数据库,换库只改配置不改逻辑。DATA_DIRS里要显式列出配置文件目录,方案里强调的系统配置参数、可执行文件、启动脚本都在这一类目录里,漏了就只备了业务数据没备运行环境,恢复时还得重装一遍。
调度侧建议直接用系统计划任务,把三档分开:
# 每周日 01:00 完全备份,工作日 02:00 差异备份,每小时增量备份业务流水目录 0 1 * * 0 /opt/backup/backup_job.sh full 0 2 * * 1-6 /opt/backup/backup_job.sh diff 0 * * * * DATA_DIRS=/srv/app/flow /opt/backup/backup_job.sh incr4.4 恢复演练:不演练的备份等于没有备份
方案里写「定期测试备份的有效性」这句话,很多方案文档都有,真正做到的不多。演练不是把备份文件解压看一眼就完事,得有明确的验收动作。
我的做法是每季度抽一次,随机挑一个日期,按真实流程走一遍:找到那天的全备带,按恢复链顺序叠上差异或增量,恢复到一台隔离的机器,然后跑三类检查。第一类是文件级检查,比对 MANIFEST 里的文件数量和大小,确认没有缺件;第二类是应用级检查,把应用起起来,能登录、能查到一周前的历史单据;第三类是数据一致性检查,对数据库跑一遍内置的校验工具,确认没有坏页。
演练必须计时。从「决定恢复」到「业务可用」的总时长,才是你真实的 RTO,方案里写的那个数字只是目标值。我见过差距最大的一次,方案写 4 小时,实测 11 小时,卡在恢复盘驱动和磁带机固件版本上。这种差距只有演练能暴露。
演练还要记录「恢复顺序」。先起目录服务还是先起数据库,先挂共享目录还是先起应用,顺序错了就是一连串的依赖报错。这份顺序表应该和备份任务表放在一起,出事的时候值班的人不需要临场推理。
5. 避坑与排查:五条踩过的记录
这套方案里的技术点都不新,翻车基本都翻在细节上。下面五条是我在不同机房实际遇到过的,按「现象 → 原因 → 解决」记下来。
5.1 备份任务侧的三条
现象一:备份任务日志里天天显示成功,真要恢复时 tar 解压报unexpected EOF。原因是脚本里调用的归档命令后面跟了|| true,或者归档源目录里有正在写入的大文件,tar 读到文件尾部时内容还在增长,写进归档的长度对不上。解决办法是把|| true全部删掉,让失败以非零码退出;对活跃目录先做应用层静默或者用文件系统快照,再对快照目录归档;归档完成后强制跑gzip -t或对应的校验命令,校验不过直接告警,不写入「成功」状态。
现象二:差异备份的体积一天比一天大,跑到第三周已经和全量差不多,备份窗口被撑爆。原因是差异备份和增量备份共用了同一个快照文件,差异备份实际变成了增量,而增量又是相对上一次增量,基准不断前移,某些文件被反复收录。解决是给每一档分配独立的快照文件,差异档每次执行前先删除自己的基准,让它永远相对最近一次全备。改完之后差异备份的体积应该呈现「周一最小、周末最大、全备后归零」的锯齿形,如果看不到这个锯齿,说明基准还是错的。
现象三:备份任务偶尔在凌晨失败,重跑就成功,白天完全复现不了。原因是备份窗口和业务高峰重叠,磁盘 IO 被打满,归档读超时。方案里强调备份网络和业务隔离,说的就是这件事。解决办法是把备份流量放到独立网段或者给备份进程做 IO 限速,同时把任务开始时间往业务谷底挪,别卡在整点——整点往往是各种定时任务的集中点,一起抢资源。
5.2 容错与恢复侧的两条
现象四:双机切换成功,业务恢复,结果二十分钟后又切回去了,客户端连接报错两次。原因是回切没有延迟,主节点一恢复就抢虚拟地址,而主节点的数据其实还没追平,切回去之后读到旧数据,又触发一次异常。解决是回切改成手动,或者设 5 分钟以上的延迟窗口,并且加一道「主备数据位点差在阈值内」的判断,差得太多就不允许回切,先补齐再说。
现象五:某次网络抖动之后,两台服务器都认为对方挂了,同时对外提供服务,数据库出现两份不同的写入记录。这是典型的脑裂,根因是心跳走了业务交换机,交换机重启期间心跳全断,两边各自判定对方死亡。解决是三件事一起做:心跳改独立物理网卡直连,不经过任何业务交换设备;引入仲裁机制,比如一块共享仲裁盘或者一个第三方仲裁节点,只有拿到仲裁的一方才允许接管;切换脚本里加 VIP 冲突检查,地址还被占着就绝不漂移。
注意:脑裂之后不要急着重启。先把两边的写入日志和二进制日志都完整保留下来,再决定以哪一边为准做恢复。直接重启会让一部分已经写入的数据彻底失去追溯依据。
6. 灾难恢复演练怎么做到「敢按下去」
方案里的灾难恢复流程写得清楚:恢复硬件、连接磁带库、找出最近一次完全备份、用恢复盘启动、重建磁盘、恢复系统设定、自动挂载备份恢复系统文件与数据库。真正难的是让这套流程在深夜两点、值班人半睡半醒的状态下也能跑通。
我的做法是把演练拆成「预热、实操、验收」三段。预热段在月初做,只验证物料:恢复盘能不能引导、磁带机能不能识别介质、备份服务器上的目录索引能不能查到指定日期的备份集。这三件事任何一件不通,后面的实操都是浪费窗口。这一步最容易暴露的问题就是恢复盘过期——硬件换过、固件升过,盘里的驱动对不上,引导到一半卡住。
实操段挑一个业务低峰,用隔离环境完整走一遍恢复,全程计时并且只允许值班人按文档操作,不允许我口头提示。这一步的目的是验证文档,不是验证人。跑完之后把所有卡住的地方标出来,通常是三类:命令路径写错、密码没人知道、依赖顺序反了。我见过最典型的是恢复脚本里写着「挂载共享目录后启动应用」,但共享目录的挂载依赖目录服务先起来,顺序一反,应用起十次失败十次。
验收段看三个数字。第一个是数据丢失量,从最近一次可用备份到故障时刻的时间差,必须小于业务方确认的 RPO。第二个是恢复总时长,从决策到业务可登录,必须小于 RTO,超了就要么调整备份频率,要么换介质。第三个是一次通过率,第一次跑通的步骤占比,低于八成说明文档还需要打磨。
| 验收项 | 合格标准 | 不达标时的调整方向 |
|---|---|---|
| 数据丢失量 | ≤ 业务确认的 RPO | 提高全备频率,差异改增量 |
| 恢复总时长 | ≤ 业务确认的 RTO | 换更高吞吐介质,缩短恢复链 |
| 一次通过率 | ≥ 80% 的步骤 | 补文档、补账号、补依赖顺序 |
| 恢复盘有效性 | 引导进恢复环境 | 硬件变更后重制并标注版本 |
还有一个细节值得单独说:恢复介质的版本管理。每张恢复盘上要写清楚制作日期、对应的硬件型号、包含的驱动版本、以及它指向的备份服务器地址。这三样任何一样变了,盘就作废。我一般要求季度重制一次,硬件变更时立刻重制,旧盘保留一份但标注「仅历史参考」。
从那以后我每次接手新机房,第一件事不是看备份任务列表,而是让值班的人当着我的面做一次恢复盘引导,导不进去就先解决这个,其他都往后排。备份能不能用这件事,只有按下去那一刻才算数。希望帮到你。
本文还有配套的精品资源,点击获取