Rsnapshot

Обновлено 29 апреля 2019

Введение

Rsnapshot - утилита для резервного копирования, написанная на языке Perl и использующая Rsync. Она упрощает создание периодических копий файловых систем. Для дедупликации данных Rsnapshot использует жёсткие ссылки. Резервное копирование - необходимая задача системного администрирования, так как всегда есть риск потери данных: выход из строя жёсткого диска, случайное удаление данные, вредоносное программное обеспечение, сбой файловой системы.

Rsnapshot позволяет делать несколько уровней копий (alpha, beta, gamma и т.д.), позволяя присвоить им любые имена, а также производит ротацию резервных копий, удаляя устаревшие. В руководстве используется 6 alpha, 7 beta и 4 gamma копии.

Для подготовки резервной копии используется команда rsnapshot sync, при выполнении которой все указанные данные помещаются в директорию .sync в пути хранения резервных копий.

Для того, что зафиксировать резервную копию, поместив её на уровень alpha, используется команда rsnapshot alpha. При первом запуске каталог .sync будет переименован в alpha.0. При втором запуске alpha.0 будет переименована в alpha.1, а текущая копия будет снова сохранена в alpha.0. Таким образом, в alpha.0 всегда будет находиться самая свежая копия. При последующих созданиях резервных копий они также будет переименовываться и накапливаться, пока их количество не достигнет шести - в этом случае копия alpha.5 будет удалена, и её место займёт alpha.4.

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

              +---------------------------+
              |           .sync           |
              +---------------------------+
                            |
                -------------
                |
                ∇          -->
              +---+---+---+---+---+---+---+
alpha-уровень | 0 | 1 | 2 | 3 | 4 | 5 | - |
              +---+---+---+---+---+---+---+
                                    |
                ---------------------
                |
                ∇            -->
              +---+---+---+---+---+---+---+---+
beta-уровень  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | - |
              +---+---+---+---+---+---+---+---+
                                        |
                -------------------------
                |
                ∇      -->
              +---+---+---+---+---+
gamma-уровень | 0 | 1 | 2 | 3 | - |
              +---+---+---+---+---+

Копия уровня beta создаётся из самой старой копии уровня alpha (alpha.5), при помощи команды rsnapshot beta.

Иными словами, alpha.0 получается из файловой системы, alpha.1 из alpha.0, beta.0 из последней alpla (alpha.5), beta.1 из beta.0, gamma.0 из последней beta (beta.6).

Важно

Если на момент выполнения rsnapshot beta копии alpha.5 ещё не существует, но есть alpha.4, копия beta.0 сделана не будет. При этом ротация остальных копий beta будет проведена. Поэтому не следует запускать следующие уровни чаще предыдущих.

Установка

Установите программу, выполнив:

emerge -a app-backup/rsnapshot

Настройка

Выполните базовые настройки, изменив при необходимости путь хранения резервных копий, количество и уровни резервных копий:

/etc/rsnapshot.conf

# путь в локальной файловой системе, где будут храниться резервные копии
snapshot_root   /var/calculate/snapshots

# уровни и количество снимков резервных копий:
retain  alpha   6
retain  beta    7
retain  gamma   4

Важно

Обратите внимание, что разделителем полей является символ табуляции, а не пробел!

Сверьте список список путей, исключаемых из резервной копии:

/etc/rsnapshot.d/rsnapshot.filter
- /dev/*
- /lost+found
- /tmp/*
- /usr/portage/*
- /var/lib/layman/*
- /lxc/*/snaps
- /lxc/*/rootfs/dev/*
- /lxc/*/rootfs/tmp/*
- /lxc/*/rootfs/usr/portage/*
- /lxc/*/rootfs/var/lib/layman/*
- /lxc/*/rootfs/var/log/*
- /lxc/**/calculate/packages
- /lxc/**/remote/distfiles
- /packages
- /remote/distfiles
- /snapshots/*
- /var/calculate/snapshots/*

Резервное копирование в пределах одной машины

Настройка путей

В примере ниже описаны пути резервного копирования (корень файлововой системы и /var/calculate) для текущей машины, используя параметр backup:

/etc/rsnapshot.d/localhost.conf

backup  /               localhost/rootfs/
backup  /var/calculate  localhost/calculate

Теперь в директории хранения будет созданы пути localhost/rootfs и localhost/calculate для хранения корня файловой системы и директории /var/calculate соответственно.

Создание резервной копии

Для подготовки данных для резервной копии выполните:

rsnapshot sync

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

rsnapshot alpha

Последующее выполнение rsnaphost sync подготовит новую резервную копию. После чего вызов rsnapshot alpha выполнит ротацию и переместит синхронизированные данные на уровень alpha0.

Когда количество alpha-снимков заполнит весь уровень, появится возможность не удалять самый старый снимок, а перевести его на уровень beta. Для этого перед запуском rsnapshot alpha выполните rsnapshot beta.

              +---+---+---+---+---+---+
alpha-уровень | 0 | 1 | 2 | 3 | 4 | 5 |
              +---+---+---+---+---+---+
                        alpha.6     |
                ---------------------
                |
                ∇
              +---+---+---+---+---+---+---+---+
beta-уровень  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | - |
              +---+---+---+---+---+---+---+---+

Выполнение этих команд в обратном порядке приведёт к тому, что сначала будет удалена последняя копия alpha, затем будет сформирован alpha-уровень из 6 элементов, а после этого последний элемент будет переведён на уровень beta, что уменьшит очередь alpha на 1.

              +---+---+---+---+---+---+ +---+
alpha-уровень | 0 | 1 | 2 | 3 | 4 |   | | 6 |
              +---+---+---+---+---+---+ +---+
                        alpha.5     |
                ---------------------
                |
                ∇
              +---+---+---+---+---+---+---+---+
beta-уровень  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | - |
              +---+---+---+---+---+---+---+---+

Настройка выполнения резервных копий по расписанию

Добавьте в cron ежедневную подготовку резервной копии .sync. Синхронизация может быть долгой, поэтому запланируйте достаточное время для её выполнения (12 часов). Добавьте ежедневное создание копий alpha, beta каждую субботу и gamma первого числа каждого месяца.

Важно

Прежде чем создавать копию alpha, следует создать beta, а перед beta должна быть создана gamma.

Так как удаление устаревшей копии может занять продолжительное время, между выполнениями ротаций необходимо добавить паузу (1 час).

/etc/cron.d/rsnapshot

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/

# run rsnapshot
0 0 * * *   root    /usr/bin/rsnapshot sync &>/dev/null
0 10 1 * *  root    /usr/bin/rsnapshot gamma &>/dev/null
0 11 * * 6  root    /usr/bin/rsnapshot beta &>/dev/null
0 12 * * *  root    /usr/bin/rsnapshot alpha &>/dev/null

Настройка резервной копии для удалённого узла

Настройка backup-сервера

Для обеспечения беспарольного доступа к удалённой машине на бэкап-сервере сформируйте ssh-ключ:

ssh-keygen -b 4096 -f /root/.ssh/backup.key

Добавьте ключ, который будет использоваться для всех клиентов:

/etc/rsnapshot.conf

rsync_long_args     --delete --numeric-ids --delete-excluded --rsh="ssh -i /root/.ssh/backup.key

Укажите ресурсы, для которых будет создаваться резервная копия:

/etc/rsnapshot.d/example.conf

backup  example.org::rootfs     example/rootfs/
backup  example.org::calculate  example/calculate/

где:

  • example.org - сетевое имя машины
  • rootfs, calculate - название ресурсов, которые будут описаны в конфигурационном файле rsyncd-клиента

Настройка клиента

На удалённой машине, с которой будет делаться резервная копия, создайте файл с описанием синхронизируемых каталогов, присвоив им имена ресурсов (rootfs и calculate):

/etc/rsyncd-backup.conf

uid = root
gid = root
read only = true

[rootfs]
    path = /

[calculate]
    path = /var/calculate

Перенесите на удалённую машину сформированный ранее открытый ключ сервера, добавив в начало строки запуск демона rsync:

command="rsync --config=/etc/rsyncd-backup.conf --server --daemon .",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding

В итоге должен получиться примерно такой файл:

/root/.ssh/authorized_keys

command="rsync --config=/etc/rsyncd-backup.conf --server --daemon .",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCohMEmkUVd72YI+gRXyCSL2YWQGg3tmy1SiKJ4i3enTpVf7oY+SDSk/WDJUkBisOh1VGWbtylCqez6K4/rkIxtQmog/L6KmnVEv/MKPXCfRb0SletaLLRhoLB9yjPJltzS+q/983yBIJKYO9jBJQbDYYdqPIuGidQ6xjX+OuJoCL/akKoaQxBm+92k+hp9Yi7RxGX12Y0WMD6XCZEZcktjGX/FyzIaRV9Ikt+0uHRZBo9lwEtEWEXY3coYauBr9A9XbtXPy4sGDXJsePKi7lxGi880IVgZgABMgPo9B8hVPVBplvKa5tUaj5C7s+lrZ0VI3Nr7i3c4cVwSnOcFlg9Z root@backup

Разделение узлов по разным хранилищам резервных копий

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

Создайте файл настройки rsnapshot для локальных машин:

/etc/rsnapshot.local.conf

include_conf    `/bin/cat /etc/rsnapshot.conf`
snapshot_root   /var/calculate/snapshots/local
lockfile        /var/run/rsnapshot.local.pid
include_conf    `/bin/cat /etc/rsnapshot.d/local.*.zone`
include_conf    `/bin/cat /etc/rsnapshot.d/localhost.zone`

Важно

Обратите внимание, что разделителем полей является символ табуляции, а не пробел!

Эти настройки использют общие, описанные в /etc/rsnapshot.conf, и заменяют значения для файла блокировки и корня резервных копий. Из /etc/rsnapshot.d будут взяты все zone-файлы начинающиеся на local и localhost.zone.

Создайте файл настройки rsnapshot для удалённых машин:

/etc/rsnapshot.remote.conf

include_conf    `/bin/cat /etc/rsnapshot.conf`
snapshot_root   /var/calculate/snapshots/remote
lockfile        /var/run/rsnapshot.remote.pid
include_conf    `/bin/cat /etc/rsnapshot.d/remote.*.zone`

В отличие от предыдущего файла настроек для резервных копий берутся только zone-файлы, начинающиеся на remote.

Резервные копии для локальных машин будут размещаться в /var/calculate/snapshots/local, для удалённых - в /var/calculate/snapshots/remote

Укажите ресурсы, для которых будет создаваться резервная копия:

/etc/rsnapshot.conf.d/local.example.org.zone

backup  example.org::rootfs     example.org/rootfs/
backup  example.org::calculate  example.org/calculate/

/etc/rsnapshot.conf.d/remote.example.org.zone

backup  remote.example.org::rootfs      remote.example.org/rootfs/
backup  remote.example.org::calculate   remote.example.org/calculate/