feat(backup): 新增差异备份(differential)模式#88
Merged
Merged
Conversation
文件类型备份新增差异模式:仅打包自上次全量以来新增/变更的文件并记录删除, 显著减小备份体积与耗时;恢复时自动按「全量 + 差异」链还原。当前仅本机文件任务支持。 核心引擎: - backup/manifest.go:全量条目指纹清单(路径/大小/mtime/模式),差异比对与删除检测(纯函数,单测覆盖) - FileRunner:差异模式按基线清单过滤、写入删除清单特殊条目;恢复提取完成后统一应用删除,复用路径穿越校验杜绝逃逸 - 全量备份产出清单并持久化于备份记录,供后续差异比对 服务编排: - 执行器解析基线全量(成功、含清单、未超 DiffFullIntervalDays),命中则切换差异、记录基线 ID - 恢复服务按链(基线全量→差异)依次下载/校验/解压/应用,基线缺失即报错避免残缺恢复 - 保留清理保护「仍被存活差异依赖的全量」,防止删基线导致差异无法恢复 配置与界面: - 任务新增 backupMode / diffFullIntervalDays;校验差异仅限本机文件任务 - 前端:文件任务的备份模式选择 + 全量间隔输入;备份记录列表标注「差异」 测试:清单/比对/删除单测、差异端到端往返(变更/新增/删除/未变更)、保留链保护单测;go test ./... 全绿
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
此前所有备份均为全量——每次都打包全部数据。对大目录而言,这意味着重复存储、漫长耗时与高带宽。差异备份是备份工具的核心能力之一,本 PR 为文件备份补齐这一新的备份模式(而非外围功能)。
能力
文件任务可选「差异备份」:仅打包自上次全量以来新增/变更的文件,并记录删除;恢复时自动按「全量 + 差异」链还原到精确状态。
设计(数据安全优先)
风险最高的差异/恢复逻辑被隔离为可单测的纯模块:
backup/manifest.go— 全量条目指纹清单(路径/大小/mtime/模式);changedSince判定新增/变更、deletedPaths检测删除。纯函数,单测覆盖各分支。FileRunnerRun:差异模式下按基线清单过滤,仅写变更条目,并写入删除清单特殊条目.backupx/deletions.json;全量模式产出完整清单。Restore:先提取,最后统一应用删除(避免误删同批新增);提取与删除共用resolveWithinParent路径穿越校验,杜绝逃逸。服务编排
resolveDifferentialBase解析最近一次「成功、含清单、未超DiffFullIntervalDays」的全量;命中则转差异并记录基线 ID,否则回退全量(首次/基线过期自动重做全量,限制差异链跨度)。buildRestoreChain组装「基线全量 → 差异」链并按序应用;基线缺失/不可用立即报错,杜绝残缺恢复。protectDifferentialBases保护「仍被存活差异依赖的全量」——基线只有在其全部差异都过期后才会被清理,防止删基线导致差异无法恢复。配置与界面
backupMode/diffFullIntervalDays;校验差异仅限本机文件任务(远程/非文件给出明确错误)。测试
changedSince/deletedPaths各分支、保留链保护三场景go test ./...19 包全绿;tsc --noEmit通过范围说明