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

Инкрементное резервное копирование в стиле Git с помощью rsync

Я пытаюсь настроить сценарий резервного копирования на Ubuntu. Каждый день я хочу скопировать локальный исходный каталог в резервный каталог на удаленном сервере с уникальным именем и датой. (например, backup-jan1 /, backup-jan2 / и т. д.) Он должен хранить зеркало самого раннего состояния и использовать файлы различий для воссоздания новых точек резервного копирования.

Это довольно просто с rsync. Я уже настроил скрипт, который сделает резервную копию, назовет каталог резервной копии с текущим днем ​​и создаст символическую ссылку на самую последнюю резервную копию (IP был отредактирован):

date=`date "+%m%d"`
rsync -ave ssh /srv root@150.69.32.8:/backup/backup-$date/
ssh root@150.69.32.8 rm -rf /backup/current
ssh root@150.69.32.8 ln -s backup-$date/ /backup/current

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

Так, например, я запускаю резервное копирование 1 января. Каталог backup-jan1 / будет содержать все исходные файлы резервных копий. На следующий день резервная копия от 2 января должна скопировать только файлы, измененные за эти 24 часа. Для всех остальных файлов будут созданы символические ссылки из файлов резервных копий 1 января. 3 января я добавил один файл и удалил другой. Если файл удален, он не должен иметь символическую ссылку.

Пример структуры каталога / файла:

backup-jan1/ (initial backup)
    file_a
    file_b

backup-jan2/ (no changes)
    file_a (symlink to ../backup-jan1/file_a)
    file_b (symlink to ../backup-jan1/file_b)

backup-jan3/ (removed file_a symlink and added file_c)
    file_b (symlink to ../backup-jan1/file_b)
    file_c

...

Я попытался найти эту функциональность с контролем версий в rsync и rsnapshot, но пока не нашел. Может ли кто-нибудь предложить такую ​​стратегию резервного копирования?

Кажется, вы ищете --link-dest функциональность, которая является частью rsync. Кажется, вы описываете именно то, как грязный работает.

Параметр link-dest создает жесткие ссылки из целевого пути на другую копию структуры.

С помощью dirvish вы выполняете начальное резервное копирование, которое просто использует rsync.

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

Вот сценарий, который вы можете использовать для демонстрации.

# create test area
mkdir -p /tmp/backuptest/{source,dest1,dest2,dest3}
for a in `seq 10` ; do dd if=/dev/urandom of=/tmp/backuptest/source/file$a bs=1M count=1; done

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# initial backup
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest1/

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# make chagnes
rm /tmp/backuptest/source/file[2-4]
cat /tmp/backuptest/source/file[6-7] >/tmp/backuptest/source/file11

# new backup linked to previous
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest2/ --link-dest=/tmp/backuptest/dest1/

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# make changes
rm /tmp/backuptest/source/file5
cat /tmp/backuptest/source/file[5-7] >/tmp/backuptest/source/file12

# new backup linked to previous
rsync -va /tmp/backuptest/source/ /tmp/backuptest/dest3/ --link-dest=/tmp/backuptest/dest2/

# look
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

# remove dest1
rm -r /tmp/backuptest/dest1/

# see your dest2, and dest3 are still complete backups for the state at those times.
find /tmp/backuptest/ -ls ; du find /tmp/backuptest/

Вы можете использовать «cp» с опцией «-l» для копирования как жестких ссылок. Если все ваши источник и место назначения находятся в одной файловой системе, это будет очень быстро.

Итак, ваш исходный каталог - «backup-jan1», а следующий - «backup-jan2». В этом случае выполните:

cp -al backup-jan1 backup-jan2

Затем запустите rsync для резервного копирования-jan2. Когда rsync обнаруживает измененный файл, он разрывает связь с исходным файлом в backup-jan1 и создает новый файл (с тем же именем) в backup-jan2.

На следующий день вы сделаете:

cp -al backup-jan2 backup-jan3

с вашим rsync для резервного копирования-jan3. Опять же, новые файлы в резервной копии приведут к отключению резервной копии-jan3 и т. Д.

В этом случае, если у вас есть 3 файла в резервной копии-jan1, при этом file1 остается неизменным в течение всех трех дней, file2 изменяется только на jan2, а file3 меняется каждый день, тогда у вас будет file1 как один и тот же жестко связанный для всех три каталога, file2 как два файла (один в backup-jan1 и один в backup-jan2 и backup-jan3, которые жестко связаны), и file3 как три файла в каждом каталоге.