Категорії
FreeBSD Linux

rsync: бэкап и восстановление

Обновлена 7.06.2012.

Здесь используется клиент-серверный подход. Суть такова: есть много серверов (в качестве этого термина используется именно серверная часть rsync) и один клиент, который время от времени производит синхронизацию. В данный момент у меня совместно используется rsync FreeBSD,Gentoo linux. Ставим rsync (иначе будет ругаться, что не найден rsync) на обе системы:

FreeBSD

#cd /usr/ports/net/rsync && make install clean

Gentoo

#emerge rsync

После установки, открываем конфигурационные файлы. Настройки, что у FreeBSD, что у Gentoo – одинаковые, поэтому далее разделятся не буду. Будет просто конфиг сервера.

#cat > rsyncd.conf

pid file = /var/run/rsyncd.pid
max connections = 4
syslog facility = local5  # для логгирования через syslogd
use chroot = yes
read only = yes
log file = /var/log/rsyncd.log # для альтернативного логгирования
# Здесь указываем, что бэкапить. В принципы, можно не
#описывать здесь, если использовать rsync+ssh.
path = /share/folder
uid = root
gid = wheel
read only = yes   # нужно на всякий случай, что бы случайно ничего не затереть.
#Кстати, если нужно будет восстанавливать из бэкапа, то нужно будет сменить на no
list = yes
comment = root directory
hosts allow = 10.0.0.0/16 # каким хостам/сетям разрешено подключаться
auth users = username   # логин юзера, от которого будет делатся бэкап и восстановление. Его пароль находится в файле, определённом в параметре secrets file
secrets file = /usr/local/etc/rsyncd.scrt  # файл с логином паролем для доступа

#cat > /usr/local/etc/rsyncd.scrt

username:password

Теперь добавляем строку в /etc/rc.conf для запуска сервера

rsyncd_enable="YES"

В качестве клиента выступает rsync. В качестве создания бэкапа – самописные скрипты. По сути, это команда rsync с некоторыми параметрами, но учитывая, что всё вмещается в 3-4 строки, и запихивать всё это дело в /etc/crontab не сильно удобно, кинул это всё дело в файл и получился скрипт. Собственно, вот он:

Операция бэкапа

#!/bin/sh
# берем текущую дату
DATE=`/bin/date +"%Y-%m-%d"`
# указываем машину и директорию для копирования. в данном случае - это ВСЯ удаленная машина.
SOURCE="root@10.10.10.1:/"
# прописываем пути всем используемым командам
RSYNC="/usr/bin/rsync"
TOUCH="/bin/touch"
CP="/bin/cp"
FIND="/usr/bin/find"
RM="/bin/rm"
XARGS="/usr/bin/xargs"
# заходим в нашу директорию
cd /data/backup/server
# копируем все содержание current в директорию с текущей датой используя ЖЕСТКИЕ ЛИНКИ
# для уменьшения используемого места на диске
#$CP -al current $DATE
# синхронизируем директорию current с сервером, удаляем данные в current,
# которые на удаленном сервере больше не присутствуют.
# пропускаем все служебные директории и другие, которые не нужно копировать
echo "Started update at" `date` >> /var/log/rsync-query.sh.log 2>&1
logger -t rsync "re-rsyncing the server tree"
$RSYNC -azqe ssh --exclude '/proc' --exclude '/dev' --exclude '/tmp' --exclude 'lost+found' --exclude '/mnt' --exclude '/sys' --exclude '/compact' --delete --progress $SOURCE current/
echo "End: "`date` >> /var/log/rsync-query.sh.log 2>&1
# удаляем все резервные копии старше года
#$TOUCH current
#$FIND . -maxdepth 1 -type d -ctime +366 -print0 | $XARGS --null --no-run-if-empty $RM -fr

Обратим внимание на ключ ssh. Вспомните, что выше я говорил, что шару можно не описывать. Так вот, если этот ключ есть, то в конфиге можно не описывать никакие шары. Если его нет – то нужно описывать, какие именно шары разрешены на бэкап. Ещё отличие, это то, что траффик через ssh будет шифроваться. Поэтому, если у вас очень узкий канал, и канал этот более-менее защищён, то можно и не использовать ssh.

Операция восстановления

Данная операция является обратной, к предыдущей. Собственно вот команда для восстановления:

#rsync -azvogt --update --recursive --bwlimit=1000 --exclude=/share username@10.10.10.10::parm1 /parm2/

где, username – имя юзера, которое описано в /usr/local/etc/rsyncd.scrt на сервере, с которого будем восстанавливаться, parm1 – если описывали шары в /usr/local/etc/rsyncd.conf – то это именно она, parm2 – кореневая папка пути для восстановления.

Так же можно ограничивать скорость, что бы не грузить канал, так называемый “verbose mode” я включаю, что бы наблюдать, за процессом.

Теперь поговорим, если нужно восстановить полностью систему. Для этих целей понадобится либо liveCD, либо машина с установленной FreeBSD. С первым у меня не сложилось, поэтому я выбрал второй. Была у меня рабочая машинка. Что бы не гробить установленную на ней ОС, решил подключить воторой неразбитый винт. Занрузился, разбил новый винт на разделы. Здесь главное разбить так, что бы места на разделах хватало. Неважна даже последовательность разделов и вообще, можно всё в один раздел сделать. 🙂 . Кстати, не забудьте про swap-раздел. И ещё одно кстати, на восстановливаемой машине должен быть установлен и настроен rsyncd (сервер).

Далее создал папку /back_srv и точки монтирования для других разделов: /back_srv/var, /back_srv/usr, /back_srv/tmp, /back_srv/share.

Теперь можно запускать rsync для восстановления:

#rsync -azvogt --update --recursive --bwlimit=1000 --exclude=/share username@10.10.10.10::my_server /back_srv/

в параметре my_server – описывается параметр, который указывае местоположение кореневой директории, описаном на сервере, где хранится бэкап. (в моём случае, это было так):

(выдержки из конфига rsyncd на бэкапном серваке)

path = /share/backup/server_1
uid = root
gid = wheel
read only = yes
list = yes
comment = root directory
hosts allow = 10.0.0.0/16
auth users = username

После этого идём гуляем и ждём. У меня лично восстановления 30 Гб происходило около 20 часов на скорости 500Кб\с.

После завершения не забываем подредактировать /etc/fstab в соотвествие к новому железу, а так же другие конфиги, где используется аппаратная привязка. Например, описание сетевух в/etc/rc.conf. А так же не забываем установить загрузчик. В данном случае – на новый винт. Сделать это можно через sysinstall.
У меня, например, на новом компе не было рейд-массива, а на старом был. Из-за моей невнимательности и несвоевременной правки /etc/fstab – затёрся /var раздел, некоторые разделы сменили разположения на слайсе.

Примечание.

1) Можно не использовать демоны, а запускать вручную (этот метод называется over ssh). Лучше всего для этого подходит следующая команда (она синкает со всеми правами доступа, разрешениями, симлинки как синлинки, причём, если есть несоотвутствия, то удаляет файлы, указанные в DESTINATION) для синхронизации папки/var/spool/vmail. Обратите внимание на отсутствие “/” в SOURCE и на наличии его в DESTINATION. Должно быть именно так, иначе будут проблемы (например, будет синкаться не в тут папку, или будет синкаться не /var/spool/vmail, а /var/spool, причём файлы будут браться не из /var/spool на удалённой машине, а из папки /var/spool/vmail!!! В итоге, вы потеряете всё содержимое папки/var/spool, кроме подпапки vmail.)

#rsync -r -v -l -p -o -g -t --progress --delete root@10.10.10.10:/var/spool/vmail /var/spool/

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

Ещё хотел обратить внимание на такой момент: если используется нестандартный порт ssh, то выйти из этой ситуации можно так, указав параметр:

--rsh='ssh -p8023'

2) Если пользователь на принимающей стороне не привилегированный, скопировать некоторые системные атрибуты (такие как владелец файла/папки) не получится. Для обхода этой проблемы есть опция –fake-super, которая сохраняет подобные вещи в расширенных атрибутах и которая должна указываться на принимающей стороне (и на ней должна быть включена поддержка расширенных атрибутов). Кроме того, по умолчанию rsync копирует только имена пользователей, но не их числовые идентификаторы. Для синхронизации числовых ID стоит использовать опцию –numeric-ids. С учётом всего выше сказанного, для непривилегированного пользователя, команда будет выглядеть так:

$ rsync --progress -s ssh -avz --rsync-path="rsync --fake-super" --numeric-ids /home/ user@host:/home

3) Если нужно синхронизировать только определённые файлы по маске, то можно использовать в паре с find:

$ cd $path_mail && $FIND ./ -Btime -1d ! -path "*/.Trash*" ! -path "*/.\&BCMENAQwBDsENQQ9BD0ESwQ1-*" ! -path "*/spam*" ! -path "*/sed.head*" | $RSYNC -qrlpogt --files-from=- ./ ${backup_srv_mail}:${path_mail_backup}/

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff