суббота, 3 декабря 2011 г.

Bacula. Часть первая.

Т.к. bacula штука здоровая, то будет несколько частей.
    Что такое bacula - это очень мощный, открытый менеджер бэкапов для гигантского кол-ва платформ. Про платформы не шучу, их реально много.
    Но почему я выбрал именно эту "чудо" систему?
    Дело в том, что парк машин у меня хоть и не очень солидный, но на второй десяток уже идет. И захотелось под это всё, хоть как-то, свести бэкапы в единую систему. И встал вопрос, что выбрать - ну а раз пишу про bacula, то выбор был сделан в пользу этой системы.
    Сразу предупреждаю, что bacula - жуткий монстр, его конфиг удручает с первых минут, и именно по этому, надо сначала понять как это дело работает. Иначе...
    А работает bacula просто и лаконично. Весь сервис делится на три части:

  1. Управление
  2. Клиенты
  3.  Хранилища
Начну с хранилища.
За работу с хранилищами отвечает сервис bacula-sd. Зачем отдельный сервис? Дело в том, что хранилища бывают разными: на хардах, на лентах, на оптических дисках, да хоть на флешках. А бывают ещё и библиотеки для лент и оптики. Вот ко всему этому добру данный сервис и дает вам доступ. Причем эти сервисы могут быть раскинуты по разным физическим машинам, что позволяет  делать хоть гео-распределенное хранилище. За сервисами хранилищ следит сервис управления, через единый интерфейс взаимодействия. Вот и получается, что можно заготовить такие схемы хранения, что хватит практически на любого изысканного гурмана. 

Сервис клиентов.
Собственно сервис, по средством которого будет осуществлено резервирование данных. Вы просто устанавливаете клиент и задаете ему пароль. На клиенте не надо указывать, что и когда вы хотите делать. Все ваши действия вы будете указывать на стороне управляющего сервиса, кроме отдельных специфичных скриптов. Сами понимаете, что скрипты под windows в linux среде отлаживать немного ... неудобно. А клиентские сервисы имеются под множество платформ. Т.е. на стороне клиента надо делать минимум действий. Удобно администратору с гигантским парком машин - минимум возни с клиентской частью.

Сервис управления.
Воистину монстр. Базовый конфиг занимает около 300 строк. Реальный ужас, а после пару клиентов и сложных комбинаций заданий, вообще способен быстро вырасти свыше 1000 строк. Т.ч. первое действие, которое надо сделать, это разбить по отдельным файлам разделы из файла bacula-dir.conf. В конфиге bacula подгрузка данных делается через директиву @/path/to/file.name.
Как сделал я? Я разделил конфиги на следущие секции:

  • jobs,
  • clients,
  • filesets,
  • pools,
  • schedulers,
  • storages
 И вынес соответствующие секции из bacula-dir.conf в отдельные файлы и прописал им пути в основном конфиге. В итоге остались несколько секций в основном конфиге.
Да собственно теперь можно сразу вынести листинг

Director {                        
    Name = backup-dir
    DIRport = 9101                
    QueryFile = "/etc/bacula/scripts/query.sql"
    WorkingDirectory = "/var/lib/bacula"
    PidDirectory = "/var/run/bacula"
    Maximum Concurrent Jobs = 1 # можно запускать только одно задание
    Password = "my_director pass"         # Console password
    Messages = Daemon
    DirAddresses = { 
        ip = {  addr = some.localnetwork;
                port = 9101;
        }
        ip = {  addr = some.internet.host;
                port = 9101;
        }
        ip = {
                addr = 127.0.0.1;
                port = 9101;
        } 
    } # Сделано так, потому как есть ещё пару сетевых интерфейсов куда светить не надо
}

Catalog {
    Name = BackupCatalog
    dbname = "bacula";# dbuser = "bacula"; dbpassword = "" нету так как sqlite
}

# Консоль - это четвертая часть в бакуле, но так как настройки большой не требует
# то я её и не описывал. Единственное, что в конфиге консоли пароль должен совпадать

Console {
    Name = backup-mon
    Password = "my_console_pass"         # Console password
    CommandACL = status, .status
}
# Здесь системные сообщения. В общем это отдельная песня. Пока лучше оставить так, как есть
Messages {
    Name = Standard
    mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
    operatorcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
    mail = root@localhost = all, !skipped            
    operator = root@localhost = mount
    catalog = all
    console = all, !skipped, !saved
    append = "/var/lib/bacula/log" = all, !skipped
}


Messages {
    Name = Daemon
    mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
    mail = root@localhost = all, !skipped            
    console = all, !skipped, !saved
    append = "/var/lib/bacula/log" = all, !skipped
}

# Импортирование конфига для различных секций
@/etc/bacula/bacula-dir-jobdefs.conf
@/etc/bacula/bacula-dir-job.conf
@/etc/bacula/bacula-dir-fileset.conf
@/etc/bacula/bacula-dir-schedule.conf
@/etc/bacula/bacula-dir-client.conf
@/etc/bacula/bacula-dir-storage.conf
@/etc/bacula/bacula-dir-pool.conf
В следующей части я объясню как работает связка.