Назад | Перейти на главную страницу

rsync изменяет уже существующие файлы

У меня есть простая строка rsync в моем crontab, которая передает файлы резервных копий с одного prod-сервера на другой.

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

Обратите внимание на дату и время изменения файлов ниже.

Как мне использовать rsync, чтобы не трогать (и не загружать?) Файлы, которые у него уже есть. Мне тоже не нужно вычислять контрольные суммы, после создания резервных копий они больше не изменятся.

rsync -vzre 'ssh' stor@server:/backup/system/ /storage/share/Backup/Server

Файлы для загрузки:

-rw-r-x--- 1 root stor 896K Jun 22 05:02 giant-140622-etc.zip
-rw-r-x--- 1 root stor 620K Jun 22 05:02 giant-140622-sql.zip
-rw-r-x--- 1 root stor  84M Jun 22 05:02 giant-140622-www.zip
-rw-r-x--- 1 root stor 899K Jun 25 05:00 giant-140625-etc.zip
-rw-r-x--- 1 root stor 603K Jun 25 05:00 giant-140625-sql.zip
-rw-r-x--- 1 root stor  84M Jun 25 05:00 giant-140625-www.zip
-rw-r-x--- 1 root stor 899K Jun 28 05:00 giant-140628-etc.zip
-rw-r-x--- 1 root stor 620K Jun 28 05:00 giant-140628-sql.zip
-rw-r-x--- 1 root stor  86M Jun 28 05:00 giant-140628-www.zip
-rw-r-x--- 1 root stor 899K Jun 30 05:00 giant-140630-etc.zip
-rw-r-x--- 1 root stor 617K Jun 30 05:00 giant-140630-sql.zip
-rw-r-x--- 1 root stor  86M Jun 30 05:00 giant-140630-www.zip

Пункт назначения:

-rw-r-x--- 1 stor stor 896K Jun 30 06:06 giant-140622-etc.zip
-rw-r-x--- 1 stor stor 620K Jun 30 06:06 giant-140622-sql.zip
-rw-r-x--- 1 stor stor  84M Jun 30 06:06 giant-140622-www.zip
-rw-r-x--- 1 stor stor 899K Jun 30 06:06 giant-140625-etc.zip
-rw-r-x--- 1 stor stor 603K Jun 30 06:06 giant-140625-sql.zip
-rw-r-x--- 1 stor stor  84M Jun 30 06:06 giant-140625-www.zip
-rw-r-x--- 1 stor stor 899K Jun 30 06:06 giant-140628-etc.zip
-rw-r-x--- 1 stor stor 620K Jun 30 06:06 giant-140628-sql.zip
-rw-r-x--- 1 stor stor  86M Jun 30 06:06 giant-140628-www.zip
-rw-r-x--- 1 stor stor 899K Jun 30 06:07 giant-140630-etc.zip
-rw-r-x--- 1 stor stor 617K Jun 30 06:08 giant-140630-sql.zip
-rw-r-x--- 1 stor stor  86M Jun 30 06:10 giant-140630-www.zip

Обновить:

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

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

rsync -vzr --ignore-existing -e 'ssh -i /path/id_rsa -l backup' backup@flowl.info:/backup/system/ /nfs/share-private/Backup/Server

Обновить:

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

-rw-r-x--- 1 stor stor 899K Jul  4 06:01 giant-140702-etc.zip
-rw-r-x--- 1 stor stor 621K Jul  4 06:01 giant-140702-sql.zip
-rw-r-x--- 1 stor stor  86M Jul  4 06:03 giant-140702-www.zip
                                       ^-- 01 to 03
-rw-r-x--- 1 stor stor 899K Jul  4 06:04 giant-140704-etc.zip
-rw-r-x--- 1 stor stor 634K Jul  4 06:05 giant-140704-sql.zip
-rw-r-x--- 1 stor stor  86M Jul  8 06:02 giant-140704-www.zip
                                       ^-- ???
-rw-r-x--- 1 stor stor 899K Jul  8 06:03 giant-140706-etc.zip
-rw-r-x--- 1 stor stor 629K Jul  8 06:03 giant-140706-sql.zip
-rw-r-x--- 1 stor stor  86M Jul  8 06:06 giant-140706-www.zip
                                       ^-- 03 - 06
-rw-r-x--- 1 stor stor 899K Jul  8 06:07 giant-140708-etc.zip
-rw-r-x--- 1 stor stor 629K Jul  8 06:07 giant-140708-sql.zip
-rw-r-x--- 1 stor stor  86M Jul  8 06:10 giant-140708-www.zip
                                       ^-- 07 - 10

Теперь, когда я представляю себе следующий месяц, время будет примерно таким:

-rw-r-x--- 1 stor stor 899K Jul  8 06:32 giant-140808-etc.zip
-rw-r-x--- 1 stor stor 629K Jul  8 06:32 giant-140808-sql.zip
-rw-r-x--- 1 stor stor  86M Jul  8 06:35 giant-140808-www.zip
                                       ^-- what I imagine to happen

По умолчанию rsync прочитает весь файл как в источнике, так и в месте назначения, чтобы убедиться, что они идентичны. Это не потребляет пропускную способность сети, поскольку будет сравнивать только хеш-значение. Но он тратит время на чтение с диска.

В одном сценарии использования я обнаружил, что это ужасно неэффективно, потому что исходные файлы только добавлялись. Я использовал --size-only, который мне очень понравился.

Есть несколько других вариантов, которые, похоже, могут быть применимы, --append и --append-verify, но я их сам не тестировал.

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

Я думаю добавление -t к вашему списку аргументов поможет.

Чтобы проверить это, вы можете добавить --itemize-changes к аргументам (без -t). Если я правильно вас понял, это покажет T-флаг в каждой строке

man 1 rspec:

T означает, что время модификации другое и обновляется до значения отправителя (требуется --times). Альтернативное значение T означает, что время модификации будет установлено равным времени передачи, что происходит, когда файл / символическая ссылка / устройство обновляется без --times и когда символическая ссылка изменяется и получатель не может установить свое время. (Примечание: при использовании клиента rsync 3.0.0 вы можете увидеть флаг s в сочетании с t вместо правильного флага T для этого сбоя установки времени.)

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

Это мой пример запуска:

krissi@host ~/tmp/rsync % l *
dst:
total 0

src:
total 0
-rw-r--r-- 1 krissi users 0 Jul 13 18:05 bar
-rw-r--r-- 1 krissi users 0 Jul 13 18:05 foo
-rw-r--r-- 1 krissi users 0 Jul 13 18:19 later
krissi@host ~/tmp/rsync % rsync -vzr --itemize-changes src/ dst/
sending incremental file list
>f+++++++++ bar
>f+++++++++ foo
>f+++++++++ later

sent 174 bytes  received 69 bytes  486.00 bytes/sec
total size is 0  speedup is 0.00
krissi@host ~/tmp/rsync % l *
dst:
total 0
-rw-r--r-- 1 krissi users 0 Jul 13 18:21 bar
-rw-r--r-- 1 krissi users 0 Jul 13 18:21 foo
-rw-r--r-- 1 krissi users 0 Jul 13 18:21 later

src:
total 0
-rw-r--r-- 1 krissi users 0 Jul 13 18:05 bar
-rw-r--r-- 1 krissi users 0 Jul 13 18:05 foo
-rw-r--r-- 1 krissi users 0 Jul 13 18:19 later
krissi@host ~/tmp/rsync % rsync -vzr --itemize-changes src/ dst/
sending incremental file list
>f..T...... bar
>f..T...... foo
>f..T...... later

sent 174 bytes  received 69 bytes  486.00 bytes/sec
total size is 0  speedup is 0.00
krissi@host ~/tmp/rsync % rsync -vzr --itemize-changes src/ dst/
sending incremental file list
>f..T...... bar
>f..T...... foo
>f..T...... later

sent 174 bytes  received 69 bytes  486.00 bytes/sec
total size is 0  speedup is 0.00
krissi@host ~/tmp/rsync % rsync -vzrt --itemize-changes src/ dst/
sending incremental file list
.d..t...... ./
>f..t...... bar
>f..t...... foo
>f..t...... later

sent 177 bytes  received 72 bytes  498.00 bytes/sec
total size is 0  speedup is 0.00
krissi@host ~/tmp/rsync % rsync -vzrt --itemize-changes src/ dst/
sending incremental file list

sent 66 bytes  received 12 bytes  156.00 bytes/sec
total size is 0  speedup is 0.00
krissi@host ~/tmp/rsync % l *
dst:
total 0
-rw-r--r-- 1 krissi users 0 Jul 13 18:05 bar
-rw-r--r-- 1 krissi users 0 Jul 13 18:05 foo
-rw-r--r-- 1 krissi users 0 Jul 13 18:19 later

src:
total 0
-rw-r--r-- 1 krissi users 0 Jul 13 18:05 bar
-rw-r--r-- 1 krissi users 0 Jul 13 18:05 foo
-rw-r--r-- 1 krissi users 0 Jul 13 18:19 later

Я добавил --ignore-existing , и похоже, что она ничего не изменит, а только загрузит новые файлы.

rsync -vzr --ignore-existing -e

Редактировать: Когда появляются новые файлы, каждый цикл все равно занимает больше времени.

почему ты говоришь, что каждый раз требуется больше времени? как это возможно?

может это программа, генерирующая файлы, трогает их?

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

(и, возможно, попробуйте отладить с помощью -t вариант, который сохраняет время модификации)