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
Важно
Обратите внимание, что разделителем полей является символ табуляции, а не пробел!
Сверьте список список путей, исключаемых из резервной копии:
- /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/