1

Каждый день мне нужно копировать N файлов из исходного местоположения в зеркало в определенное время (где N очень большое). Допустим, я говорю нескольким процессорам, чтобы каждый запускал rsync одновременно для подмножества файлов (пропускная способность сети и диска не является проблемой). В идеале каждый ЦП должен отвечать за непересекающееся подмножество N файлов, но на практике это иногда трудно гарантировать. (Некоторые из исходных файлов могут быть "востребованы" более чем одним процессором.) В результате иногда rsync I и rsync J одновременно пытаются скопировать файл F одновременно.

Используя rsync -avz --delete --temp-dir=/tmp remote:/path/to/source/ /path/to/dest/ , скажем, rsyncs I и J оба видят эту ситуацию для запуска:

/path/to/source/:
    FileA
    FileB
    FileC

/path/to/dest/:
    FileA

Каждый rsync считает, что ему нужно скопировать файлы B и C, и каждый начинает это делать, сначала в /tmp/name_of_source_file.temp_suffix . Допустим, я сначала заканчиваю и перемещаю его временный файл в /path/to/dest/FileB . Сейчас ситуация такова:

/path/to/dest/:
    FileA
    FileB

/tmp/:
    FileB.rsyncJsuffix

Теперь rsync J заканчивает копирование, но выдает ошибку, когда пытается переместить свою версию FileB в /path/to/dest/ потому что там уже есть другой FileB, который он не видел при запуске.

Один из многих вариантов rsync как-то справляется с этой ситуацией? В идеале, я бы хотел вариант, который говорит rsync: «Верьте в себя. Вы не можете сделать ничего плохого. Не стесняйтесь переписывать все, что пожелает ваше маленькое сердце », чтобы он не жаловался на FileB, который внезапно оказался в середине исполнения.

Мысли?

2 ответа2

0

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

Это из справочной страницы по rsync в разделе --temp-dir:

Если вы используете эту опцию по причинам, отличным от нехватки дискового пространства, вы можете захотеть объединить ее с опцией --delay-updates, которая будет гарантировать, что все скопированные файлы будут помещены в подкаталоги в целевой иерархии, ожидая конца передачи. Если у вас недостаточно места для дублирования всех поступающих файлов на целевом разделе, другой способ сообщить rsync, что вас не слишком беспокоит дисковое пространство, - это использовать параметр --partial-dir с относительным путем; поскольку это говорит rsync, что можно сохранить копию отдельного файла в подкаталоге в целевой иерархии, rsync будет использовать частично-каталог в качестве промежуточной области для переноса скопированного файла, а затем переименует его на место из там. (Указание --partial-dir с абсолютным путем не имеет этого побочного эффекта.)

-1

Учитывая, что у вас есть некоторая структура каталогов с некоторыми пустыми директориями и некоторыми файлами, и вы хотите получить ее архивную копию - я бы попробовал запустить rsync с параллелью:

  1. воссоздать ту же структуру каталогов

find /source /dir -type f | параллельный mkdir -p dest /dir /{//}

  1. rsync файлы:

find /source /dir -type f | параллельный rsync -a {} /dest /dir /{}

  1. затем запустите один Rsync, чтобы получить пустые каталоги и убедиться, что все хорошо

rsync -av /source /dir /dest /dir

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