Иногда проснувшись утром отчетливо понимаешь — что то не так. Хотя ты побрился и даже ни разу не порезался, кофе не выкипел, на улице солнечное утро, добрался до работы быстро и без приключений, вроде бы все хорошо, а все равно что то не так. Но войдя в офис ты видишь общую панику, истеричные вопли, о том, что все пропало и «весь офисный планктон» умрет, а ты находишься во главе тех кто погибнет. Оказывается ночью отказали файловый и почтовый серверы. И тут понимаешь, что не с проста утро началось так хорошо. Работы предстоит достаточно, но данные надежно сохранены, ибо ты позаботился об их резервном копировании. В принципе обычная рабочая ситуация, если есть бекапы данных. Именно «о вовремя сделанном бекапе» мы сегодня и поговорим. Систем резервного копирования данных достаточно много, с открытым исходным кодом — значительно меньше, а уровня предприятия, да еще и с открытым кодом можно пересчитать по пальцам рук, ну или ног, кому как удобнее. После детального изучения возможностей была выбрана система с неброским названием Bacula. Минимальный список требований: 1.клиент-серверная архитектура 2.возможность бекапа. восттановления nix,win систем 3.различные варианты бекапов (полный, дифференциальный, инкрементальный ) 4.возможность варировать тип бекапа от времени выполнения 5.ротация бекапов 6.«достаточная» документированность 7.высокая надежность (уровня «палкой не убьешь») Кто слышит в первые о Bacula, советую посетить википедию, дабы иметь минимальное представление от теме «статьи». Для тех, кто «осилил много букв», но не желает лазать по википедии привожу список основных модулей. Bacula Director — процесс управляющий системой в целом(управление, планирование, восстановление бекапов). Storage Director — запускается на сервере отвечающим за «физическое» хранение данных. File Director — сервис запускаемый на каждом из клиентов. Bconsole — консоль управления.
Задание: наладить систему резервного копирования и восстановления данных, таким образом, что бы: на server1 и server3 в понедельник делался «полный» бекап, со вторника и до воскресенья включительно дифф. бекпы, а для server2 всю неделю делались «полные» бекапы. Данные должны храниться не менее 3х недель. Для примера возьмем конфигурацию для резервного копирования и восстановления данных с server3.
Начнем с настройки Bacula Director (файл конфига: /etc/bacula/bacula-dir.conf. Расположение: сервер с запущенным bacula-director ) Director { Name = backup-dir Dirport = 9101 QueryFile = "/etc/bacula/scripts/query.sql" #набор sql запросов для работы с метаданными WorkingDirectory = "/var/lib/bacula" PidDirectory = "/var/run/bacula" Password = "some_password" Messages = Daemon DirAddress = 10.10.0.1 }
В связи с тем, что система интенсивно хранит метаданные в базе данных настраиваем доступ к mysql базе данных. Catalog { Name = MyCatalog dbname = bacula; DB Address = "10.10.0.1"; user = bacula; password = "some_password" }
Настраиваем доступ к консоли управления Console { Name = backup-mon Password = "some_password" CommandACL = status, .status }
Отправка отчетов о проделанной работе на почту администратору Messages { Name = Daemon mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r" mail = admin@domain.com = all, !skipped console = all, !skipped, !saved append = "/var/lib/bacula/log" = all, !skipped }
Определяем сервера «хранилища» Storage { Name = stor_server1 Address = 10.10.0.2 SDPort = 9103 Password = "storage_pass" Device = FileStorage Media Type = File }
Создаем расписания согласно которому будем выполнять задания копирования или восстановления. Согласно расписанию в понедельник будет создан «полный» бекап, в остальные дни будут создаваться дифференциальные бекапы. Так например, что бы восстановить данные за пятницу, необходимо развернуть задание бекапа выполненное в понедельник, после чего «сверху накатить» пятничный диф. бекап. Schedule { Name = "WeeklyDiff" Run = Level=Full on mon at 05:01 Run = Level=Differential on tue-sun at 02:02 }
Расписание, для создания «полных» бекапов. Применяется для данных, потеря которых приведет к «полному» разочарованию начальства в «вашей квалификации» с занесением в личное дело, или «в грудную клетку», кому как повезет. Schedule { Name = "WeeklyFull" Run = Level=Full on mon-sun at 03:03 }
Создаем задание для бекапа сервера server3 Job { Name = "server3" #Имя задания Type = Backup #Тип работы(создание бекапа) Level = Differential #Уровень бекапа Client=server3-fd #Клиент на котором будет производиться бекап FileSet="server3" #Где описано как и какие файлы будем сохранять Storage = stor_server1 #Куда будем «сливать» бекап Pool = mainpool #Определяем с каким «пулом»(как) будем работать Messages = Standard #Как отрапортовать о проделанной работе Schedule = "WeeklyDiff" #По какому расписанию делать бекапы }
Указываем что именно и как будем сохранять с сервера server3 FileSet { Name = "server3" Include { Options { signature = MD5 #Для сверки используем MD5 Compression=GZIP #Используем GZIP компрессию } File = /etc #Что именно бекапить File = /home/ File = /var/www
}
Exclude { #А что не бекапить, например логи File = /home/logs File = /var/www/logs } }
Описание параметров клиента, для server3 Client { Name = server3-fd Address = 10.10.0.3 FDPort = 9102 Catalog = MyCatalog Password = "fd_password File Retention = 28 days #Сколько сохранять метаданные о сохраненных файлах для #данного клиента Job Retention = 28 days #Сколько сохранять метаданные касательно заданий для данного #клиента AutoPrune = yes #Может ли бакула очищать метаданные }
Pool { Name = mainpool Pool Type = Backup Recycle = yes # Может ли бакула удалять задания из томов AutoPrune = yes # Может ли бакула очищать тома Volume Retention = 21 days # Как долго бакула должна бояться удалить том Maximum Volume Jobs = 7 # Сколько заданий хранить в каждом из томов Maximum Volumes = 4 # максимальное количество том которыми может #оперировать бакула }
Описание задания, для восстановления данных Job { Name = "server3-resotre" Type = Restore Client=server3 FileSet="server3" Storage = stor_server1 Pool = mainpool Messages = Standard Where = /var/lib/bacula-restores }
Для работы bacula-director, бекапа и восттановления «server3» данного конфига вполне достаточно. Что у нас получилось: в понедельник происходит «полный» бекап сервера, со вторника по понедельник идут диф. бекапы. На севере «хранилище» для данного задания создается 4 тома, в каждом томе хранится 7 заданий.(том линкуется(создается) командой label) По заполнении всех 4 томов, происходит очистка самого старого тома. Далее идет конфиг сервера «хранилища»(storage director) и клиента(file director) для сервера server3
Описание настроек для Bacula Storage Director (файл конфига: /etc/bacula/bacula-sd.conf. Расположение: сервер с запущенным bacula-sd (storage director) ) Storage { Name = stor_server1 SDPort = 9103 WorkingDirectory = "/var/lib/bacula" Pid Directory = "/var/run/bacula" SDAddress = 10.10.0.2 } Director { Name = backup-dir Password = "storage_pass" }
Device { Name = FileStorage Media Type = File Archive Device = /var/bacula LabelMedia = yes; Random Access = Yes; AutomaticMount = yes; RemovableMedia = no; AlwaysOpen = no; }
Messages { Name = Standard director = backup-dir = all }
Описание настроек для file-director на сервере server3
(файл конфига: /etc/bacula/bacula-fd.conf. Расположение: сервер с запущенным bacula-fd ( server3)) Director { Name = backup-dir Password = "server3-fd" }
Messages { Name = Standard director = server3-fd = all, !skipped, !restored }
Надеюсь комментарии в конфигурационных файлах сервера «хранилища» и клиента на сервере server3 излишни.
Итогом данный статьи может стать понимание того как настроить гибкую, надежную систему резервного копирования и восстановления данных с неброским названием Bacula.
П.С. Для тех, кто прочитав вступление спросит, а почему это проснувшись утром я не знал что ночью упало 2 сервера, ведь системы мониторинга никто не отменял, да и наверное столь важные серверы можно развернуть на рейд массивах. Ситуация со сбоем сразу двух серверов вымышленная и приведена исключительно для примера.