ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

18个月备份任务实战:备份策略、恢复演练与存储架构

18个月备份任务实战:备份策略、恢复演练与存储架构 2023年12月26日开始的这个备份任务到2025年7月4日归档正好跨了18个多月文件夹名字就叫2023-12-26~2025-07-04备份。今天整理存储柜时又看到这个目录顺手把这一路踩的坑、改过的策略、恢复演练时差点翻车的过程整理出来。如果你正在规划一个长期备份体系或者手里已经有一个跑了大半年的备份任务但心里没底这篇应该对你有用。我不会讲太多理论基本都是实际跑下来的经验包括哪些工具组合真的稳、哪些最佳实践在真实场景里并不好用。1. 这个跨年备份任务的来龙去脉一次差点丢数据的教训1.1 为什么起点偏偏是2023-12-26我不想把开头写得像事故报告但确实需要解释清楚为什么是这个日期。2023年12月24日我维护的一个小型业务系统的数据库出了故障主库的磁盘阵列有一个盘离线RAID降级后又有一块盘在重建过程中报错整个卷组变得不可用。当时第一反应是去翻之前的备份结果发现上一个可用备份停在12月3日而且那还是因为每天凌晨3点跑一次mysqldump这个脚本在12月10日之后就因为有依赖更新悄悄退出了但没发告警。最后靠WAL日志和一块勉强能读的旧盘恢复了大部分数据但12月3日到12月24日之间有一部分业务数据确实丢了。原来的备份方案并不是没有问题在于它太脆弱单机、单脚本、单目录、没有任何校验和验证。那次事故之后我在12月26日重新搭了一套备份体系并且把所有备份统一放到一个按时间区间命名的归档目录下。2023-12-26就是这套体系的起点所以这个日期不是随便选的它代表一次重置从那天开始备份不再是一个可有可无的脚本而是有策略、有验证、有保留周期的正式任务。1.2 先盘点要保护什么再谈怎么备份很多人一上来就装工具、写脚本结果备份了一堆无所谓的东西真正重要的反而漏了。我第一周做的事情很枯燥把所有需要备份的数据资产列了一遍分成四类。第一类是代码仓库和配置文件。代码本身的源文件在Git远程仓库里有一份但本地工作副本、未提交的分支、各种环境变量和docker-compose配置不一定在仓库里。这类数据的特征是变更频繁、体积小、恢复优先级最高。第二类是数据库。这里包括业务的PostgreSQL、用来做缓存的Redis持久化文件还有一些SQLite数据库。数据库是恢复起来最麻烦的因为它不只是文件在就行还牵扯到一致性、binlog/事务日志、版本兼容。第三类是文档和媒体文件。合同PDF、设计稿、产品原型、照片、录音这类文件变更频率低但总量大恢复优先级相对低但丢失后的情感成本很高。第四类是第三方平台的导出数据比如云厂商的配置快照、DNS解析记录、邮件归档等。这些平时容易忽略一旦账号被封、误删除或服务商出问题恢复路径会很曲折。盘点完我建了一张表记录每类数据的存放位置、负责人、变更频率、可容忍丢失时间、当前是否有备份。有些数据当时发现其实有三四份拷贝散落各处有些则完全没有保护。这个表格后来成了备份策略设计的唯一依据也避免了在备份工具里一视同仁导致的资源浪费。2. 备份策略的选型全量、增量、差异怎么组合才不浪费空间2.1 先定目标RPO和RTO必须量化做备份不先定指标后面所有决策都会很随意。RPORecovery Point Objective是你最多能接受丢多少数据RTORecovery Time Objective是你最多能接受恢复要花多久。我把自己的目标定为数据库RPO不超过15分钟RTO不超过2小时文件和配置RPO不超过24小时RTO不超过4小时。有了这两个数字之后备份频率和方式的选择就清晰了。数据库不可能每15分钟做一次全量mysqldump那样磁盘压力和数据量都扛不住所以在数据库层面用PostgreSQL的连续归档加上基础备份来逼近15分钟的RPO文件和代码则用快照式备份工具每天跑一次全量加增量的组合。没有量化指标之前备份频率完全是拍脑袋量化之后所有事情都变得可计算、可解释。2.2 我的备份矩阵按数据类型区分处理这一节我直接把实际配置整理成了表格方便你对照使用。数据类型备份工具频率保留策略目标RPO代码仓库配置文件restic增量快照每6小时14天每6小时版本12月周版本18月月版本6小时PostgreSQL数据库pg_basebackup基础备份WAL归档基础备份每日WAL连续归档基备保留7份WAL保留14天15分钟文档和媒体文件restic增量快照每日30天日版本12月周版本18月月版本24小时第三方平台导出rclone同步到对象存储每周直接覆盖保留上一版本7天这套矩阵并没有采用全公司统一每天全量备份的简单方案因为不同数据的内在特征是截然不同的。代码仓库体积小、变化快适合高频快照数据库必须靠连续归档来满足短RPO大文件则通过降低频率换取存储成本。你不需要照抄我的频率但建议按这个思路列一张自己的矩阵。2.3 为什么保留18个月而不是只留最新版本我们经常觉得备份只需要防昨天误删但真实世界的灾难往往不是线性的。勒索病毒可能潜伏几个月后爆发某个腐蚀性bug可能在数据库里慢慢破坏数据直到某天才被发现甚至同事可能在上个季度误改了某个合同模板重新覆盖了正确版本。如果备份只保留几天或几周这些场景全部中招。这个项目刻意保留18个月的月版本快照就是考虑到发现问题的时间往往滞后于损坏发生的时间。18个月不是拍脑袋定的它是基于这样一个观察这个业务系统的数据审计最长需要覆盖四个季度加一个月的账期复核我给这个周期留了不少余量。备份版本不是越多越好但保留太短会让备份在真正需要时形同虚设。我见过太多人设置备份策略时只考虑省空间却忘了备份的目的是为了能在任意时间点回到可用状态。还有一个细节值得提restic、Borg这类工具的增量快照在存储上并不是简单复制文件变动而是通过内容寻址存储Content-Addressed Storage每个数据块只存一份多个快照之间共享数据块。所以在保留18个月月版本的同时实际占用的空间并不会像想象中那么恐怖。我的存档目录里代码库加上文档媒体文件合计4.2TB的当前数据量通过restic去重后备份仓库只占了约1.7TB其中包含了全部18个月的版本历史。3. 存储介质的3-2-1落地本地、NAS、异地三份副本3.1 备份不是同步为什么我用restic而不是简单的rsync mirror很多人会把备份做成rsync镜像或者网盘自动同步觉得文件在另一台机器上有副本就够了。这个理解有一个隐患同步会把删除、覆盖、加密等危险操作也同步过去。比如本机中了勒索病毒文件被加密修改同步工具会忠实地把被加密的版本同步到NAS和云盘到时候你连回滚的机会都没有。所以我做备份用的是restic这类具备快照和去重能力的工具。restic每次生成一个不可变的快照快照之间可以互相独立回滚仓库本身是内容寻址的不会被轻易篡改。用生活里的话说同步是镜子你做什么它照做什么快照备份是拍照片无论后来发生什么这张照片都留在那一刻的状态。对于长期备份需要的是照片而不是镜子。3.2 三份副本的物理架构从热备到冷备3-2-1原则都说烂了但落地时每个1怎么选还是有门道的。我的实际架构是第一份本地工作站的NVMe硬盘上的restic缓存仓库其实这不能算严格意义的备份它主要提供最近几次快照的快速恢复能力用于误删文件后秒级回滚。第二份一台常年开机的NAS放在家里另一个房间通过内网以restic backup到NAS上的restic仓库写入频率和备份任务频率一致用于整机快速恢复。NAS上还开了一个不可变的快照计划每天对restic仓库目录做一次只读快照防止restic仓库本身被破坏。第三份异地对象存储我用rclone将NAS上的restic仓库加密后同步到云端的对象存储因为restic本身支持加密所以传到云端的内容是密文。这一份是真正的保命副本即使家里发生火灾、盗窃或者NAS上的数据被一起损害这份异地的密文仍然能恢复。这三份副本的恢复优先级是从快到慢的本地最快NAS其次云端最慢。但对应的安全级别反过来云端最安全。3.3 冷备份长期归档不能只有在线副本跨18个月的项目里还有一个容易被忽视的环节冷备。在线副本再完善总存在单点或者逻辑错误的风险比如你NAS的存储池在运行两年后出现静默数据损坏而你完全不知道。所以我每三个月做一次冷备用restic的copy命令从NAS仓库导出一份独立的快照副本到一块2.5英寸移动硬盘上然后把这块盘放在防潮箱里离线存放。你可能觉得严格意义上冷备可以和云端替代但我要强调一点云端也不绝对可靠可能遇到账号问题、服务商问题甚至云服务本身的数据迁移事故。冷备是这套链路里唯一一个彻底绝缘的终极隔离层。每次冷备完成后我会在硬盘上写一个CHECKSUM.txt文件记录所有备份包的SHA-256放到防潮箱里时旁边放一张纸质索引卡记录备份日期、内容范围和校验文件的路径。纸质记录虽然原始但它是唯一一种断电、断网、坏机器后依然能读懂的索引方式。这个细节帮我避免过备份文件都在但打开时发现不是加密密钥丢失就是格式损坏的尴尬。4. 恢复演练一次真实的恢复失败排查链路4.1 备份跑通不算数恢复跑通才靠谱这个项目的头三个月里备份任务一直显示成功日志里没有报错快照数量也在正常增加。但我心里始终有个疙瘩这些快照真的能恢复出可用数据吗当时我定了一个规矩每月的第一个周末做一次抽查式恢复从一个月前的快照里随机选几个文件、一个数据库、一个配置文件恢复到临时目录然后手工验证文件能否打开、数据库能否正常启动并查询到预期数据。规矩定下来后第一次真正意义上的恢复失败就发生在2024年5月那次排查过程后来被我完整地记录了下来。4.2 一次真实故障备份日志正常但恢复出来的文件是坏的2024年5月4日我照常执行抽查任务选的是一份2024年4月初的项目文档快照恢复后打开PDF发现页面图像有大片花斑压缩包能解开但解出来的几个文件校验值对不上。确实restic本身会在读写时做校验理论上不太可能出现静默损坏所以当它真的发生时证明之前对理论上不会的迷信是靠不住的。排查的第一步确认是不是随机损坏。我重新恢复同一个快照并同时在另一台机器上恢复同一个版本的文件然后对两个恢复结果分别计算SHA-256。结果发现两台机器恢复出来的文件哈希是一致的但哈希值和初始备份时的记录对不上也就是说损坏发生在备份端而不是恢复端。这说明问题不是读取路径上的网络或内存错误。第二步定位损坏的数据块。restic提供了restic check --read-data命令它会读取并校验所有数据块。完整跑完花了六个小时输出显示有两个pack文件存在校验和不一致被标记为损坏。这两个pack对应的正好是4月初那几个项目文档的加密块。到此为止怀疑对象集中在存放restic仓库的那块NAS磁盘上。第三步检查NAS磁盘的健康状态。smartctl -l error /dev/sdX看到有大量pending sector错误dmesg里也有ATA错误重试记录。基本可以确定NAS硬盘在4月之后出现了静默坏道相关数据块在读取时虽然能返回数据但返回的是错误数据而硬件层的错误没有被上层文件系统感知于是NAS在没有报错的情况下把坏数据写给了restic仓库。这正好说明了为什么3-2-1架构里必须有一层校验机制如果restic没有内容寻址和校验我可能永远不会发现这些文件是坏的。第四步也是最关键的一步用策略兜底。因为NAS上的仓库部分数据块损坏但本地工作站上还有保留周期内的旧版本快照而且云端仓库最后一次同步是在损坏发生之前所以最终的恢复路径是从云端仓库重新下载对应快照到NAS替换损坏的数据块。替换后重新执行restic check --read-data这次全量校验通过。整个排查和修复过程花了两个整天如果我没有做抽查恢复这个问题可能一直潜伏到真正需要恢复数据的那一天后果不可设想。4.3 自动化健康检查把人工验证变成每天定时任务经历这件事后我把恢复演练从抽查式升级为脚本化健康检查。每天凌晨两点备份任务跑完之后会触发一个健康检查脚本内容包括检查restic仓库的完整性执行restic check --read-data的一小部分只抽查最近一个快照的所有数据块大约耗时20分钟避免全量检查太慢检查备份日志里是否有WARNING或ERROR关键字对比快照数量和预期数量如果连续两天的快照数没有变化告警计算当次备份新增数据量如果连续多次都太小则怀疑是否有文件被排除或遗漏。这个脚本通过cron跑起来后我基本不再需要人工盯备份日志。它的价值在于备份系统本身也是系统同样需要监控、告警和持续验证。如果你目前还是设好备份靠天收的状态建议立即把健康检查脚本加上。5. 跨年运行的运维细节命名、权限、容量和时间戳5.1 命名规范一个能让你在两年后快速定位的归档目录回到这篇文章的标题——2023-12-26~2025-07-04备份。这个看起来只是一个日期区间的目录名其实背后有一套命名规范。这套规范我使用到现在建议你直接抄走YYYY-MM-DD~YYYY-MM-DD业务_用途其中前半部分是备份范围用途统一用备份、归档或快照避免混用。比如2023-12-26~2025-07-04备份表示这段日期内的原始备份集合2023-12-26~2024-06-30归档表示只读的历史归档2025-07-04迁移快照表示某个特定动作前的完整快照。你这样命名以后任何一个人在两年后看到这个目录都能立刻知道它是哪个时间段的数据用途是什么能不能动。比final_backup_v3这类命名不知道高到哪里去了。目录内部我也做了固定的层级备份根目录/YYYY/MM/DD/数据类别/实际文件。这样每次备份都会进入当天的路径两套工具在生成归档时可以自动填写日期不需要人工干预。如果当时有人勤劳地在备份文件夹里按项目名/最终版来组织恢复时大概率会是一场噩梦——因为备份文件夹里最忌讳的就是业务名和版本号混在一起。5.2 时间戳不一致引发的版本错乱备份最怕的不是没备份而是备份了但找不到对应时间的版本。2024年初一次恢复时我需要找2024年1月15日下午某个数据库的状态但恢复出来的多个备份文件显示的时间都不一样有的显示14:23有的显示15:47对比业务日志发现哪个都对不上。查了半天才意识到问题出在时间戳上那台NAS的系统时钟没启用NTP每天漂移几分钟时间长了就差了半个多小时而各台被备份的服务器各自有自己的时钟有的偏快有的偏慢于是看似同一时间的备份实际记录的时刻五花八门。解决方法是统一所有节点的时钟源在NAS和所有需要备份的机器上配置NTP客户端同步到同一个时间源然后在备份脚本里统一使用ISO 8601格式的UTC时间戳记录备份日志同时在快照标签里写明发生的业务事件对应的是业务时间备份设备记录的是UTC时间两者用一张对照表映射。那次以后再没有出现过版本时间对不上的诡异问题。这个坑特别隐蔽因为它平时不干扰任何东西只在需要精确回溯时才暴露出严重后果。5.3 容量告警与备份窗口的动态调整跨18个月的备份最大的物理挑战是存储容量的持续膨胀。我当时的NAS仓库从最开始空置的2TB区间到2025年初已经占了3.8TB而且备份任务本身的运行时间也在拉长——最早每晚半小时能跑完的增量备份到后来因为仓库变大、网络瓶颈和NAS性能下降要到凌晨两点才结束。备份窗口拉长带来一个实际的问题如果备份任务还没跑完第二天的正常业务可能受到影响尤其是NAS在备份期间CPU和磁盘I/O都高。我调了几轮最终形成一套动态策略备份任务改成分片调度代码仓库每6小时备份一次每次只备份最新增量文档媒体文件每天凌晨一点开始按目录分片逐个备份中间用恢复时间估算文件变更热点保持每个分片不超过30分钟容量告警设置三层磁盘使用率超过70%提醒超过80%告警超过90%自动暂停非关键备份并把告警发到手机每季度评估一次保留策略如果某些月份的历史版本从来没有被恢复过可以适当地把旧版本降级为仅冷备状态而不是直接删除。这套机制让仓库容量在2025年上半年稳定在了可用范围的80%以内备份窗口控制在每晚两小时之内。5.4 备份权限写权限越少恢复越可靠备份文件一旦生成原则上只有恢复时才有读取需求。但在实际操作中很多人会给备份任务和仓库目录设置过宽的权限甚至直接用root用户跑备份导致任何一个被攻破的应用都能通过备份接口读写整个仓库。这个项目的经验是备份任务使用独立的系统账号而不是root或业务账号仓库目录的写权限只授予备份客户端本身恢复时使用另一台跳板机通过SSH密钥访问restic仓库本身如果支持开启append only模式让备份客户端只能新增、不能删除或覆盖快照。这样即使备份机器被入侵也无法把历史备份全部删掉冷备硬盘和云存储账号使用独立的密钥管理不放在被备份的机器上。有一次我模拟勒索病毒场景假设所有在线数据都被加密破坏检查是否还能通过冷备硬盘恢复。结果发现移动硬盘就插在那台同机的USB口上如果勒索病毒有管理员权限冷备盘会一起遭殃。从那以后冷备盘平时不挂载只有做冷备时才接上用完立即卸载。这个习惯建议你也养成备份副本和原始数据之间要有真正的安全隔离不能只是逻辑上隔离物理上也要隔离。6. 2025-07-04归档完成备份项目如何收尾6.1 为什么选这个日期收尾备份任务不会一直无限期跑下去总有一天会转移到新的体系或新的设备。2025年6月底业务系统开始迁移到新的基础设施我决定在7月4日完成迁移前的最后一次完整快照并把之前的整个备份周期归档为2023-12-26~2025-07-04备份。这个日期选在迁移动作开始的前一天保证归档内容是旧环境里最后一个完整可用的状态。迁移过程中一旦出现意外可以直接从这份归档恢复整个旧环境这种迁移前快照的留档习惯非常值得推广。6.2 归档时的完整校验与双副本留存归档不是把文件夹重命名那么简单。为了让这个目录能安稳躺上几年归档当天我做了一套完整的收尾动作第一步对归档仓库执行一次全量校验restic check --read-data完整跑了一遍另外对所有冷备盘上的备份包重新计算SHA-256和当初记录的摘要比对确保没有静默损坏。第二步生成归档清单用Markdown表格和Plain Text两种格式记录备份范围、起止时间、文件数量、仓库大小、校验和、加密密钥在哪、恢复操作手册在哪。这份清单既放入NAS的一份归档说明/目录里也打印了一份纸质版和冷备盘放在一起。第三步制作双份归档一份保留在NAS的只读目录另一份复制到两块冷备硬盘中的一块另一块做异地存储。三份中至少保证有两份在不同建筑物内。第四步验证可恢复性实际从归档仓库中完整恢复一个小型数据库和一个项目目录到临时位置确认启动和读取正常。这一步是归档成功与否的最终判定永远不要省。6.3 18个月备份周期结束后的几点体会说点实际操作层面的体会吧。第一备份不是设置完就完事的项目它需要持续运营就像健身一样动作做一次很容易坚持一年才是真正的收获。这18个月里我调整过至少五次备份策略每一次都是因为现实情况发生了变化数据量增长、恢复演练暴露的问题、业务变更带来的新数据类型。第二自动化和告警是备份系统能长期运行的前提。靠人记着看备份日志早晚会忘掉只有把健康检查、容量告警、版本数量异常检测都做成自动的才能避免备份任务悄悄失败好几个月这种最常见的翻车方式。第三恢复演练是整个备份体系里最有价值的投入。每次恢复演练都会发现一些平时不会想到的问题权限设置错误、时间戳混乱、数据块损坏、备份文件格式变化导致无法打开。这些问题中的任何一个在真正的灾难来临前发现都相当于省下了不可估量的代价。第四命名规范和文档记录不是形式主义。当你在一年半后回看一堆备份目录如果连哪个快照包含哪些数据都搞不清再完美的技术方案都是白搭。2023-12-26~2025-07-04备份这个名字本身就是我给自己和任何一个后来者留下的第一份操作指南。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进