Bacula

Материал из ALT Linux Wiki

Бэкапы обстоятельно

Первым делом стоит понять, что Bacula — сложный продукт, пригодный для множества ситуаций, но за это приходится платить существенным вложением времени в освоение базовых вещей и соответствующее конфигурирование (отведите хотя бы неделю на базовое освоение и планирование тестовой инсталяции).

Если требуется создавать простую резервную копию — возможно, достаточно просто tar, rsync или несложных систем вроде rdiff-backup или bontmia. Но если надо работать с несколькими клиентами, стораджами, наборами данных, расписаниями бэкапа — лучше сразу посмотреть на 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
Внимание! Если у Вас включен SELinux, то на время настройки выключите его
Внимание! Если у Вас не запускается сервисы Bacula с ошибкой Cannot not open pid file.

Настройка базы данных 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
}

Автозапуск сервиса

Запустим и добавим в автозапуск сервис:

# 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

Настройка клиента

Внимание! Для работы с Bacula на сервере PostgreSQL должно быть настроено онлайн резервирование PITR)

На клиенте в каталоге /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

Ссылки