Рид-Соломон в восстановлении файлов
Программное обеспечение, над которым я работаю, выводит довольно много файлов, которые хранятся на сервере. Во время его работы у меня был один файл поврежден на меня. Эти файлы имеют решающее значение для операции, поэтому это не может произойти. Поэтому я пытаюсь придумать способ добавить исправление ошибок в файлы, чтобы этого больше не повторилось.
Я прочитал о Риде-Соломоне, который кодирует k блоков данных плюс m блоков четности, а затем может восстановить до m отсутствующих блоков. Так что я думаю о том, чтобы взять поток данных, разделить его на эти блоки, а затем сохранить их последовательно на диске, сначала блоки данных, затем блоки четности. Повторяйте, пока весь файл не будет сохранен. Размеры k, m и блоков, конечно, являются переменными, с которыми мне придется разобраться и поиграть.
Однако, насколько я понимаю, Рид-Соломон требует, чтобы вы знали, какие блоки повреждены. Как я мог знать это? Я думаю, мне нужно было бы добавить какой-то дополнительный, более простой код обнаружения ошибок в каждый из блоков, когда я их напишу, иначе я не могу знать, повреждены ли они. Как CRC32 или что-то.
Правильно ли я понял это или есть лучший способ сделать это?
0 ответов
Это немного старый вопрос, но (на мой взгляд) всегда полезен, а в некоторых случаях необходим. Битовая гниль никогда не будет полностью излечена (молчите сообщество ZFS; ZFS контролирует только то, что находится в своей файловой системе, пока оно есть), поэтому мы всегда должны придумывать профилактические планы предотвращения и восстановления.
В то время как он был разработан для облегчения пиратства (в частности, хранение и извлечение мульти-Гб файлов на куски на телеконференции, где любой фрагмент может пропадают или быть порчей), "Parchives" на самом деле именно то, что вы ищете (см белую бумагу, хотя не реализуйте эту схему напрямую, поскольку в ней есть ошибка и доступны более новые схемы), и на практике они работают следующим образом:
- Полный файл вводится в кодировщик
- Блоки обрабатываются и генерируются блоки Рида-Соломона.
.par
файлы, содержащие эти блоки, выводятся вместе с исходным файлом- Когда проверяется целостность (обычно на другом конце передачи файла), блоки проверяются повторно, и любые блоки, которые необходимо использовать для восстановления недостающих данных, извлекаются из
.par
файлы.
В конечном итоге все остановилось на " PAR2" (по сути, это переписывание с дополнительными функциями) по следующей схеме:
- Большой файл, сжатый с помощью RAR и разделенный на фрагменты (обычно около 100 МБ каждый, поскольку это был "обычно безопасный" максимум usenet)
- "Индексный" файл помещается рядом с файлом (например,
bigfile.PAR2
). Здесь нет фрагментов восстановления. - Ряд файлов номинального размера, составляющих 10% от исходного размера данных, находится рядом с файлами все большего размера (
bigfile.vol029+25.PAR2
,bigfile.vol104+88.PAR2
, так далее) - Человек на другом конце может получить все
.rar
файлы - Выполняется проверка целостности, которая возвращает количество МБ, указывающее, сколько данных необходимо восстановить.
.PAR2
файлы загружаются в количестве, равном или превышающем потребность- Восстановление выполнено, целостность проверена
- RAR извлечен, и исходный файл успешно передан
Теперь без уровня файловой системы эту систему по-прежнему довольно легко реализовать с помощью инструментов Parchive, но у нее есть два требования:
- Что файлы не изменяются (поскольку любое изменение файла на диске приведет к аннулированию данных четности (конечно, вы можете сделать это и добавить сложности с помощью схемы записи с копированием при изменении))
- При необходимости вы запускаете как создание файла, так и проверку / восстановление целостности.
Поскольку вся математика и методы известны и протестированы в боевых условиях, вы также можете использовать свои собственные, чтобы удовлетворить любые потребности (в качестве привязки к чтению / записи файлов, охватывая произвольную глубину пути, сохраняя данные восстановления на отдельном диске, так далее). Чтобы получить первые советы, обратитесь к профессионалам: https://www.backblaze.com/blog/reed-solomon/
Изменить: То же исследование, которое привело меня к этому вопросу, привело меня к целому набору уже выполненной работы, о которой я раньше не знал.
- https://crates.io/crates/solana-reed-solomon-erasure (а также множество других реализаций в реестре ящиков Rust)
- https://github.com/klauspost/reedsolomon (на основе кода BackBlaze, обрабатывает 1 Гбит / с на ядро)
- И т.д. Ищите "Восстановление файлов Рида-Соломона"