Crmgo Блог

Бекапы файлов rdiff-backup

Бекапы файлов rdiff-backup

Одна из моих любимых тем – это создание систем резервного копирования. Так уж сложилось, что я искренне верю, что при правильно настроенном бекапе, жизнь сисадмина намного упрощается. rdiff-backup – система позволяющая сохранять изменения и получить состояние любого сохраненного файла на…

Бекапы файлов rdiff-backup

Одна из моих любимых тем – это создание систем резервного копирования. Так уж сложилось, что я искренне верю, что при правильно настроенном бекапе, жизнь сисадмина намного упрощается. rdiff-backup – система позволяющая сохранять изменения и получить состояние любого сохраненного файла на любое время в которое делался бекап. Из самого названия rdiff-backup видно, что система эта построена на по принципам rdiff. А сам rdiff-backup сохраняет историю изменений, так что бы можно было откатится на любой момент. Ну и основное достоинство – это то что rdiff-backup позволяет бекапиться на удаленный сервер.
В общем rdiff-backup достаточно простая система, нет никаких заумностей и в то же время функциональна.
Строить будем систему удаленного бекапа, а именно server1 будем бекапить на server2.

Начнем с установки rdiff-backup

yum install rdiff-backup (нужен реп epel), либо можно взять rpm c pkgs.org

зависимости:

Installed:
rdiff-backup.x86_64 0:1.2.8-5.el6

Dependency Installed:
librsync.x86_64 0:0.9.7-15.el6          pylibacl.x86_64 0:0.5.0-1.el6
pyxattr.x86_64 0:0.5.0-1.el6

 

Сборка идет без лишних вопросов. И еще один нюанс – rdiff-backup, если вы будете бекапится на удаленный сервер, то и на том удаленном сервере тоже нужно его установить.
Следующий этап в построении системы резервного копирования – это мы заведем специального пользователя от которого будет происходить вся система резерного копирования. Этому пользователю совсем не нужно авторизоваться по паролю. Поэтому на вопрос adduser Use password-based authentication? [yes]: отвечаем no
В общем диалог добавления выглядит так:

adduser backup

Пользователя надо добавить на обоих серверах. Идентично.
Следующий этап. Поскольку rdiff-backup работает через ssh, то сгенерируем ключи авторизации.
О том как генерировать ключи ssh для безпарольной авторизации я писал в статье SSH, безпарольный доступ, но для наглядности пройдем этот этап полноценно.
На сервере server1, на том который будем бекапить сгенерируем ключи.
Сначала супнемся на пользователя backup:

su backup

И выполним ssh-keygen:

ssh-keygen

Теперь выйдем из su, нажав CTRL-D.
И публичный ключ скопируем на сервер server2:

scp /home/backup/.ssh/id_rsa.pub hilik@server2.hilik.org.ua:

И теперь на сервер server2 скопируем или добавим, если это не первый ключ, публичный ключ в /home/backup/.ssh/authorized_keys:

cat ~/id_rsa.pub >> /home/backup/.ssh/authorized_keys

Теперь остался последний этап, настройка самого бекапа. В первую очередь на удаленном сервере (server2) подготовим директорию для бекапов:

mkdir /storage/backup

Для бекапа я использую скрипт /root/bin/rdiff-backup.sh, который и rdiffает все на бекап сервер. Выглядит он так:

#!/bin/sh
#Определяем имя сервера который бекапим, нужно для создания иерархии в бекап директории на удаленном сервере
HOST_NAME=`/bin/hostname -s`
#Адрес сервера на который будем бекапить
REMOTE_HOST='server2'
#Пользователь от имени которого будем бекапить
USER='backup'
#Директория на удаленном сервере в которой создаются бекапы
PREFIX='/storage/backup'
#Директории которые необходимо бекапить
WHAT='/etc /usr/local/etc /root /var/cron /sys/i386/conf /usr/local/www'
#Главный цикл бекапа
for i in $WHAT
do
        `/usr/local/bin/rdiff-backup --remote-schema 'ssh -i /home/$USER/.ssh/id_rsa -C %s rdiff-backup --server' --create-full-path --exclude-device-files --exclude-fifos --exclude-sockets --exclude-symbolic-links -b $i $USER@$REMOTE_HOST::/$PREFIX/$HOST_NAME$i`
        echo "/usr/local/bin/rdiff-backup --remote-schema 'ssh -i /home/$USER/.ssh/id_rsa -C %s rdiff-backup --server' --create-full-path --exclude-device-files --exclude-fifos --exclude-sockets --exclude-symbolic-links -b $i $USER@$REMOTE_HOST::/$PREFIX/$HOST_NAME$i"
done

Теперь остается поставить этот скрипт на крон. Использовать его надо от рута:

0 1 * * * /root/bin/rdiff-backup.sh

На этом стадия бекапа закончилась. Бекапы будут на удаленном сервере сохраняться в той директории к которой вы указали их сохранять, в этой директории создастся поддиректория по имени сервера и там уже будет размещен бекап. Там находятся файлы с текущим состаянием, с состоянием на последний момент бекапа и журналы изменений.
Для добавления новых сервров нужно просто создать пользователя, сгенерировать ключи и разместить скрипт.

Теперь к вопросу восстановления. Если нужно получить файлы на последнее состояние, то можно просто скопировать из бекапа. Если же нужно восстановить на определенный момент, нужно воспользоваться rdiff-backup, но в режиме восстановления.
К примеру восстановим /etc сервера server1 в директорию /home/hilik/restore/etc.old по состоянию на 5 дней назад.

rdiff-backup --remote-schema 'ssh -i /home/backup/.ssh/id_rsa -C %s rdiff-backup --server' -r 5D backup@server2::/usr/local/share/backup/server1/etc /home/hilik/restore/etc.old

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

Примечание: материал мог быть создан с помощью ИИ и затем отредактирован человеком. Ответственный: Dmytro Lomaka, Kaltenkirchen.