У меня много файлов как по количеству, так и по общему размеру. (мы говорим о нескольких терабайтах). Я хотел бы один раз синхронизировать эти файлы / папки с внешней системой резервного копирования, а затем запустить ежедневную задачу, которая будет повторно синхронизировать резервную копию на основе ежедневных изменений. Изменения происходят не так часто, но в некоторые дни разница может составлять около 300 ГБ (примерно для файлов 1,5 КБ).
Я рассматривал rsync, rdiff-backup или rsnapshot в качестве некоторых инструментов, но сначала я хотел запустить несколько тестов с помощью rsynch. У меня была одна серьезная проблема с rsync, а именно:
Проверка существующих файлов на наличие изменений занимает слишком много времени. Речь идет о 20 часах, что делает бессмысленным ежедневное резервное копирование. Используется rsync -rvhzP или -rvhP. Кажется, он просто сканирует все файлы и занимает несколько часов, даже если файл не был добавлен / изменен / удален.
Я делаю что-то неправильно? Будет ли какая-либо из других упомянутых мной систем (rdiff-backup или rsnapshot) работать лучше? В любом случае я исходил из предположения, что они основаны на rsync.
Заранее спасибо.
Обновление с дополнительной информацией: У нас около 2600 каталогов и 100k файлов общим объемом около 3,5 ТБ, тесты выполнялись с использованием rsync version 3.0.9 protocol version 30
. Что касается ежедневных изменений, обычно происходит 10 изменений файлов в день, но может достигать пика около 1,5 тыс. Изменений / добавлений / удалений файлов и около 300 ГБ в объеме (хотя эти пики не такие частые и обычно распространяются по всему миру)
Предполагая, что отметки времени модификации в ваших исходных файлах являются допустимыми (и обновляются при изменении файлов), я думаю, что для вас имеет смысл добавить -t
аргумент для синхронизации времени. Quoth то rsync
страница руководства:
-t, - раз
Это указывает rsync передавать время модификации вместе с файлами и обновлять их в удаленной системе. Обратите внимание: если этот параметр не используется, оптимизация, исключающая файлы, которые не были изменены, не может быть эффективной; другими словами, отсутствие -t или -a приведет к тому, что следующая передача будет вести себя так, как если бы она использовала -I, вызывая обновление всех файлов (хотя алгоритм дельта-передачи rsync сделает обновление довольно эффективным, если файлы не на самом деле изменилось, вам гораздо лучше использовать -t).
По сути, вы теряете оптимизацию, благодаря которой rsync
может использовать временную метку изменения файла в качестве контрольной, чтобы указать, что файл был изменен. Если временные метки модификации не совпадают между отправителем и получателем, используется алгоритм дельта-копирования, и содержимое файла сканируется. Как вы видите, с таким большим корпусом, о котором вы говорите, это будет длительный процесс сканирования.
Если временные метки модификации ваших файлов не обновляются при изменении файлов (по какой-то странной причине), это не будет эффективным, и вам придется выполнить полное сканирование файлов. Если вам нужны временные метки модификации удаленных файлов, чтобы отразить, когда они были синхронизированы, а не временная метка модификации исходных файлов, то это также не будет работоспособным решением.
Я подозреваю, что этот вариант радикально тем не менее, ускорите синхронизацию.
Вы можете перейти на один уровень вниз, используя снимки lvm и lvmsync.
В этом решении снимки будут знать, что было изменено, сканирование не требуется. Обратной стороной является то, что это решение не понимает файлы, оно просто передает блоки.
Другое решение - это демон, который использует inotify и хранит информацию о файлах, которые были изменены. Затем вы можете просто использовать только файлы rsync в списке. Lsyncd выглядит как программа, которую вы ищете.