Янв 28 2010

Бекап система rdiff-backup.

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

Начнем с установки rdiff-backup. Ставить будем из портов:

cd /usr/ports/sysutils/rdiff-backup/
make install clean

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

adduser
Username: backup
Full name: Backup System user
Uid (Leave empty for default): 
Login group [backup]: 
Login group is backup. Invite backup into other groups? []: 
Login class [default]: 
Shell (sh csh tcsh bash rbash nologin) [sh]: 
Home directory [/home/backup]: 
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: no
Lock out the account after creation? [no]: 
Username   : backup
Password   : <disabled>
Full Name  : Backup System user
Uid        : 1022
Class      : 
Groups     : backup 
Home       : /home/backup
Home Mode  : 
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (backup) to the user database.
Add another user? (yes/no): no
Goodbye!

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

su backup

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

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/backup/.ssh/id_rsa): 
Created directory '/home/backup/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/backup/.ssh/id_rsa.
Your public key has been saved in /home/backup/.ssh/id_rsa.pub.
The key fingerprint is:
3e:9b:02:52:a4:42:0b:76:49:78:e7:c8:e0:35:2d:7f backup@server1.hilik.org.ua
The key's randomart image is:
+--[ RSA 2048]----+
|    o=o. .       |
|   .o.* = .      |
|   . = B +       |
|    . = o . E    |
|     o  S  .     |
|    . ..         |
|     . .o        |
|        .o.      |
|        .o       |
+-----------------+

Теперь выйдем из 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 можно поставить точку. У меня эта система работает довольно долго и неудобств с ее использованием я не ощущал.

Добавить в закладки:

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Украинская Баннерная Сеть