Резервное копирование с ротацией (rsync rotation-backup)Подписка на Комментарии к "Резервное копирование с ротацией (rsync rotation-backup)"

Аватар zenon

Теперь как это работает:
Допустим нам необходимо делать резервирование 2 раза в день, 7 раз в неделю.
Для создания копий два раза в день запускаем дважды в день наш скрипт с параметрами:

$ make_snapshot daily 2

При первом запуске буде создан каталог latest (самая свежая копия (latest - ссылка на самый свежий снапшот)) и daily.0.
При следующих запусках пойдет ротация (смещение на 1) каталогов в последовательности:
latest => daily.0 => daily.1

Ну и план на неделю - запуск раз в сутки.
$ make_snapshot weekly 7
latest => weekly.0 => ... => daily.6

weekly/daily - названия выбраны для удобства, можно использовать любые.
В скрипте необходимо изменить две переменные:
SOURCE=/var/www/my.syte.com  # Каталог с которого делаем копию.
SNAPSHOT=/home/backup        # Каталог для копий.

Теперь сам скрипт:

#!/bin/bash
#  newzenon ..... http://zenon.sytes.net/
#  по мотивам http://www.mikerubel.org/computers/rsync_snapshots/
#  
#  Скрипт делает резервные копии $SOURCE и их ротацию в директории $SNAPSHOT
#  Скрипт должен запускатся с двумя параметрами, название копии и количество
#  копий для сохранений.
#  
#     Запуск скрипта:
#     /usr/local/sbin/make_snapshot  < каталог> n
#          где
#          < каталог> - произвольное название каталога.
#          n          - чило копий для ротаций.
#
#  Пример:
#  Запуск для недельных ротаций:
#  make_snapshot weekly 7 (запускать раз в день из crontab)
#  0 0 * * 0 /usr/local/sbin/make_snapshot weekly 4
#
#  Запуск для ежедневных ротаций:
#  make_snapshot daily 7 (запускать 2 раза в день из crontab)
#  0 0 * * 1-2 /usr/local/sbin/make_snapshot daily 2
#
#  Итогом будет создание копий за семь дней:
#
#     Каталог для резервирования/ротаций: $SNAPSHOT
#     итого 40
#     drwxr-xr-x 10 root root 4096 Сен  8 15:42 .
#     drwxr-xr-x  5 root root 4096 Сен  8 15:32 ..
#     dr-xr-xr-x  3 root root 4096 Сен  8 15:48 daily.0
#     dr-xr-xr-x  3 root root 4096 Сен  8 15:48 daily.1
#     dr-xr-xr-x  3 root root 4096 Сен  8 15:42 latest
#     dr-xr-xr-x  3 root root 4096 Сен  8 15:42 weekly.0
#     dr-xr-xr-x  3 root root 4096 Сен  8 15:42 weekly.1
#     dr-xr-xr-x  3 root root 4096 Сен  8 15:42 weekly.2
#     dr-xr-xr-x  3 root root 4096 Сен  8 15:42 weekly.3
#     dr-xr-xr-x  3 root root 4096 Сен  8 15:41 weekly.4
#     dr-xr-xr-x  3 root root 4096 Сен  8 15:41 weekly.5
#     dr-xr-xr-x  3 root root 4096 Сен  8 15:41 weekly.6

SOURCE=/var/www/my.syte.com  # Каталог с которого делаем копию.
SNAPSHOT=/home/backup        # Каталог для копий.

error() {
   echo "$0: $@" 1>&2
   exit 1
}

# Убеждаемся что запуск произведен от суперпользователя.
if [ `id -u` != 0 ]; then error "You must be root to use this script"; fi

# Проверяем что запуск произведен с параметрами в коммандной строке.
if [ "$1" = "" -o "$2" = "" ]; then
   echo "usage: $0 <snapshot type> <max snapshots>"
   exit 1
fi

type=$1
(( max = $2 - 1 ))

# Удаляем самый старый  snapshot в фоновом режиме.
if [ -d $SNAPSHOT/${type}.${max} ]; then
   mv $SNAPSHOT/${type}.${max} $SNAPSHOT/delete
   nice /bin/rm -rf $SNAPSHOT/delete &
fi

# RSYNC. $SOURCE ==>> $SNAPSHOT/latest
echo "------------------------------------------------"
time rsync -pa --delete $SOURCE $SNAPSHOT/latest

# Делаем snapshot доступным только для чтения.
chmod a-w $SNAPSHOT/latest

# Ротация (сдвиг)  копий на однц позицию. Если они есть.
while [ $max -ge 1 ]; do
   (( newer = max - 1 ))
   if [ -d $SNAPSHOT/${type}.${newer} ]; then
      mv $SNAPSHOT/${type}.${newer} $SNAPSHOT/${type}.${max}
   fi
   (( max = newer ))
done

# Обновляем время доступа mtime для ${type}.0
mv $SNAPSHOT/latest $SNAPSHOT/${type}.0
touch $SNAPSHOT/${type}.0

# Make a hard-link-only (except for dirs) copy of the
# latest snapshot to prepare for next snapshot.
nice cp -al $SNAPSHOT/${type}.0 $SNAPSHOT/latest

# Ждем окончания выполнения rm если ещё работает.
wait

# Вывод информации.
echo "------------------------------------------------"
echo "Резервируемый каталог: $SOURCE"
echo "------------------------------------------------"
echo "Каталог для резервирования/ротаций: $SNAPSHOT"
echo "ls -la $SNAPSHOT"
ls -la $SNAPSHOT
echo "------------------------------------------------"
echo Закончено: `date`

Теперь о том как всё организовать.
Копируем наш скрипт в /usr/local/bin/make_snapshot и делаем его исполняемым.
$ chmod a+x /usr/local/bin/make_snapshot

Или одной строчкой с моего сайта:
$ cd /usr/local/bin && wget -Nc zenon.sytes.net/share/make_snapshot && chmod a+x make_snapshot

Сразу же отредактируйте $SOURCE и $SNAPSHOT, каталог $SNAPSHOT должен существовать.
$ nano /usr/local/bin/make_snapshot

........
Теперь осталось добавить наш скрипт в cron.
Про это напишу тут же, но чуть позже.
Можно просто почитать: LXF95:Cron, Осваиваем Cron.
........
........
........
Также необходимо затронуть важные моменты про RSYNC.
  • 1.
  • Если копируемая директория заканчивается слэшем, то файлы будут скопированы в каталог назначения относительно корня изначально заданной директории.
    Пример:

    $ rsync -a /dir1/dir2 /dir3  # будет создана иерархия /dir3/dir2/файлы
    $ rsync -a /dir1/dir2/ /dir3 # будет создана иерархия /dir3/файлы
  • 2.
  • При транзитном переносе файлов через дополнительную машину не нужно забывать, что опция "-a" подразумевает трансляцию имен пользователей и групп в локальные uid/gid, т.е. скопировав данные с первой машины на вторую, а потом со второй на локально подключенный жесткий диск, предназначенный для третьей машины, получим на третьей машины совершенно иных владельцев каталогов и файлов. Не тех которые были в /etc/password первой машины, а тех, которые в данным момент в /etc/password второй машины (изменятся типовые пользователи,
    например, web, ftp, dhcp, номера uid/gid которых отличаются на двух машинах). Чтобы этого не произошло нужно испольщовать опцию "--numeric-ids".

  • 3.
  • Особенности задания файлов исключений ("--exclude-from=файл" или " --exclude маска1 --exclude маска2"). Для того чтобы исключить из бэкапа содержимое директории, но саму директорию оставить, нужно указать в "exclude" файле "/dir/*", а не "/dir/" (под "/dir" подпадет и /dir123, и файл /dir.txt, для директорий указание "/" в конце обязательно). Звездочка ("*") в шаблоне действует только на имя файла/каталога, чтобы маской охватывалась часть пусти, включая "/", нужно писать "**". Шаблон не начинающийся с '/' проверяется с конца строки. Например "/dir/test" будет проверен c начала пути, а "dir/test.txt" или "*.log" с конца. Если необходимо исключить все поддиректории в /dir, кроме /dir/best, в список исключений нужно поместить:

    + /dir/best/
    - /dir/*

    При переборе содержимого "exclude" файла, срабатывает первое правило под которое подпадает текущий путь, не важно исключающие или нет. В качестве корня выступает директория назначения, т.е. "/" в "exclude" файле = "/dir3/dir2" или "/dir3" из первого совета.
  • 4.
  • Запрещение двойного сжатия при передаче данных по SSH. rsync при задании опции "-z" более оптимально сжимает передаваемые данные, поэтому сжатие средствами ssh можно отключить:

    export RSYNC_RSH="ssh -c arcfour -o Compression=no -x"
    rsync -a -z -v --bwlimit=16 /dir1 /dir2 user@test.ru:/dir3/

    где, --bwlimit=16 ограничивает пропускную способность при копировании бэкапа в 16 Кбайт в сек.
  • 5.
  • Изменение уровня точности при сравнении локального и удаленного времени модификации файлов. Например, для того чтобы считать идентичными файлы время модификации которых отличается на 1 секунду необходимо указать:

    "--modify-window=1"
  • 6.
  • Пример сохранения истории изменения данных. При этом старые измененные или удаленные файлы не теряются а перемещаются в директорию /snapshot/дата.

    #!/bin/sh
    snapshot_dir="/snapshot/`date \+\%Y_\%m_\%d`"
    mkdir $snapshot_dir
    rsync -a -v --delete --max-delete=1000 --hard-links \
         --delete-excluded --exclude-from=/etc/rsync_backup.exclude \
         --backup --backup-dir=$snapshot_dir \
         / /backup
    RETCODE=$?
    if [ $RETCODE -ne 0 ]; then
       echo "Err code=$RETCODE"| mail -s "FATAL RSYNC BACKUP" admin@test.ru
    fi
    echo RET: $RETCODE
    /bin/chmod 0700 /backup
    /bin/chmod 0700 /snapshot
  • 7.
  • Некоторые полезные опции.

    -v ................ verbose, выводит имена обрабатываемых файлов;
    -a ................ работа в режиме архивирования, сохраняются права доступа и информация
                        о владельцах;
    -H ................ сохранять жесткие ссылки, оставляя их на другом конце бэкапа;
    -x ................ не выходить за пределы текущей точки монтирования;
    --progress ........ показывать сколько процентов осталось до завершения и скорость передачи;
    --delete .......... удалять из бэкапа файлы, которых уже нет на стороне источника.
    --delete .......... отличается от --delete-after тем, что удаление производится вначале, а не
                        на завершающей стадии процесса бэкапа. --delete-after работает быстрее, так
                        как не требует лишней стадии обхода списка файлов, но требует использования
                        опции --force для обработки таких ситуаций как удаление файла и появление
                        директории с тем же именем;
    --delete-excluded . удалять части которые уже есть на стороне бэкапа, но появились в
                        списке исключения;
    -n ................ режим тестирования, реально никаких действий по копированию не производится,
                        только эмуляция;
    -c ................ использование сверки по контрольным суммам, а не по времени изменения
                        и размеру;
    --compare-dest=DIR  сохранять новые и измененные файлы в отдельной директории, не трогая на время
                        копирования основную директорию назначения, в конце - разом, путем
                        переименования, обновить содержимое бэкапа;
    --link-dest=DIR ... использовать жесткие ссылки на файлы в DIR, например, для создания
                        подобия снапшотов;
    --ignore-errors ... продолжать копирование и удаление после появления ошибок;
    --max-delete ...... ограничение максимально числа удаляемых за один раз файлов и каталогов;
    -A ................ сохранять не только права доступа, но и ACL;
    --files-from=FILE . задать список директорий и файлов для бэкапа в файле;
    Похожие материалы:
    Аватар Евгений

    Моглибы уточнить почему так что за особые настройки в кронтаб
    0 0 * * 1-2 на сколько я понял что запускать в понедельник и вторник.
    daily ежедневно
    Что дает цифра два и что почему в совокупности это 0 0 * * 1-2 /usr/local/sbin/make_snapshot daily 2 дает запускать 2 раза в день из crontab
    Ничего не понял. Спасибо!
    где можно узнать подробности о

    Добавить комментарий