0

我正在开发的一个软件会输出大量存储在服务器上的文件。在其运行期间,我有一个文件损坏了我。这些文件对操作至关重要,因此不会发生这种情况。因此,我试图想出一种向文件添加错误纠正的方法,以防止这种情况再次发生。

我读过 Reed-Solomon,它对 k 个数据块加上 m 个奇偶校验块进行编码,然后最多可以重建 m 个丢失的块。所以我在想的是获取数据流,将其拆分为这些块,然后将它们按顺序存储在磁盘上,首先是数据块,然后是奇偶校验块。重复直到整个文件被存储。k、m 和块大小当然是我必须研究和使用的变量。

但是,据我了解,Reed-Solomon 要求您知道哪些块已损坏。我怎么可能知道?我的想法是,我必须在编写每个块时为每个块添加一些额外的、更简单的错误检测代码,否则我不知道它们是否已损坏。像 CRC32 什么的。

我是否正确理解了这一点,还是有更好的方法来实现这一点?

4

1 回答 1

0

这是一个较老的问题,但(在我看来)总是有用的,在某些情况下是必要的。位腐烂永远不会完全治愈(安静的 ZFS 社区;ZFS 只能控制它的文件系统上的内容),所以我们总是必须提出积极的预防和恢复计划。

虽然它旨在促进盗版(特别是在新闻组上以块的形式存储和提取多 GB 文件,其中任何块都可能丢失或损坏),但“ Parchives ”实际上正是您正在寻找的东西(请参阅白皮书,不过不要直接实现该方案,因为它有一个错误并且有更新的方案可用),它们在实践中的工作方式如下:

  1. 完整的文件被输入到编码器
  2. 处理块并生成 Reed-Solomon 块
  3. .par包含这些块的文件与原始文件一起输出
  4. .par检查完整性时(通常在文件传输的另一端),将重新检查块,并从文件中提取需要用于重建丢失数据的任何块。

事情最终通过以下方案解决了“ PAR2 ”(本质上是具有附加功能的重写):

  • 用 RAR 压缩并分割成块的大文件(通常每个大约 100MB,因为这是 usenet 的“通常安全”最大值)
  • “索引”文件放置在文件旁边(例如bigfile.PAR2)。这没有恢复块。
  • 一系列总计为原始数据大小 10% 的 par 文件并排在越来越大的文件大小(bigfile.vol029+25.PAR2bigfile.vol104+88.PAR2等)中
  • 然后另一端的人可以获取所有.rar文件
  • 运行完整性检查,并返回需要恢复多少数据的 MB 计数
  • .PAR2文件的下载量等于或大于需要
  • 恢复完成并验证完整性
  • RAR解压,原文件传输成功

现在,如果没有文件系统层,使用 Parchive 工具实现这个系统仍然相当简单,但它有两个要求:

  1. 文件不会更改(因为对磁盘上文件的任何更改都会使奇偶校验数据无效(当然您可以这样做并使用更改时复制写入方案增加复杂性))
  2. 在适当的时候运行文件生成和完整性检查/恢复。

由于所有的数学和方法都是已知的和经过实战测试的,你也可以自己动手来满足任何需要(作为文件读/写的挂钩,跨越任意路径深度,将恢复数据存储在单独的驱动器上, ETC)。有关初始提示,请参阅专业人士:https ://www.backblaze.com/blog/reed-solomon/

编辑:导致我提出这个问题的同一项研究使我找到了我以前不知道的已经完成工作的整个子集

于 2020-06-02T16:21:47.990 回答