Доброго времени суток всем тем, кто собирается делать Backup'ы постоянно.
В этом посте я попытаюсь облегчить жизнь тем, кто пробует познакомится с этой системой. Ничего сверхъестественного я не расскажу, просто добавлю то, что мне бы самому пригодилось. За основу взят отменно написанный пост, так что переписывать и копировать нет смысла.
И так, открываем статью, изучаем, понимаем что в голове каша и открываем схемы и вперед! Схемы получились большие, потому что в них указаны все параметры из выше указанной статьи. Вам останется вбить в схему свои данные, проследить по стрелкам зависимости (все что отмечено любым видом стрелочек надо проверить/заменить), ну и скопировать текст в свои конфиги. Одинаковые блоки копировать много раз не надо, если такой блок есть его просто оставляем (ну мало ли, вдруг кто не понял)!
Все в схемах и картинках, для простоты потребления информации. Надеюсь это облегчит вам жизнь!
День пятницы не предвещал ни каких событий, но в 5 вечера звонит коллега и говорит что почта не пашет. Тонкие нотки волнения пробежались по мне, потому что подключится к серверам было проблематично — я в глухом лесу в «секретном» военном городке! Я за 3G модем — а он глючит и отказывается подключатся. Я за телефон — только EDGE. И тут я замечаю, что ноут сообщил о WIFI сетях — самое смешное есть несколько без пароля. Ну кому еще придет в голову паролить WIFI в глухом лесу. Дальше веселее — первый же тест говорит что это 10мб/с до Пензы. Но счастье было не полным: подключившись к компьютеру я понимаю что админка VMWare жестко тупит, потом вообще выдала, что подключится не может ни к одной виртуалке на одном из серверов. Отправил сервер в перезагрузку из которой он так и не вышел. Прошу коллегу перегрузит сервер жестко и за одно подключить монитор. Через пару минут коллега перезванивает и говорит что сервер не может найти операционку и какие то 2 лампочки горят на передней панели. Да те самые лампочки которые намекнули, что меня ждет быстрое возвращение в Москву для воскрешение сервера.
Вечером перед выездом меня покусали пчелы опухла морда лица и затек глаз, по этому пришлось ехать пассажиром. Но новоиспеченный водитель отлично справилась с дорогой и уже через день я был на работе.
Страхи подтвердились — упали 2 HDD из 8 в Raid 50. Понятно что на том серваке я потерял все. Я полез на NAS где лежал архив с почты — но NAS оказался не в сети! Я полез под потолок (там хранятся NAS) и притащил его к себе, а он с заводскими настройками. Что произошло не знаю, но он сбросился и отформатировал HDD. Почтовик был утерян окончательно. Пока я ждал гарантийные HDD воскрешал все на втором сервер. Но с тех пор я решил, что системой резервирования надо заняться по полной программе. Меня спасло то что мои пользователи используют почтовые клиенты, из которых была воскрешена вся переписка. Но это долго муторно и не приятно. Теперь я отношусь к тем, кто уже делает backup'ы централизованно.
Как итог: raid теперь 51 и HDD про запас лежат. За полгода в 2х серверах я потерял еще 6 HDD. Причины так и не ясны. HP тоже не смогли сказать с чем это связано.
Схема для клиента Kubuntu в формате odg
Схема для клиента Windows в формате odg
Схема для сервера Bacula в формате odg
Пояснения к схемам
1. Я использовал как хранилище NAS D'Link DNS 323, подмонтирован он в папку /media/, каждый диск NAS в свою папку /media/nfs_linbackup_v1/ и /media/nfs_linbackup_v2/.
2. В отличии от статьи в схеме иные названия серверов и пунктов. Я так и не смог разобраться в названиях из статьи (в принципе по этой причине и появилась схема).
3. Выложены 3 схемы: для Linux, Windows и отдельно для сервера. Схема 3 (Schem_center) является схемой настройки резервного копирования самого сервера и основана на дефолтных настройках из шаблонов. Я это не реализовывал за ненадобностью лично мне. Но если решили это делать, то просто добавляете в уже созданные файлы недостающие блоки кода.
Секция Director /etc/bacula/bacula-dir.conf
1. Center.domain.local — сервер резервных копий он же 192.168.1.100;
2. Пароль Director «Center.domain.local» — «Passdir_1»;
3. Файл конфигурации для клиента kub-fd — @/etc/bacula/client-conf/client-dir-kubuntu.conf
Для клиента Kubuntu
Секция /etc/bacula/client-conf/client-dir-kubuntu.conf
1. kub-fd — клиент он же 192.168.1.20 (ОС Kubuntu 13.10);
2. Пароль клиента «PassClient_3»;
3. Имя хранилища — «Kubunt-nfs» (используется в задании для общего описания хранилища и указания на устройства хранения самих данных);
4. Имя «девайса» — «KubFileStorage» (используется как ссылка на конкретное физическое устройство хранения в файле /etc/bacula/bacula-sd.conf);
5. Имя File-set — «KubFileSet» (описывает то, что именно мы будем копировать или исключать из копирования);
6. Имя пула — «poolkubnfs» (описывает тип пула, какого размера должны быть базы бэкапов и сколько их хранить).
7. Имя планировщика (он же шедулер ) — «KubDiff» (устанавливает расписание и тип выполняемой операции т. е. полная по субботам, дифференциальная по всем остальным дням);
Секция /etc/bacula/bacula-sd.conf
1. Имя хранилища сервер — «center-sd»
2. Адрес сервера на котором запущен сервис STORAGE — SDAddress = 192.168.1.100
3. Ссылка на файл конфигурации клиента KubFileStorage @/etc/bacula/client-conf/client-sd-kubuntu.conf
Для клиента WinSrv cекция /etc/bacula/client-conf/client-dir-winsrv.conf
1. winsrv-fd — клиент он же 192.168.1.40 (ОС WinServ2003)
Все остальные пояснения в тексте комментариев.
Director {
Name = center.domain.local-dir
# какой порт слушать, у нас default
DIRport = 9101
# путь к скрипту, где лежат sql запросы для работы
# с Bacula Catalog(mysql database)
QueryFile = "/etc/bacula/scripts/query.sql"
# здесь хранятся статус файлы демона
WorkingDirectory = "/var/lib/bacula"
# pid файл демона
PidDirectory = "/var/run/bacula"
# сколько заданий может запускаться одновременно
Maximum Concurrent Jobs = 1
# пароль для доступа в BC и управления демонами
Password = "Passdir_1"
# куда слать mail'ы, описано в ресурсе Messages
Messages = Daemon
# на какой адрес биндится процессу
DirAddress = 192.168.1.100
}
Messages {
# это имя прописано в ресурсе Director
Name = Daemon
# команда для отправки email
mailcommand = "/usr/sbin/bsmtp -h localhost -f "(Bacula) <%r>" -s "Bacula daemon message" %r"
# шлем все на майл админам(root алиас на admins@domain.ru)
# высылаются только алярмы, ероры и прочую важность
mail = milo@mydomena.ru = alert,error,fatal,terminate, !skipped
# что выводить на консоль
console = all, !skipped, !saved
# что в лог
append = "/var/log/bacula/bacula.log" = all, !skipped
}
Console {
Name = center.domain.local-mon
Password = "Passdir_1"
CommandACL = status, .status
}
Messages {
Name = Standard
mailcommand = "/usr/sbin/bsmtp -h localhost -f "(Bacula) <%r>" -s "Bacula: %t %e of %c %l" %r"
operatorcommand = "/usr/sbin/bsmtp -h localhost -f "(Bacula) <%r>" -s "Bacula: Intervention needed for %j" %r"
mail = root = all, !skipped
operator = root = mount
console = all, !skipped, !saved
append = "/var/log/bacula/bacula.log" = all, !skipped
catalog = all
}
Catalog {
Name = MyCatalog
dbname = "bacula"; DB Address = ""; dbuser = "bacula"; dbpassword = "SQL_pass"
}
# Что бы основные файл конфигов не разрастались, удобнее и лучше
# делать на них ссылки - @ и далее путь к файлу,
# где лежит конфиг для конкретного клиента
@/etc/bacula/client-conf/client-dir-kubuntu.conf
@/etc/bacula/client-conf/client-dir-winsrv.conf
/etc/bacula/bacula-sd.conf (на стороне сервера)
Storage {
# имя для SD
Name = center-sd
# порт стандартный
SDPort = 9103
# рабочая директория процесса(для статус файлов)
WorkingDirectory = "/var/lib/bacula"
# pid будет здесь
Pid Directory = "/var/run/bacula"
# биндится на этом ip
SDAddress = 192.168.1.100
}
Director {
# имя DD, того самого, который был описан ранее
Name = center.domain.local-dir
# пароль
Password = "Passtor_2"
}
# Что бы основные файл конфигов не разрастались, удобнее и лучше
# делать на них ссылки - @ и далее путь к файлу где лежит конфиг для
# конкретного клиента
@/etc/bacula/client-conf/client-sd-kubuntu.conf
@/etc/bacula/client-conf/client-sd-winsrv.conf
Director {
Name = center.domain.local-dir
Password = "PassClient_01"
}
FileDaemon {
Name = center.domain.local-fd
FDport = 9102
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run/bacula
Maximum Concurrent Jobs = 20
FDAddress = 192.168.1.100 # адрес или имя клиента
}
Messages {
Name = Standard
director = center.domain.local-dir = all, !skipped, !restored
}
Director {
Name = center.domain.local-dir
DIRport = 9101
Address = 192.168.1.100
Password = "Passdir_1"
}
Client {
# имя
Name = kub-fd
# ip адрес клиента
Address = 192.168.1.20
# порт, который клиент слушает
FDPort = 9102
# имя mysql базы данных Bacula
Catalog = MyCatalog
# пароль для FD
Password = "PassClient_3"
# период в течении которого информация о файлах задания
# хранится в базе данных, по истечению периода эта
# информация удаляется(но не сами данные!!)
File Retention = 30 days
# тоже самое, только для самого задания
Job Retention = 2 months
# удалять записи из каталога(бд mysql) старше
# вышеуказанных значений
AutoPrune = yes
}
Storage {
# имя хранилища и пароль
Name = Kubunt-nfs
Password = "Passtor_2"
# fqdn имя сервера
Address = 192.168.1.100
# порт оставляем стандартный
SDPort = 9103
# имя девайса описанного в конфиге SD
Device = KubFileStorage
# у нас все пишется на софтовый рэйд в файлы собственного
# формата bacula(например
# /media/nfs_linbackup_v1/kubuntu/Vol0001)
Media Type = File
}
Schedule {
Name = "KubDiff"
Run = Level=Full on sat at 15:01
Run = Level=Differential on tue-fri at 15:02
}
Pool {
# имя пула, указывается в заданиях резервного копирования
Name = poolkubnfs
# тип пула, емнип этой версии только такой поддерживается
Pool Type = Backup
# повторно использовать тома (сначала пишет в 1-ый,
#потом в 2-ой, потом 3-й, 3-й закончился - снова в 1-й)
AutoPrune = yes
# удалять записи из bacula catalog (из mysql базы бакулы)
# старше нижеуказанных значений
Recycle = yes
# период в течении которого информация о томах(Voumes)
# хранится в базе данных, по истечению периода эта
# информация удаляется
Volume Retention = 5 days
Maximum Volume Bytes = 1G
Maximum Volumes = 3
LabelFormat = "Kubvol"
}
FileSet {
Name = "KubFileSet"
Include {
Options {
# разработчики яро рекомендуют юзать это опцию,
# создается сигнатура забекапленных файлов в md5
signature = MD5
}
# перечисляем то, что нужно бекапить
File = /var/backups/opt/
File = /etc/hosts
File = /etc/host.conf
File = /etc/network/interfaces
File = /etc/dnsmasq.conf
File = /etc/resolv.conf
File = /etc/ntp.conf
File = /home/rk/testbackup/
}
Exclude {
# а это бекапить нет нужды
File = /home/rk/testbackup/NTFS.dmg
}
}
Job {
# имя задания
Name = "BackupKubFull"
# тип(backup or restore)
Type = Backup
# уровень(полный, диференциальный или
# инкрементный)
Level = Full
# имя SD ресурса
Storage = Kubunt-nfs
# имя файл-сета(там рассказано что
# бекапить, а что не бекапить)
FileSet="KubFileSet"
# имя шедулера
Schedule = "KubDiff"
# имя пула(для разных клиентов разные пулы
# томов(volume) куда пишутся сами бекапы)
Pool = poolkubnfs
# имя клиента
Client=kub-fd
# в этом файле содержится информация о том,
# какие файлы должны будут востанавливаться,
#на каком вольюме находятся файлы, где конкретно
# они находятся - это очень важные файлы, их
# нужно бэкапить
Write Bootstrap = "/var/lib/bacula/%n.bsr"
# имя ресурса messages, который будет
# использоваться для этого задания
Messages = Standard
# скрипт запускающийся ДО выполнения задания
#(путь до скрипта - это путь НА КЛИЕНТЕ!)
ClientRunBeforeJob = "/root/sh/before_bg_db_backup.sh"
# скрипт запускающийся ПОСЛЕ выполнения задания
ClientRunAfterJob = "/root/sh/after_bg_db_backup.sh"
# УБРАТЬ ЕСЛИ НЕ ИСПОЛЬЗУЕТЕ СКРИПТЫ!!!
}
Job {
# Имя задачи для восстановления данных
Name = "RestoreKub"
Type = Restore
Client=kub-fd
FileSet="KubFileSet"
Storage = winsrv-nfs
Pool = poolkubnfs
Messages = Standard
# Папка куда будут складывать восстановленные
# данные на клиенте. И что не затереть новую версию
# файлов, лучше их восстанавливать в отдельную папку
Where = /home/rb/1/
}
Client {
# имя
Name = winsrv-fd
# ip адрес клиента
Address = 192.168.1.40
# порт, который клиент слушает
FDPort = 9102
# имя mysql базы данных Bacula
Catalog = MyCatalog
# пароль для FD
Password = "PassClient_3"
# период в течении которого информация о файлах задания
# хранится в базе данных, по истечению периода эта
# информация удаляется(но не сами данные!!)
File Retention = 30 days
# тоже самое, только для самого задания
Job Retention = 2 months
# удалять записи из каталога(бд mysql) старше
# вышеуказанных значений
AutoPrune = yes
}
Storage {
# имя хранилища и пароль
Name = winsrv-nfs
Password = "Passtor_2"
# fqdn имя сервера
Address = center.domain.local
# порт оставляем стандартный
SDPort = 9103
# имя девайса описанного в конфиге SD
Device = winsrvFileStorage
# у нас все пишется на NFS NAS в файлы собственного
# формата bacula(например /backup/bgbilling/Vol0001)
Media Type = File
}
Schedule {
Name = "WinDiff"
Run = Level=Full on sat at 00:02
Run = Level=Differential on tue-fri at 00:03
}
Pool {
# имя пула, указывается в заданиях резервного копирования
Name = poolwinsrvnfs
# тип пула, емнип этой версии только такой поддерживается
Pool Type = Backup
# повторно использовать тома (сначала пишет в 1-ый,
#потом в 2-ой, потом 3-й, 3-й закончился - снова в 1-й)
AutoPrune = yes
# удалять записи из bacula catalog (из mysql базы бакулы)
# старше нижеуказанных значений
Recycle = yes
# период в течении которого информация о томах(Voumes)
# хранится в базе данных, по истечению периода эта
# информация удаляется
Volume Retention = 5 days
Maximum Volume Bytes = 1G
Maximum Volumes = 3
LabelFormat = "winvol"
}
FileSet {
Name = "WinFileSet"
#VSS при востановлении дает ошибку, посему отключил
#Причина мне не ясна
Enable VSS = no
Include {
Options {
compression = GZIP
signature = MD5
portable=yes
noatime = yes
checkfilechanges = yes
Ignore Case = yes
wildfile = "*.avi"
wildfile = "*.wmv"
wildfile = "*.mp3"
wilddir = "System Volume Information"
exclude = yes
}
# перечисляем то, что нужно бекапить
File = "C:/Buh"
File = "C:/Supply"
File = "C:/Doc"
}
Exclude {
File = "C:/Doc/myphoto/"
}
}
Job {
# имя задания
Name = "BackupWinFull"
# тип(backup or restore)
Type = Backup
# уровень(полный, диференциальный или
# инкрементный)
Level = Full
# имя SD ресурса
Storage = winsrv-nfs
# имя файл-сета(там рассказано что
# бекапить, а что не бекапить)
FileSet="WinFileSet"
# имя шедулера
Schedule = "WinDiff"
# имя пула(для разных клиентов разные пулы
# томов(volume) куда пишутся сами бекапы)
Pool = poolwinsrvnfs
# имя клиента
Client=winsrv-fd
# в этом файле содержится информация о том,
# какие файлы должны будут востанавливаться,
#на каком вольюме находятся файлы, где конкретно
# они находятся - это очень важные файлы, их
# нужно бэкапить
Write Bootstrap = "/var/lib/bacula/%n.bsr"
# имя ресурса messages, который будет
# использоваться для этого задания
Messages = Standard
}
Job {
# Имя задачи для восстановления данных
Name = "ResotreWinsrv"
Type = Restore
Client=winsrv-fd
FileSet="WinFileSet"
Storage = winsrv-nfs
Pool = poolwinsrvnfs
Messages = Standard
# Папка куда будут складывать восстановленные
# данные на клиенте. И что не затереть новую версию
# файлов, лучше их восстанавливать в отдельную папку
Where = /1/
}
# имя, о соответствии имен и паролей будет сказано ниже
Name = KubFileStorage
# тип
Media Type = File
# директория где лежат файлы этого устройства(тома, volumes)
Archive Device = /media/nfs_linbackup_v1/kubuntu
# новые тома будут обзываться согласно настроек Pool'а(здесь Vol*) см.
# конфиг DD
LabelMedia = yes;
# для устройства типа File должно быть так
Random Access = Yes;
# если устройство открыто, использовать его
AutomaticMount = yes;
# думаю понятно =)
RemovableMedia = no;
# открывать только тогда, когда стартует соответствующие задание
AlwaysOpen = no;
}
# имя, о соответствии имен и паролей будет сказано ниже
Name = winsrvFileStorage
# тип
Media Type = File
# директория где лежат файлы этого устройства(тома, volumes)
Archive Device = /media/nfs_linbackup_v2/winsrv
# новые тома будут обзываться согласно настроек Pool'а(здесь Vol*) см.
# конфиг DD
LabelMedia = yes;
# для устройства типа File должно быть так
Random Access = Yes;
# если устройство открыто, использовать его
AutomaticMount = yes;
# думаю понятно =)
RemovableMedia = no;
# открывать только тогда, когда стартует соответствующие задание
AlwaysOpen = no;
}
Name = center.domain.local-dir
Password = «PassClient_3»
}
FileDaemon {
Name = kub-fd
FDport = 9102
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run/bacula
Maximum Concurrent Jobs = 20
FDAddress = 192.168.1.20 # адрес или имя клиента
}
Messages {
Name = Standard
director = center.domain.local-dir = all, !skipped, !restored
}
Client {
Name = winsrv-fd
Address = 192.168.1.40
FDPort = 9102
Catalog = MyCatalog
Password = «PassClient_3»
File Retention = 30 days
Job Retention = 2 months
AutoPrune = yes
}
Name = center.domain.local-dir
Password = «PassClient_3»
}
FileDaemon {
Name = winsrv-fd
FDport = 9102
WorkingDirectory = «C:\Program Files\Bacula\working»
Pid Directory = «C:\Program Files\Bacula\working»
# Plugin Directory = «C:\Program Files\Bacula\plugins»
Maximum Concurrent Jobs = 10
Messages {
Name = Standard
director = center.domain.local-dir = all, !skipped, !restored
}
Как управлять этим локомотивам
Наш паровоз завелся и вроде помчался в наше счастливое будущее. Но нужно всегда за ним посматривать. Для этого умные люди придумали Bacula Administration Tool (BAT). Что бы им пользоваться вам его надо установить из репозитариев. Так как дистрибутивы у всех разные вдаваться в подробности не станем. Но вот настроить следует. Для этого открываем файл /etc/bacula/bat.conf на компьютере с которого будем управлять и вносим изменения:
Director {
Name = center.domain.local-dir
DIRport = 9101
address = 192.168.1.100
Password = "Passdir_1"
}
Если все правильно настроено запускаем Bacula Administration Tool и видим подобное окно:
Далее нам нужно посмотреть какие все таки задания мы сделали — вкладка JOBS. Особенно данная вкладка нам пригодится когда мы будем что либо восстанавливать.
Далее нам будет интересно глянуть что же техника уже успела натворить — вкладка Jobs Run
А если дважды нажать на задание то мы получаем полную информацию что сделано, за сколько и как обстоят дела.
Обязательно забредем во вкладку Media, где нам наглядно покажут заполняемость наших файликов и их перезапись (Крайне удобная штука, которая позволяет определить все ли хорошо у нас с местом. А то я количество вольюмов перебрал и мой NAS быстро переполнился.)
А теперь самое важное — как восстанавливать. Уже известная нам вкладка JOBS_RUN и выбираем ту выполненную задачу, в которой есть нужный нам файл. Но бывает такое что мы не знаем, есть ли там нужный нам файл. Нажав правой кнопкой получаем меню, в котором нужно выбрать «List files on job».
Убедившись что там есть нужный нам файл, возвращаемся к «Jobs Run» и на нужном нам задании вызываем контекстное меню и выбираем «Restore from Job» — восстановить из задания или «Restore from Time» — восстановить по времени. В появившемся окне можно выбрать — по номеру задания, ну или вообще по заданию за одно проверив все настройки.
Нажимаем «ОК» и через несколько секунд нашему взору предстанет дерево файлов, сохраненные в этом задании, где нам галочками нужно отметить интересующие нас файлы.
После выбора файлов система предложит нам выбрать задание, которым мы будем восстанавливать. Интересная особенность — если у вас для данного конкретного клиента нету задачи на восстановление, то можно использовать любое задание на восстановление, лишь изменив параметры задачи перед ее применением (см. ниже). Жмем «ОК» и наслаждаемся выполнением задания.
Вот впринципе и все. Надеюсь статья найдет своего читателя. Все файлы использованные в статье лежат на моем диске.
Возможно слишком много картинок и текстов, возможно есть ошибки, возможно не хватает каких-то серьезных деталей, но я пытался облегчить использование программы для тех кто не хочет сильно углубляться (ну или для тех, у кого мало опыта, например для меня).
P.S. Главное что бы это работало, а все остальное не важно
Автор: leon_3