2

Я пытаюсь написать очень простую стратегию резервного копирования. Вот общая идея.

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

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

Ежемесячно - в первое число месяца копируйте ежедневную резервную копию в ежемесячную резервную копию, чтобы хранить ее в течение месяца, перезаписывая резервную копию за последний месяц.

Вот загадка: каждый день, когда я делаю еженедельное резервное копирование, еженедельное и ежедневное резервное копирование будут одинаковыми, поэтому у меня не будет резервной копии на несколько дней.

Если этот день выпадает на первое число месяца, все резервные копии будут одинаковыми, уменьшая весь смысл наличия нескольких резервных копий.

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

У кого-нибудь есть идеи по переработке этой стратегии? Поэтому у меня нет периодов, когда все резервные копии одинаковы.

3 ответа3

2

Я написал бы сценарий, который проверяет, существует ли резервная копия больше чем 1,7 или 30 дней и действует соответственно. Вы этого не сказали, но я предполагаю, что вы используете Linux (я добавил тег к вашему вопросу), и вы выполняете резервное копирование на удаленный сервер. Первым шагом будет написание небольшого скрипта, который запускает вашу команду rsync а также создает файл на удаленном сервере после завершения резервного копирования. Это будет использоваться как для того, чтобы узнать, выполняется ли резервное копирование в настоящее время, так и для проверки срока его хранения (я предполагаю, что вы сохраняете исходные метки времени при создании резервных копий файлов, поэтому вы не можете получить дату из самих файлов):

Скрипт Rsync (предполагается, что у вас есть доступ без пароля к удаленному серверу):

#!/usr/bin/env bash
ssh user@remote rm /path/to/daily/backup/backup_finished.txt
rsync /path/to/source/ user@remote:/path/to/daily/backup/
ssh user@remote touch /path/to/daily/backup/backup_finished.txt

На локальном компьютере настройте задачу cron, которая выполняет ежедневное резервное копирование:

@daily rsync_script.sh

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

@hourly check_backup.sh

Сценарий check_backup.sh:

#!/usr/bin/env bash

daily=/path/to/daily;
weekly=/path/to/weekly;
monthly=/path/to/monthly;

## The dates will be measured in seconds since the UNIX epoch, 
## so we need to translate weeks and months (31 days) to seconds.
week=$((60*60*24*7));
month=$((60*60*24*31));  

## Make sure no backup is currently running
if [ ! -e $daily/backup_finished.txt ]; then 
 echo "A backup seems to be running, exiting." && exit;
fi

## Get the necessary dates
weekly_backup_date=$(stat -c %Y $weekly/backup_finished.txt)
monthly_backup_date=$(stat -c %Y $monthly/backup_finished.txt)
now=$(date +%s)
monthly_backup_age=$((now - monthly_backup_date))
weekly_backup_age=$((now - weekly_backup_date))

## Check the age of the daily backup and copy it accordingly
 if [[ "$monthly_backup_age" -gt "$month" ]]; then

    ## Copy unless the current $daily is identical to $weekly
    diff $daily $weekly > /dev/null ||
    ## Delete the previous backup and copy the new one over
    rm -rf $monthly && cp -rp $daily $monthly
fi
## Copy the weekly backup if it is older than a week but only
## if it is not identical to $monthly. The -r flag makes cp 
## recursive and the -p flag makes it preserve dates and permissions. 
if [[ "$weekly_backup_age" -gt "$week" ]]; then
    ## Copy unless the current $daily is identical to $monthly
    diff $daily $monthly > /dev/null ||
    rm -rf $weekly && cp -rp $daily $weekly
fi

Таким образом, этот скрипт (check_backup.sh) будет запускаться каждый час на вашем сервере резервного копирования. Поскольку он ничего не делает, если резервная копия не достаточно старая, запускать ее так часто не составит труда. Теперь каждый раз, когда ежедневная резервная копия старше 31 дня, она будет копироваться в monthly каталог, а содержимое monthly будет удаляться. Точно так же для еженедельного, когда резервное копирование более 7 дней.

Я использую diff для сравнения резервных копий. Это означает, что мы будем копировать daily в weekly если текущему weekly больше недели, но только если резервная копия, которая будет скопирована (текущая daily), не совпадает с существующей weekly и аналогично для monthly . Например, если скрипт только что запустился и увидел, что ежемесячное резервное копирование совпадает с текущим еженедельным, оно не будет перезаписывать существующее monthly . Однако через неделю, когда weekly изменится, он будет копировать monthly .

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

1

Это более длинный комментарий, добавляющий к тому, что уже указали другие.

Во-первых, используйте жесткие ссылки и инкрементные резервные копии с rsync, чтобы значительно сократить объем фактического используемого дискового пространства: каждая дополнительная резервная копия будет занимать только размер файлов, которые отличаются. Если вы создаете резервные копии больших образов виртуальных машин, я бы посоветовал не создавать резервные копии файлов образов, а фактически содержимого их файловых систем (как уже прокомментировал @Michael). Такой инструмент, как rsnapshot, должен работать нормально, хотя (по опыту) достаточно легко создать собственный скрипт.

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

1

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

Рассмотрим следующую ситуацию: все файлы *.tar.gz в текущем рабочем каталоге являются ежедневными снимками чего-либо. Теперь задача состоит в том, чтобы принять один снимок для каждого из последних 20 дней, один для каждого за последние 8 недель и один для каждого из последних 12 месяцев, и переместить все остальные в каталог, который больше не notneededanymore . Используя временные промежутки, это простая задача:

$ mkdir notneededanymore
$ timegaps --move notneededanymore days20,weeks8,months12 *.tar.gz

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