При синхронизации больших файлов по медленной ссылке часто полезно использовать дельта-сжатие, чтобы уменьшить используемую пропускную способность. Также полезно сжимать файлы, так как они занимают гораздо меньше места.

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

Итак, каковы некоторые алгоритмы сжатия / утилиты, которые создают подобные сжатые большие двоичные объекты из похожих исходных файлов?

3 ответа3

2

Вы можете использовать аргумент --rsyncable для gzip. Это немного уменьшает сжатие, потому что сбрасывает алгоритм сжатия в начале каждого файла в вашем архиве.

Обратите внимание, что вы также можете использовать опцию -z с rsync для сжатия передаваемых данных. Если вас устраивают несжатые файлы в источнике и в месте назначения, этого может быть достаточно для ваших нужд.

Мы используем это для синхронизации сжатой резервной копии базы данных MySQL размером около 20 ГБ. Используя gzip --rsyncable, мы часто можем передавать только часть сжатого файла через rsync, если у нас уже есть снимок предыдущего дня. Я не пробовал переносить несжатый tar-файл и использовать опцию rsync -z, поэтому я не могу комментировать его относительную эффективность.

0

Одним из решений является сжатие файла блок за блоком вручную. Из простого теста со следующими файлами сценариев только немного (~ 0,1%) больше с блоками 1MiB. Это работает для алгоритмов, которые поддерживают конкатенацию (gzip и bzip2, чтобы назвать два). Это также немного медленнее, но тривиально распараллелить.

#!/bin/bash

alg="${2:-gzip}"

size=$(stat -c %s "$1")
cur=0
block=$((1024*1024)) # 1M blocks.

while [ $cur -lt $size ]; do
    #echo $alg $size $block $cur >&2
    tail -c +$cur "$1" | head -c $block | $alg
    cur=$((cur+block))
done

Таким образом, изменения могут повлиять только на измененный блок.

0

Вы можете захотеть использовать rdiff. Он похож на rsync, но не требует двухстороннего соединения с сервером.

То, как вы будете использовать это

  1. На исходном компьютере: rdiff signature file.ext file.ext.sig Это создает файл подписи, содержащий хэши для блоков, которые будут использовать будущие разности. храните файл .sig на исходном компьютере.
  2. Сожмите файл как обычно и отправьте по назначению
  3. Распакуйте файл в месте назначения
  4. Время проходит
  5. На исходном компьютере: rdiff delta file.ext.sig file.ext file.ext.delta это создает дельта-файл, содержащий только те изменения, в которых хэши не совпадают с файлом сигнатуры.
    • Скорее всего, вы обновите файл rdiff signature file.ext file.ext.sig .
  6. Отправьте дельта-файл по назначению, дельта-файл уже сжат
  7. В месте назначения: rdiff patch file.ext file.ext.delta file.ext это обновит целевую копию файла в соответствии с исходной копией. В зависимости от сборки rdiff, 2-й аргумент и 4-й аргумент могут потребовать разных имен файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .