почему 'rsync --delete-before' удалить файлы с целевого объекта, которые все еще существуют в источнике?

У меня есть Linux-сервер CentOS 7.1 с rsync 3.1.1. Там есть файлы, которые я хочу перенести на машину FreeNAS 9.10. Для этого я установил демон rsync на freeNAS, и передача файлов работает нормально. Но когда файлы удаляются в источнике, я хочу, чтобы они также были удалены из цели. Итак, я добавил --delete-before к команде rsync, которую запускаю в Linux. Почему «до», а не обычное удаление? Потому что я использую parallel , чтобы ускорить синхронизацию за счет одновременной работы нескольких rsync. Параллельный rsync не может быть объединен с удалением, потому что каждый экземпляр rsync видит только небольшую часть набора файлов и будет удалять много файлов, если он будет объединен с командой удаления, возможно, даже удаление файлов, которые другие потоки будут иметь просто положи туда. Поэтому вместо этого я сначала запускаю rsync с параметром --delete-before, завершаю rsync через пару секунд, чтобы у него было достаточно времени для удаления, а затем запускаю параллельные команды rsync. Это вроде как взлом, но он должен работать. Однако, когда я запускаю команду rsync с параметром --dry-run, я вижу, что она удаляет файлы из цели, которые все еще существуют в источнике.

Это команда rsync, которую я выполняю:

rsync -av --delete-before --dry-run -P /some/folder/structure/ remotebackup.machine.com::backup/somefolder/

Результатом является:

building file list ...
415 files to consider
deleting fiFI.20150914.1317
deleting fiFI.20150914.1316
deleting my.20150914.1317
./
bareos/
bareos/my.20150917.1230
bareos/prod.20150918.0530
bareos/front01.20151101.0545
bareos/my.20160224.1504
bareos/fiFI.20150914.1316
bareos/fiFI.20150914.1317
bareos/fiFI.20150915.1311
bareos/fiFI.20150920.1230
bareos/fiFI.20150921.1231
bareos/fiFI.20150922.1230
bareos/fiFI.20151101.1230
<snip>

Как видите, rsync намеревается удалить некоторые файлы fiFI, но позже он намеревается передать те же самые файлы. Это отличается от того, что, по-видимому, указано в руководстве по rsync --delete-before следует делать (удалять только тогда, когда файл больше не существует в источнике), и это будет довольно неэффективно -> необходимо передать больше данных.

У меня есть проверил, что файлы действительно все еще существуют в источнике и в месте назначения, поэтому я ожидал, что он должен просто передать обновления, а не сначала удалить целевой файл.

Из-за объема данных я ' m пытается передать (5 ТБ) и необходимость распараллеливать эту передачу (из-за пропускной способности), нет возможности запустить обычное удаление с непараллельным rsync. Я посмотрел на другие методы синхронизации данных, но вернулся к ним. Rsync - очень надежный инструмент, и он должен прекрасно справляться с этим. Он ведет себя не так, как я ожидаю, и кажется, что он ведет себя не так, как в руководстве.

Это нормальное поведение? Я делаю что-то неправильно? Почему он делает это (удалить перед передачей)?

Интересно, что если я запустил начальный rsync, который удаляет файлы и синхронизирует их, а затем снова запускал тот же rsync, файлы снова удаляются и переносятся снова .

0
задан 4 May 2016 в 10:59
1 ответ

Я разобрался, с rsync все в порядке. На втором этапе, когда я передаю данные параллельно, я использовал это:

find /some/folder/structure/ -type f -mmin +60 | parallel -j4 'echo "starting `date` {}";rsync -av --no-compress --no-whole-file --quiet {} somehost.com::backup/somefolder/;echo "done `date` {}"'

, который заставляет все файлы записываться в 'somefolder' в месте назначения, независимо от структуры каталогов. При следующем запуске скрипта 1-й шаг находит файлы там, где их не должно быть, поэтому он их удаляет. А потом он их перенесет. 1-й rsync перенесет их в нужное место, но этот шаг предназначен только для удаления несуществующих файлов. Затем запускается второй rsync, но, поскольку он был неправильным, он помещал файлы в неправильное место. Промойте и повторите.

Исправление заключается в использовании относительных путей вроде этого:

find /some/folder/structure/ -type f -mmin +60 | sed 's/\some\/folder\/structure\/\(.*\)/\some\/folder\/structure\/.\/\1/g' | parallel -j4 'echo "starting `date` {}";rsync -av --no-compress --no-whole-file --quiet {} somehost.com::backup/somefolder/;echo "done `date` {}"'

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

0
ответ дан 24 November 2019 в 06:35

Теги

Похожие вопросы