是否有任何久经考验的策略、算法和开源数据存储格式可用于为慢速网络驱动器开发可靠且快速的增量备份软件?
我打算使用 Qt 框架或 .NET(尚未决定),但编程语言并不重要,因为我正在寻找想法和解决方案而不是代码(尽管拥有 SDK 或库会很好)。
我不打算创建企业级客户端-服务器解决方案,而是一些简单但仍可根据我的需要进行调整的东西。
长篇大论:
我一直在努力寻找可靠的备份软件,它至少支持对数据和文件名进行简单的混淆(XOR 加密对我来说很好),并且还能够从备份存档中枚举和提取单个文件。
我想备份到模拟的网络驱动器(使用 Expandrive 或 NetDrive)。
我尝试了许多不同的程序,但每个程序都至少有一个严重缺陷。由于复杂的算法,某些程序太慢而无法备份到网络驱动器。有些程序将所有内容压缩为一个大的 zip 或自定义格式文件,这些文件可以分成几部分,但如果我尝试枚举和提取单个文件,它通常会超时。有些程序会加密文件内容,但会完全打开文件名,甚至不会对其进行混淆。
我还尝试了一些直接备份到云服务的专用程序,但它们被简化或没有为我打算主要使用的 Google Drive 提供任何加密。
这就是为什么我决定创建一些我可以根据自己的喜好进行调整的自定义项。这也是我学习如何正确实施备份过程的机会。
目前我的想法是将我的备份分成一些小的(100MB?50MB?还不确定......)按顺序编号的存储桶(文件夹)。我可以在当前正在进行的存储桶中存储一个锁定文件。如果备份过程中断并重新启动,我可以检查锁定文件是否存在,然后我知道我必须从头开始重新启动该存储桶。
使用这个存储桶系统,我必须确保每个存储桶都有完整的文件。这意味着如果我存储一个 1GB 的文件,我不能将它分成更多的部分,因为这会使自定义文件寻址表等变得非常复杂。所以,我的存储桶大小只是一个推荐的目标,但并不严格。
另一个问题是如何存储文件列表及其修改时间,这样我就可以实现基于时间戳的增量备份并尽可能快地加载列表。我不确定将每个存储桶的文件列表存储在该存储桶中是否是个好主意。也许将它存储在一个文件中会更好,以便我可以立即下载它?但是我可能会损坏该文件列表,并且我将无法恢复它。因此,将文件列表本身存储在存储桶中似乎更好,但我不确定我是否没有遗漏一些东西。
对于加密,正如我所说,简单的 XOR 对我来说很好,但如果我需要更好的东西(并且需要更多的资源),我可以添加一些 AES - 有很多库可以完成这项任务。我还想加密文件列表。但我不确定我应该如何处理文件 - 我应该单独加密每个文件还是应该加密整个存储桶?
我最关心的是可靠性。如何检查存档中的文件是否未损坏?腐败是我将他的档案存储在存储桶中的原因之一。如果数据损坏,则只有一个或多个存储桶会损坏。但是如何检测腐败呢?我可以计算校验和,但我不知道如何快速完成以及我应该为它们计算什么 - 单个文件?整个桶?使用什么算法来避免备份过程因为计算校验和而变得太慢?
我可以按如下方式实现重复数据删除。在备份期间,我在内存中有两个文件列表(服务器和本地)。如果我遇到两次出现的文件名,我可以做校验和看看它们是否相同,如果它们相同,我只将文件存储在一个存储桶中,但在第二个存储桶的文件列表中我标记该文件是重复的存储在第一个存储桶中的另一个文件,当从存档中恢复时,我可以提取该单个文件并将其复制到两个地方。
所有这些问题都让我产生了一个异端的想法——也许我可以使用 git?
但我怀疑它是否是备份 100GB 数据的好工具。至少,我可能会从 git 中学到一些有用的技巧,但我再次不确定哪些想法会或不会用于备份目的。
如果有人从事过类似的实现,很高兴听到您的经验以及一些想法和警告,这些想法在直觉上似乎是正确的,但在实践中可能会变得很糟糕。