Оптимизация сжатых файлов для дедупликации на уровне блоков

325
Ira

У меня есть около 100 ТБ сжатых данных GZIP на облачных томах. По пути запуска дедупликации на уровне блоков (duperemove для btrfs) я обнаружил, что она была сжата без -n, что приводит к разнице в уровне блоков сжатого вывода для идентичных файлов, в остальном идентичных.

Помимо повторного сжатия всего этого gzip -n, есть ли другие способы, чтобы заставить сотни миллионов сжатых файлов «потерять» этот заголовок? и если мне уже нужно будет снова сжать их все, следует ли мне заняться другими оптимизациями, например, --rsyncableчтобы максимизировать шансы дедупликации?

(Данные имеют очень высокие шансы на содержание большого количества дупликов, мы говорим о ежедневных полных дампах больших таблиц базы данных)

2
In other words, is it possible to make "dedup" ignore the gzip header? i.e., you don't need to rewrite the files, just ignore the headers in your application. Glenn Randers-Pehrson 8 лет назад 0
поскольку я говорю о дедупликации на уровне блоков (то же самое, если бы это был уровень файла), я не вижу, как заставить его игнорировать заголовок. он находится в начале потока (насколько я знаю), а не в его конце, поэтому все сжатые данные могут выглядеть по-разному, не говоря уже о смещении, которое определенно нарушит границы блока, даже если после блока или два поток выглядит одинаково. Ira 8 лет назад 0

2 ответа на вопрос

0
Glenn Randers-Pehrson

Вы можете использовать zcat для извлечения файлов, а затем вычислить контрольную сумму для каждого файла:

for x in *.gz do zcat $x | sha256sum > $x.sum done 

затем проверьте эти * .gz.sum файлы на наличие ошибок. Каждый раз, когда вы удаляете дубликаты с именем "thing.gz.sum ", также удаляйте соответствующие" some.gz "

Если бы я собирался сделать простую жесткую ссылку на целые файлы, это, вероятно, было бы хорошим решением, но, как я уже говорил в исходном посте, я хочу сделать дедупликацию на уровне блоков, поскольку у меня много ежедневных полных резервных копий одни и те же данные, и я надеюсь найти идентичные блоки в неидентичных файлах (например, дамп таблицы БД, где большинство изменений происходит в конце файла и редко в верхней и средней части), поэтому это решение несколько наивно но может быть хорошей отправной точкой. Ira 8 лет назад 0
0
Ira

Отвечая на первую половину моего вопроса о том, как: вырезать штамп даты / имени файла gzip. нет, я еще не нашел готовый кусок кода, но я нашел время для установки vbindiff, визуального двоичного инструмента сравнения, и обнаружил, что заголовок не был сжат, и поэтому фактический сжатый поток идентичен с gzipи gzip -n, и все, что осталось, это манипулировать несколькими байтами в самом начале сжатых файлов, чтобы получить унифицированную версию. крошечная C-программа решит мою проблему, если кто-то не знает, sedдля двоичных файлов :-)

Что касается второй части, мне просто нужно поэкспериментировать с кучей данных. Если у меня будут какие-то определенные результаты, я опубликую их здесь.