Bacula
Бэкапы обстоятельно
Первым делом стоит понять, что Bacula — сложный продукт, пригодный для множества ситуаций, но за это приходится платить существенным вложением времени в освоение базовых вещей и соответствующее конфигурирование (отведите хотя бы неделю на базовое освоение и планирование тестовой инсталяции).
Если требуется создавать простую резервную копию — возможно, достаточно просто tar, rsync или несложных систем вроде rdiff-backup или bontmia. Но если надо работать с несколькими клиентами, стораджами, наборами данных, расписаниями бэкапа — лучше сразу посмотреть на bacula.
Подводные грабли
Перед подъёмом боевой бакулы есть смысл хотя бы неделю потренироваться на учебной установке; хорошо бы при этом заметить такой момент как настройка VolumeRetention и Recycle/AutoPrune, иначе рано или поздно настанет день, когда единственный здоровенный том подойдёт к концу и сделать с этим ничего не получится, потому что bacula их _только_ дописывает и никогда не начинает перезаписывать место в томе, которое было занято уже удалёнными заданиями. Стоит делать небольшие (пусть десятки гигов, а не терабайты) тома и наладить их автоматизированный оборот.
Базовая настройка Bacula
Рассмотрим минимальную установку сервера bacula.
Установим необходимые пакеты:
На сервере:
# apt-get install bacula7-common bacula7-console bacula7-director-common bacula7-director-mysql bacula7-storage mt-st
На клиенте:
# apt-get install bacula7-client
Для исправления запуска сервисов (Bug 33645) необходимо привести файл /lib/tmpfiles.d/bacula.conf к следующему виду:
d /var/run/bacula 0775 root bacula -
И перезагрузить сервер.
Настройка базы данных MySQL
Процесс запуска и настройки MySQL сервера описан тут
Запустим сервис и добавим его в автозагрузку:
# systemctl start mysqld # systemctl enable mysqld
Подключимся к MySQL:
# mysql -u root -p
Создадим базу bacula:
mysql> CREATE DATABASE `bacula`;
Создадим пользователя bacula с паролем "Pa$$word":
mysql> CREATE USER 'bacula'@'localhost' IDENTIFIED BY 'Pa$$word';
Дадим пользователю права на базу:
mysql> GRANT ALL PRIVILEGES ON `bacula`.* TO 'bacula'@'localhost'; mysql> FLUSH PRIVILEGES;
Для создания необходимых таблиц существуют скрипт:
# /usr/share/bacula/scripts/make_mysql_tables
Настройка Director
За настройку Bacula Director отвечает файл /etc/bacula/bacula-dir.conf:
Director { Name = dir # Имя DIRport = 9101 # Порт который будет слушать Director QueryFile = "/usr/share/bacula/scripts/query.sql" WorkingDirectory = "/var/lib/bacula" PidDirectory = "/var/run/bacula" Maximum Concurrent Jobs = 1 @/etc/bacula/bacula-dir-password.conf # Файл с паролем для доступа к Director Messages = Daemon } # Параметры каталога Catalog { Name = MyCatalog # Имя каталога dbname = bacula # Имя базы данных user = bacula # Имя пользователя базы данных password = "Pa$$word" # Пароль пользователя базы данных } # Дальнейшие строчки подгружают конфигурационные файлы из подкаталогов job.d fileset.d schedule.d client.d storage.d messages.d pool.d @|"sh -c 'for f in /etc/bacula/job.d/*.conf ; do echo @${f} ; done'" @|"sh -c 'for f in /etc/bacula/fileset.d/*.conf ; do echo @${f} ; done'" @|"sh -c 'for f in /etc/bacula/schedule.d/*.conf ; do echo @${f} ; done'" @|"sh -c 'for f in /etc/bacula/client.d/*.conf ; do echo @${f} ; done'" @|"sh -c 'for f in /etc/bacula/storage.d/*.conf ; do echo @${f} ; done'" @|"sh -c 'for f in /etc/bacula/messages.d/*.conf ; do echo @${f} ; done'" @|"sh -c 'for f in /etc/bacula/pool.d/*.conf ; do echo @${f} ; done'"
Описание хранилищ
В каталоге storage.d находятся конфигурационные файлы хранилищ к которым director имеет доступ:
Storage { Name = File # Имя хранилища Address = 10.10.50.49 # IP или FQN хранилища (если указать 127.0.0.1, то будет доступен только локальный backup) SDPort = 9103 # Порт @/etc/bacula/bacula-sd-password.conf # Пароль для доступа к хранилищу Device = FileStorage Media Type = File }
Описание наборов файлов
В каталоге fileset.d находятся описания списков файлов для резервирования:
catalog.conf: # Описывает резервирование дампа базы данных bacula FileSet { Name = "Catalog" Include { Options { signature = MD5 } File = /var/lib/bacula/bacula.sql } }
fullset.conf: # Полный бэкап системы FileSet { Name = "Full Set" Include { # Какие файлы включать Options { signature = MD5 } File = / } Exclude { # Какие файлы не включать в бэкап File = /proc File = /sys File = /dev File = /tmp File = /.journal File = /.fsck } }
Описание задач
В каталоге job.d описываются задания резервирования.
backupcatalog.conf - Делает дамп базы и резервирует его:
Job { Name = "BackupCatalog" # Имя JobDefs = "DefaultJob" # Используемый шаблон Level = Full FileSet="Catalog" # Список файлов для бэкапа Schedule = "WeeklyCycleAfterBackup" # Расписание RunBeforeJob = "/usr/share/bacula/scripts/make_catalog_backup" # Скрипт выполняемый до бэкапа (создает дамп базы) RunAfterJob = "/usr/share/bacula/scripts/delete_catalog_backup" # Скрипт выполняемый после бэкапа (удаляет дамп базы) Write Bootstrap = "/var/lib/bacula/BackupCatalog.bsr" # файл необходимый для востановления Priority = 11 # Очередность выполнения }
bacula.conf - делает полный бэкап:
Job { Name = "BackupFullSet" JobDefs = "DefaultJob" Schedule = "WeeklyCycle" Write Bootstrap = "/var/lib/bacula/Client1.bsr" }
defaultjob.conf - описывает параметры задачи по умочанию:
JobDefs { Name = "DefaultJob" # Имя Type = Backup # Тип Level = Incremental # Вид бэкапа Client = fd # Клиент с которого нужно сделать бэкап FileSet = "Full Set" # Список файлов Storage = File # Хранилище Messages = Standard Pool = Default Priority = 10 # Приоритет }
restore.conf - восстанавливает файлы:
Job { Name = "RestoreFiles" # Имя задачи Type = Restore # Тип Client=fd # Клиент на котором востанавливать файлы FileSet="Full Set" # Набор файлов Storage = File # Хранилище Pool = Default Messages = Standard Where = /tmp/bacula-restores # Папка куда востанавливать файлы }
Описание пулов
Пул объединяет в себе несколько томов, чтобы отдельная резервная копия не была ограничена объемом тома.
Том это отдельная единица в которую ведется запись, может быть файлом или ленточкой.
default.conf - описывает пул по умолчанию:
Pool { Name = Default # Имя Pool Type = Backup # Тип Recycle = yes # Разрешает bacula удалять задания из томов AutoPrune = yes # Разрешает bacula очищать тома Volume Retention = 365 days # Время в течении которого bacula не будет очищать том LabelFormat = "b" # Формат меток (в случае с файлами - имена файлов) }
Описание клиентов
В файле client1.conf описан локальный клиент:
Client { Name = fd # Имя клиента Address = 127.0.0.1 # IP или FQN FDPort = 9102 # Порт Catalog = MyCatalog # Используемый каталог @/etc/bacula/bacula-fd-password.conf # Пароль для доступа к клиенту File Retention = 30 days # Срок хранения метаданных о файлах Job Retention = 6 months # Срок хранения метаданных о задачах AutoPrune = yes # Автоматическое удаление устаревших метаданных }
Добавим удаленного клиента с IP 10.10.50.50, для этого создадим файл client2.conf следующего содержания:
Client { Name = fd2 Address = 10.10.50.50 FDPort = 9102 Catalog = MyCatalog Password = "Pa$$wordClient2" File Retention = 30 days Job Retention = 6 months AutoPrune = yes }
Проверка конфигурационных файлов
Проверить корректность конфигурационных файлов bacula director можно так:
# bacula-dir -t -c /etc/bacula/bacula-dir.conf
Автозапуск сервиса
Запустим и добавим в автозапуск сервис:
# systemctl start bacula-dir # systemctl enable bacula-dir
Настройка Storage
Основной файл конфигурации хранилищ находится это /etc/bacula/bacula-sd.conf, также к нему присоединяются все файлы из каталога device.d
По умочанию этот файл выглядит так:
Storage { Name = sd # Имя хранилища SDPort = 9103 # Порт WorkingDirectory = "/var/lib/bacula" Pid Directory = "/var/run/bacula" Maximum Concurrent Jobs = 20 } Director { Name = dir # Имя director, который может подсоединяться к этому хранилищу @/etc/bacula/bacula-sd-password.conf # Файл с паролем к хранилищу } @|"sh -c 'for f in /etc/bacula/device.d/*.conf ; do echo @${f} ; done'" Messages { Name = Standard director = dir = all }
В каталоге device.d находится файл с описанием устройства:
Device { Name = FileStorage # Имя устройства Media Type = File # Тип устройства Archive Device = /srv/backup # Папка для хранения LabelMedia = yes; Random Access = Yes; AutomaticMount = yes; RemovableMedia = no; AlwaysOpen = no; }
Каталог /srv/backup должнен существовать и принадлежать пользователю bacula:
# mkdir /srv/backup # chown bacula:bacula /srv/backup
Запустим и добавим в автозагрузку сервис:
# systemctl start bacula-sd # systemctl enable bacula-sd
Настройка File Daemon
Установим необходимые пакеты:
# apt-get install bacula7-client
Конфигурационный файл клиента находится по адресу /etc/bacula/bacula-fd.conf:
# Список directors, которые могут подключаться к клиенту Director { Name = dir Password = "Pa$$wordClient2" } FileDaemon { Name = fd2 FDport = 9102 WorkingDirectory = /var/lib/bacula Pid Directory = /var/run/bacula Maximum Concurrent Jobs = 20 }
Запустим и добавим в автозагрузку сервис:
# systemctl start bacula-fd # systemctl enable bacula-fd
Проверка работоспособности
Для управления bacula используется специальная утилита bconsole.
# bconsole Connecting to Director 127.0.0.1:9101 1000 OK: 102 dir Version: 7.4.7 (16 March 2017) Enter a period to cancel a command.
Для проcмотра статуса всех компонентов введем status:
*status Status available for: 1: Director 2: Storage 3: Client 4: Scheduled 5: All Select daemon type for status (1-5): 5
Создание резервной копии
# bconsole Connecting to Director 127.0.0.1:9101 1000 OK: 102 dir Version: 7.4.7 (16 March 2017) Enter a period to cancel a command. *run Automatically selected Catalog: MyCatalog Using Catalog "MyCatalog" A job name must be specified. The defined Job resources are: 1: BackupCatalog 2: BackupFullSet 3: RestoreFiles Select Job resource (1-3): 2 Run Backup job JobName: BackupFullSet Level: Incremental Client: fd FileSet: Full Set Pool: Default (From Job resource) Storage: File (From Job resource) When: 2017-07-10 16:00:54 Priority: 10 OK to run? (yes/mod/no): mod Parameters to modify: 1: Level 2: Storage 3: Job 4: FileSet 5: Client 6: When 7: Priority 8: Pool 9: Plugin Options Select parameter to modify (1-9): 5 The defined Client resources are: 1: fd 2: fd2 Select Client (File daemon) resource (1-2): 2 Run Backup job JobName: BackupFullSet Level: Incremental Client: fd2 FileSet: Full Set Pool: Default (From Job resource) Storage: File (From Job resource) When: 2017-07-10 16:00:54 Priority: 10 OK to run? (yes/mod/no): yes Job queued. JobId=1
За ходом выолнения можно наблюдать выбрав статус director:
# bconsole *status Status available for: 1: Director 2: Storage 3: Client 4: Scheduled 5: All Select daemon type for status (1-5): 1 dir Version: 7.4.7 (16 March 2017) x86_64-alt-linux-gnu redhat Daemon started 10-ию-2017 16:22, conf reloaded 10-июл-2017 16:22:18 Jobs: run=0, running=1 mode=0 Heap: heap=389,120 smbytes=71,240 max_bytes=71,612 bufs=249 max_bufs=255 Scheduled Jobs: Level Type Pri Scheduled Job Name Volume =================================================================================== Incremental Backup 10 10-ию-2017 23:05 BackupFullSet b0001 Full Backup 11 10-ию-2017 23:10 BackupCatalog b0001 ==== Running Jobs: Console connected at 10-ию-2017 16:22 JobId Type Level Files Bytes Name Status ====================================================================== 2 Back Full 0 0 BackupFullSet is running ==== No Terminated Jobs. ====
Востановление из резервной копии
# bconsole *restore Automatically selected Catalog: MyCatalog Using Catalog "MyCatalog" First you select one or more JobIds that contain files to be restored. You will be presented several methods of specifying the JobIds. Then you will be allowed to select which files from those JobIds are to be restored. To select the JobIds, you have the following choices: 1: List last 20 Jobs run 2: List Jobs where a given File is saved 3: Enter list of comma separated JobIds to select 4: Enter SQL list command 5: Select the most recent backup for a client 6: Select backup for a client before a specified time 7: Enter a list of files to restore 8: Enter a list of files to restore before a specified time 9: Find the JobIds of the most recent backup for a client 10: Find the JobIds for a backup for a client before a specified time 11: Enter a list of directories to restore for found JobIds 12: Select full restore to a specified Job date 13: Cancel
Выбираем 1 пункт - показать последнии 20 задач
Select item: (1-13): 1 +-------+--------+---------------------+----------+----------+---------------+ | JobId | Client | StartTime | JobLevel | JobFiles | JobBytes | +-------+--------+---------------------+----------+----------+---------------+ | 2 | fd2 | 2017-07-10 16:22:47 | F | 49995 | 1194397517 | +-------+--------+---------------------+----------+----------+---------------+ To select the JobIds, you have the following choices: 1: List last 20 Jobs run 2: List Jobs where a given File is saved 3: Enter list of comma separated JobIds to select 4: Enter SQL list command 5: Select the most recent backup for a client 6: Select backup for a client before a specified time 7: Enter a list of files to restore 8: Enter a list of files to restore before a specified time 9: Find the JobIds of the most recent backup for a client 10: Find the JobIds for a backup for a client before a specified time 11: Enter a list of directories to restore for found JobIds 12: Select full restore to a specified Job date 13: Cancel
Выбираем 3 пункт - ввести номера задач через запятую и вводим номер задачи 2
Select item: (1-13): 3 Enter JobId(s), comma separated, to restore: 2 You have selected the following JobId: 2 Building directory tree for JobId(s) 2 ... ++++++++++++++++++++++++++++++++++++++++++++ 44,444 files inserted into the tree. You are now entering file selection mode where you add (mark) and remove (unmark) files to be restored. No files are initially added, unless you used the "all" keyword on the command line. Enter "done" to leave this mode.
Bacula построит дерево файлов в котором мы можем выбрать файлы для востановления.
Выберем файлы в каталоге /etc
cwd is: / $ mark etc 1,933 files marked. $ done Bootstrap records written to /var/lib/bacula/dir.restore.1.bsr Bootstrap records written to /var/lib/bacula/dir.restore.1.bsr The Job will require the following (*=>InChanger): Volume(s) Storage(s) SD Device(s) =========================================================================== b0001 File FileStorage Volumes marked with "*" are in the Autochanger. 1,933 files selected to be restored.
Выберем клиента для востановления:
Defined Clients: 1: fd 2: fd2 Select the Client (1-2): 2
Проверим все параметры задачи и запустим её:
Using Catalog "MyCatalog" Run Restore job JobName: RestoreFiles Bootstrap: /var/lib/bacula/dir.restore.1.bsr Where: /tmp/bacula-restores Replace: Always FileSet: Full Set Backup Client: fd2 Restore Client: fd2 Storage: File When: 2017-07-10 16:33:04 Catalog: MyCatalog Priority: 10 Plugin Options: OK to run? (yes/mod/no): yes Job queued. JobId=3 *
Файлы востановленны в каталог /tmp/bacula-restores
Настройка Bacula для PostgreSQL
Настройка клиента
На клиенте в каталоге /etc/bacula создадим следующие скрипты:
pre-base-backup.sh:
#!/bin/bash
DATE=`date +"%b %d %T"`
/usr/bin/pg_basebackup -D /var/lib/pgsql/backup -F t -z -U postgres -w -c fast -l "pg_basebackup ${DATE}"
Этот скрипт создает полную копию базы данных и выполняется перед выполнением задачи резервного копирования базы.
post-base-backup.sh:
#!/bin/bash
rm -f /var/lib/pgsql/backup/*
Этот скрипт удаляет созданную копию базы данных и будет выполнен после задачи резервного копирования базы.
pre-logs-backup.sh:
#!/bin/bash
touch /var/lib/pgsql/backup_in_progress
Этот скрипт создает файл backup_in_progress и выполняется перед выполнением задачи резервного копирования журналов. Этот файл нужен, чтобы во время резервного копирования PostgreSQL не архивировал новые журналы (copy_wal.sh)
post-logs-backup.sh:
#!/bin/bash
rm -f /var/lib/pgsql/wals/*
rm -f /var/lib/pgsql/backup_in_progress
Этот скрипт очищает каталог с журналами и файл backup_in_progress, и будет выполнен после задачи резервного копирования журналов. Далее необходимо сделать эти скрипты исполняемыми:
# chmod 750 pre-base-backup.sh # chmod 750 post-logs-backup.sh # chmod 750 post-base-backup.sh # chmod 750 pre-logs-backup.sh
На этом настройка клиента завершена.
Настройка сервера
Для онлайн резервного копирования PostgreSQL необходимо добавить в Bacula клиента и создать для него задачи. В этом примере рассмотрим настройку на примере клиента zabbix-fd.
Списки файлов
Создадим списки файлов для резервного копирования в каталоге /etc/bacula/fileset.d:
Список для копирования полной резервной копии базы PGSQL-Full-Base-set.conf:
FileSet { Name = "PGSQL-Full-Base-set" Include { Options { signature = MD5 Sparse = yes aclsupport = yes xattrsupport = yes } File = "/var/lib/pgsql/backup" } }
Журналы
Список для копирования журналов PGSQL-Logs-set.conf:
FileSet { Name = "PGSQL-Logs-set" Include { Options { signature = MD5 Sparse = yes aclsupport = yes xattrsupport = yes } File = "/var/lib/pgsql/wals" } }
Пул
Создадим отдельный пул для наших бекапов в каталоге /etc/bacula/pool.d:
Файл zabbix.conf:
Pool { Name = Zabbix Pool Type = Backup Recycle = yes AutoPrune = yes Volume Retention = 365 days LabelFormat = "zabbix" }
Расписания
Создадим расписания для резервирования базы и журналов в каталоге /etc/bacula/schedule.d:
Файл PGSQL-Full-Base-Cycle.conf:
Schedule { Name = "PGSQL-Full-Base-Cycle" Run = Full sun at 01:00 # задание будет выполнять полный бэкап каждое воскресенье в 01:00 }
файл PGSQL-Logs-Cycle.conf:
Schedule { Name = "PGSQL-Logs-Cycle" Run = Incremental mon-sat at 01:30 # задание будет выполнять инкрементальный бэкап каждый день с пн-сб в 01:30 }
Задачи
Создадим задачи резервного копирования в каталоге /etc/bacula/job.d:
Задача резервного копирования базы zabbix-pgsql-base-fd.conf:
Job { Name = "zabbix-pgsql-base-fd" JobDefs = "DefaultJob" Client = zabbix-fd FileSet = "PGSQL-Full-Base-set" Accurate = no Pool = Zabbix Priority = 10 # приоритет выполнения задачи Schedule = "PGSQL-Full-Base-Cycle" ClientRunBeforeJob = "/etc/bacula/pre-base-backup.sh" # скрипт выполняющийся до задачи ClientRunAfterJob = "/etc/bacula/post-base-backup.sh" # скрипт выполняющийся после задачи }
Задача резервного копирования журналов zabbix-pgsql-logs-fd.conf:
Job { Name = "zabbix-pgsql-logs-fd" JobDefs = "DefaultJob" Client = zabbix-fd FileSet = "PGSQL-Logs-set" Accurate = no Pool = Zabbix Priority = 11 # приоритет ниже чем у задачи резервного копирования базы Schedule = "PGSQL-Logs-Cycle" ClientRunBeforeJob = "/etc/bacula/pre-logs-backup.sh" # скрипт выполняющийся до задачи ClientRunAfterJob = "/etc/bacula/post-logs-backup.sh"# скрипт выполняющийся после задачи }
Теперь необходимо перезапустить сервис Bacula Director:
# systemctl restart bacula-dir