пятница, 23 сентября 2011 г.

Bacula, SATA Диски вместо ленточек

Использую Bacula для резервного копирования. Хранил все резервные копии на RAID массиве, но в один прекрасный момент место на нём стало подходить к концу. Решил попробовать организовать резервное копирование на внешние диски (USB, eSATA, SATA).

О системе: ОСь CentOS 5.6, Bacula 5.0.3 (из репозитория http://www.pramberger.at/ ), vchanger (http://sourceforge.net/projects/vchanger/), autofs, все диски одного объема по 1,5 тБ.

Будем считать что у вас уже имеется настроенная и рабочая система. Если нет, тогда вам сюда: http://wiki.bacula.org, http://www.bog.pp.ru/work/bacula.html

Терминология:
Чейнджер - виртуальное устройство которое создает vchanger
Ленточка - файл в который происходит запись, он же "том" (volume) в бакуле.
Магазин - наш сменный диск с "ленточками"
Количество слотов - сколько ленточек может быть в магазине
Отсеки для магазинов - сколько одновременно магазинов можно использовать.

Настроим autofs, чтобы при обращении к поддиректории в директории /bacula/uuid, происходила попытка смонтировать диск с одноименным UUID:
В файл /etc/auto.master добавим строчку:
/bacula/uuid /etc/auto.uuid --timeout=10

Создадим файл /etc/auto.uuid, добавим туда:
* -fstype=auto,rw :/dev/disk/by-uuid/&

Надо проверить что диск монтируется автоматически.
cd /bacula/uuid/ИдентификаторРазделаДиска
В результате должна появиться папка ИдентификаторРазделаДиска и в неё же подмаонтироваться наш раздел.

Настроим vchanger, программа для эмуляции ленточного ченжера.
Мы будем использовать один ченжер для дисков одинакого объёма.
Создадим файл /etc/bacula/c1500.conf:
# 1500 gb диски
# Использую это имя и в бакуле тоже
changer_name = "c1500"
work_dir = "/var/lib/bacula/c1500"
logfile = "/var/lib/bacula/c1500/c1500.log"
log_level = LOG_EMERG
# Число приводов - сколько одновременно ленточек можно записывать
Virtual_Drives = 4
# Сколько ленточек умещается в магазине, определяем как (объем диска - 15%)/(max volume size из свойств пула в бакуле)
slots_per_magazine = 60
# Сколько одновременно магазинов (дисков) можно использовать, у меня это количество свободных eSATA портов
magazine_bays = 4
# Папка, где будут монтироваться магазины
automount_dir = /bacula/uuid
# Теперь нам нужно перечислить магазины с ленточками которые мы используем
magazine = "UUID:69ceced2-a9ab-4b10-9314-177e912279e7" #1 inc
magazine = "UUID:c83dad52-bd34-49bf-a1dd-fe49e9f6f9bf" #2 diff
# Бывает что по UUID vchanger не может подмонтировать диск, тогда укажем папку.
# В итоге, я настроил все через папки, чтобы было всё единообразно.
magazine = "/bacula/uuid/60182fad-27bc-451f-a4e1-123a619bba2e" #3 full
magazine = "/bacula/uuid/7e68d7be-a98f-47fd-be0d-49d2bea9be24" #4 inc
magazine = "/bacula/uuid/6e834c12-cf8f-4266-8791-4731fdd58207" #5 diff
magazine = "/bacula/uuid/3d4d3dfb-6159-43da-b9d3-75dc802a0e07" #6 full


На этом настройка vchanger завершена. Мы получили виртуальный ченжер с четырьмя приводами для записи ленточек, возможность подключить одновременно 4 магазина с ленточками по 60 ленточек в каждом.

Теперь приступим к настройке бакулы. в конфигурационный файл директора добавляем:
Пулы:
Pool {
Name = "chg-full"
Pool Type = backup
Storage = c1500
Maximum Volume Bytes = 20gb # Тут определяется максимальный размер каждой ленточки
Volume Retention = 200 days
Recycle = Yes
}

Pool {
Name = "chg-diff"
Pool Type = backup
Storage = c1500
Maximum Volume Bytes = 20gb
Volume Retention = 60 days
Recycle = Yes
}

Pool {
Name = "chg-inc"
Pool Type = backup
Storage = c1500
Maximum Volume Bytes = 20gb
Volume Retention = 14 days
Recycle = Yes
}

Обращу ваше вниманеи вот на какой параметр:
Maximum Volume Bytes = 20gb. Тут определяется максимальный размер каждой ленточки, а количество ленточек в магазине (в нашем случае диске) определяется в настройках vchangerа, собственно по этому, если хотим использовать один пул для объединения леточек с дисков разного объёма, мы вынуждены создавать отдельный ченжер для дисков каждого объёма.

Теперь добавим ресурс Storage для нашего виртуальног ченжера:
Storage {
Name = c1500
Address = bacula-sd.local
Password = "123456"
Device = c1500
Media Type = File
Autochanger = yes;
Maximum Concurrent Jobs = 20
}


Создадим расписание расписание для тестирования, Полная копия в 12-05, дифиринциальная в 16-05, и инкрементальные примерно раз в час с 8 до 23. Каждый уровень резервного копирования будет использовать свой пул.
Schedule {
Name = test-gfsCycle
Run = Level=Full Pool=chg-full at 12:05
Run = Level=Differential Pool=chg-diff at 16:05
Run = Level=Incremental Pool=chg-inc at 8:05,9:20,10:20,11:20,14:20,15:20,17:20,18:20,19:20,20:20,21:20,22:20,23:20
}


Для окончательной настройки осталось добавить задания для резервного копирования.
# Сделаем шаблон задания с нашим расписанием и пулом.
JobDefs {
Name = "DefaultJobchg"
Maximum Concurrent Jobs = 20
Type = Backup
Schedule = "test-gfsCycle"
Messages = Standard
Priority = 10
Pool = chg-inc
SpoolData = yes
Spool Size = 300 GB
}
# Сделаем тестовое задание, по шаблону выше
Job {
Name = "at0038-test-job"
JobDefs = "DefaultJobchg"
Write Bootstrap = "/var/lib/bacula/at0038-test.bsr"
Client = at0038-fd
FileSet = "at0038-test-FileSet"
Enabled = Yes
}
# Сделаем набор файлов для архивирования по заданию
FileSet {
Name = "at0038-test-FileSet"
Include {
Options {
signature = MD5
compression = GZIP
}
File = /etc/bacula
}
}


С директором закончили, едем дальше. Настраиваем стораж демон. Создаем авто ченджер с четырьмя приводами и описываем каждый привод.
Autochanger {
Name = c1500
Device = c1500-drive-0
Device = c1500-drive-1
Device = c1500-drive-2
Device = c1500-drive-3
Changer Command = "/usr/local/bin/vchanger %c %o %S %a %d"
Changer Device = "/etc/bacula/c1500.conf"
}

Device {
Name = c1500-drive-0
DriveIndex = 0
Autochanger = yes;
DeviceType = File
MediaType = File
ArchiveDevice = /var/lib/bacula/c1500/0/drive0
RemovableMedia = no;
RandomAccess = yes;
Spool Directory = /bacula/spool/0
Maximum Spool Size = 200 GB
Maximum Job Spool Size = 60 GB
Maximum Concurrent Jobs = 20
}

Device {
Name = c1500-drive-1
DriveIndex = 1
Autochanger = yes;
DeviceType = File
MediaType = File
ArchiveDevice = /var/lib/bacula/c1500/1/drive1
RemovableMedia = no;
RandomAccess = yes;
Spool Directory = /bacula/spool/1
Maximum Spool Size = 200 GB
Maximum Job Spool Size = 60 GB
Maximum Concurrent Jobs = 20
}
Device {
Name = c1500-drive-2
DriveIndex = 2
Autochanger = yes;
DeviceType = File
MediaType = File
ArchiveDevice = /var/lib/bacula/c1500/2/drive2
RemovableMedia = no;
RandomAccess = yes;
Spool Directory = /bacula/spool/2
Maximum Spool Size = 200 GB
Maximum Job Spool Size = 60 GB
Maximum Concurrent Jobs = 20
}

Device {
Name = c1500-drive-3
DriveIndex = 3
Autochanger = yes;
DeviceType = File
MediaType = File
ArchiveDevice = /var/lib/bacula/c1500/3/drive3
RemovableMedia = no;
RandomAccess = yes;
Spool Directory = /bacula/spool/3
Maximum Spool Size = 200 GB
Maximum Job Spool Size = 60 GB
Maximum Concurrent Jobs = 20
}


Теперь надо подготовить диски, я использую 6 дисков по 1,5 тБ. По два в каждом пуле.
Создаем разделы на всех. Узнаём их идентификаторый и записываем их в конфигурацию vchangera.
Права на раздел должны принадлежать пользователю от которого запускается vchanger. В моем случае это тпользователь bacula.
magazine = "/bacula/uuid/60182fad-27bc-451f-a4e1-123a619bba2e" #3 full
Это значит что на диске нарисована маркером цифра 3, а в бакуле он добавлен в chg-full пул
После этого инифиализируем диск в vchangerе:
vchanger -u bacula -g bacula /etc/bacula/c1500.conf initmag 1

Теперь необходимо применить настройки и промаркировать ленточки в наших маназинах.
В консоле управления бакулы:
label storage=c1500 pool=chg-full slot=1-60 barcodes
label storage=c1500 pool=chg-full slot=121-180 barcodes (если диск, например, в третьем слоте для магазинов)
Обновим информацию о ленточках в слотах магазинов, в консоле:
update slots storage=c1500

Ну вот пожалуй и всё с настройкой.
При эксплуатации выявились некоторые нюансы. Привод не всегда отпускал ленточку после завершения резервного копирования (звучит так как будт-то разговор идёт о реальном приводе :). Пришлось сделать задание с наименьшим прироритетом которое запускается после заданий на резервное копирование и даёт команду освободить приводы. И ещё одна проблема когда вставляешь диск, бакула не знает какая ленточка в каком слоте, для решение также сделал задание в бакуле, с наивысшим приоритетом, который запускается перед всеми остальными и загружает ленточки в слоты.

Добавляем в конфигурацию директора шаблон и задания
JobDefs {
Name = "DefaultJobchgAdmin"
Maximum Concurrent Jobs = 20
Type = Admin
Schedule = "gfsCycle"
Messages = Standard
Priority = 10
Pool = chg-full
Fileset = Default
}

Job {
Name = at0038-updateslots
JobDefs = "DefaultJobchgAdmin"
Client = at0038-fd
RunBeforeJob = "/etc/bacula/scripts/chg_update_slots.sh >> /tmp/chg_update_slots.log"
Priority = 8
}

Job {
Name = at0038-releasestorage
JobDefs = "DefaultJobchgAdmin"
Client = at0038-fd
Schedule = "WeeklyCycleAfterBackup"
RunAfterJob = "/etc/bacula/scripts/chg_release_tapes.sh >> /tmp/chg_release_tapes.log"
Priority = 30
}


Создаем файл chg_release_tapes.sh
#!/bin/bash
bconsole="/usr/bin/bconsole -s -c /etc/bacula/bconsole.conf"
$bconsole <<EOD
release storage=c1500 drive=0
release storage=c1500 drive=1
release storage=c1500 drive=2
release storage=c1500 drive=3
release storage=c500 drive=0
release storage=c500 drive=1
release storage=c500 drive=2
release storage=c500 drive=3
quit
EOD

Создаем Файл chg_update_slots.sh
#!/bin/bash
bconsole="/usr/bin/bconsole -s -c /etc/bacula/bconsole.conf"
$bconsole <<EOD_UPSLOTS
update slots storage=c1500 drive=0
quit
EOD_UPSLOTS


ну вот теперь всё.

Спасибо создателям vchanger, людям на http://wiki.bacula.org, и http://www.bog.pp.ru/work/bacula.html. Неоценимо помогли эти материалы.