Одна з моїх улюблених тем – це створення систем резервного копіювання. Так уже склалося, що я щиро вірю, що за правильно налаштованого бекапу життя сисадміна набагато спрощується. 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 можна поставити крапку. У мене ця система працює досить довго, і незручностей з її використанням я не відчував.
