Рид-Соломон в восстановлении файлов

Часть программного обеспечения, над которым я работаю, выводит довольно много файлов, которые хранятся на сервере. Во время его выполнения у меня был поврежден один файл. Эти файлы имеют решающее значение для работы, поэтому этого не может произойти. Поэтому я пытаюсь придумать способ исправления ошибок в файлах, чтобы это больше никогда не повторилось.

Я читал о Риде-Соломоне, который кодирует k блоков данных плюс m блоков четности, а затем может восстановить до m недостающих блоков. Итак, я думаю взять поток данных, разбить его на эти блоки, а затем последовательно сохранить их на диске, сначала блоки данных, затем блоки четности. Повторяйте, пока весь файл не будет сохранен. k, m и размеры блоков, конечно, являются переменными, которые мне придется изучить и поиграть с ними.

Однако, насколько я понимаю, Рид-Соломон требует, чтобы вы знали, какие блоки повреждены. Откуда я мог это знать? Я думаю, что мне придется добавлять дополнительный, более простой код обнаружения ошибок в каждый из блоков, когда я их пишу, иначе я не могу знать, повреждены ли они. Типа CRC32 или типа того.

Я правильно понял, или есть лучший способ сделать это?


person KennethJ    schedule 29.10.2016    source источник
comment
Ожидаете ли вы, что блоки данных полностью исчезнут, так что положение данных после этой точки сдвинется вперед, или вы ожидаете, что блоки данных будут повреждены без изменения размера? Если это позже, вам не нужно знать, какие блоки повреждены.   -  person all or None    schedule 03.11.2016
comment
@ 101 В идеале я хотел бы иметь возможность защититься от обоих сценариев, хотя я не уверен, как реализовать первый. Почему мне не нужно знать, какие блоки повреждены? Если у меня есть три блока данных и два блока четности, и один из них содержит поврежденные данные, мне нужно знать, какой именно, прежде чем я смогу надежно восстановить данные, не так ли?   -  person KennethJ    schedule 05.11.2016
comment
Нет, вы просто возвращаете все блоки данных в декодер RS, и он либо декодирует исходное сообщение, либо сообщает вам, что слишком много поврежденных блоков. Вам не нужно знать больше, чем это.   -  person all or None    schedule 06.11.2016


Ответы (1)


Это немного старый вопрос, но (на мой взгляд) это всегда полезно, а в некоторых случаях необходимо. Битовая гниль никогда не будет полностью вылечена (молчите сообщество ZFS; ZFS контролирует только то, что находится в ее файловой системе, пока она там), поэтому мы всегда должны придумывать упреждающие планы предотвращения и восстановления.

Хотя он был разработан для облегчения пиратства (в частности, для хранения и извлечения файлов размером несколько ГБ фрагментами в группах новостей, где любой фрагмент может быть потерян или поврежден), «Parchives" - это именно то, что вам нужно (см. технический документ, но не реализуйте эту схему напрямую, так как в ней есть ошибка и доступны более новые схемы), и на практике они работают следующим образом:

  1. Полный файл вводится в кодировщик
  2. Блоки обрабатываются и генерируются блоки Рида-Соломона
  3. .par файлы, содержащие эти блоки, выводятся вместе с исходным файлом
  4. Когда целостность проверяется (обычно на другом конце передачи файла), блоки проверяются повторно, и любые блоки, которые необходимо использовать для восстановления отсутствующих данных, извлекаются из .par файлов.

В конечном итоге все уладилось до "PAR2" (по сути переписанный с дополнительными функциями) с следующая схема:

  • Большой файл, сжатый с помощью RAR и разделенный на куски (обычно около 100 МБ каждый, поскольку это был «обычно безопасный» максимум для Usenet)
  • Рядом с файлом размещается «индексный» файл (например, bigfile.PAR2). Здесь нет фрагментов восстановления.
  • Ряд парных файлов, составляющих в общей сложности 10 % от исходного размера данных, находятся рядом во все более крупных размерах файлов (bigfile.vol029+25.PAR2, bigfile.vol104+88.PAR2 и т. д.).
  • Затем человек на другом конце может получить все .rar файлов.
  • Выполняется проверка целостности и возвращается количество МБ, определяющее объем данных, требующих восстановления.
  • .PAR2 файлов скачивается в количестве, равном или превышающем потребность
  • Восстановление выполнено и целостность проверена
  • RAR извлекается, и исходный файл успешно переносится

Теперь без уровня файловой системы эту систему по-прежнему довольно просто реализовать с помощью инструментов Parchive, но у нее есть два требования:

  1. Что файлы не изменяются (поскольку любое изменение файла на диске приведет к аннулированию данных четности (конечно, вы можете сделать это и добавить сложности с помощью схемы записи копирования при изменении))
  2. Что вы запускаете как генерацию файла, так и проверку/восстановление целостности, когда это необходимо.

Поскольку все математические расчеты и методы известны и проверены в бою, вы также можете создавать свои собственные, чтобы удовлетворить все потребности (в качестве привязки к чтению / записи файлов, охвату произвольной глубины пути, хранению данных восстановления на отдельном диске, так далее). Чтобы получить первые советы, обратитесь к профессионалам: https://www.backblaze.com/blog/reed-solomon/

Редактировать: то же самое исследование, которое привело меня к этому вопросу, привело меня к целому набору уже проделанной работы, о которой я раньше не знал.

person joshfindit    schedule 02.06.2020