воскресенье, 27 октября 2013 г.

Резервирование резервных копий БД MySQL с помощью Bacula

У меня есть сервер Bacula, который мы назовем, например bacula-server, на котором находится основой director и storage daemon и куча клиентских машин. На нескольких из них крутятся MySQL сервера. 

Задача: настроить резервирование дампов базы MySQL. 
Правда, если честно, я не уверен, что решил ее самым правильным и элегантным способом, поскольку с bacula имел дело впервые.


Делать будем следующим образом: задание bacula будет запускать скрипт, который формирует дампы БД MySQL, резервировать их, а после этого удалять.

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

Устанавливаем клиентское приложение bacula-client
apt-get update
apt-get install bacula-client
Изменяем конфигурационный файл /etc/bacula/bacula-fd.conf
Director {
  Name = 
<Название директора> #указываем имя директора, который будет присылать задания этому клиенту
  Password = "
<длинный пароль>" #этот пароль потом нужно будет внести на сервер
}
FileDaemon {                      
  Name =
<Название клиента>
  FDport = 9102                  
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /var/run/bacula
  Maximum Concurrent Jobs = 20
  FDAddress = 
}
После этого перезапускаем bacula /etc/init.d/bacula-fd restart

Если нужно, добавить разрешение в firewall, чтобы открыть 9102 порт

ufw allow proto tcp from <ip адрес директора> to any port 9102

Добавляем в MySQL пользователя, который сможет делать резервные копии БД:

GRANT SELECT, LOCK TABLES on *.* TO dumper@localhost IDENTIFIED BY '<пароль>';

Создаем скрипты, которые будет использовать bacula

mkdir /var/backups/mysql/
chmod +x /usr/bin/mysql.backup.sh 
nano /usr/bin/mysql.backup.sh

Это скрипт, который будет создавать дампы
#!/bin/sh
#dump databases
/usr/bin/mysqldump --user=dumper --password=<пароль> <название бд> | gzip > /var/backups/mysql/название бд-`date "+%Y-%m-%d"`.sql.gz

nano /usr/bin/mysql.backup.clear.sh
chmod +x /usr/bin/mysql.backup.clear.sh  
 А этот скрипт будет очищать папку с дампами, которые уже скопированы
#!/bin/sh#Clear dir /var/backup/mysql/bin/rm /var/backup/mysql/*
Серверная сторона

Для начала нам необходим добавить в конфиг /etc/bacula/bacula-dir.conf секции JobDefs, FileSet, Shedule, Storage, Pool. Мы сделаем это один раз и сформируем шаблон, который позволит быстро и удобно добавлять клиентские машины:

Хранилище
Storage {  Name = MySQLStorage-dir  Address = <ip адрес storage daemon> # он обязательно должен быть доступен с клиента               SDPort = 9103  Password = "<пароль storage daemon>"
  Device = MySQLStorage  Media Type = File}
Список файлов
FileSet {  Name = "MySQLDumpFileSet"  Include {    Options {      signature = MD5    }    File = /var/backups/mysql/  }}
Расписание
Schedule {
  Name = "MySQLDaily"
  Run = Full mon-sun at 01:30
}
Пул
Pool {  Name = MySQLPool  Pool Type = Backup  Recycle = yes  AutoPrune = yes  Label Format = MySQLAutoVol-  Volume Retention = 1 months  Maximum Volume Jobs = 1  Maximum Volume Bytes = 2G  Maximum Volumes = 100}
Теперь из всего этого мы сможем сформировать шаблон задания
JobDefs {
  Name = "BackupMySQLDump"
  Type = Backup
  Level = Full
  FileSet = "MySQLDumpFileSet"
  Schedule = "MySQLDaily"
  Storage = MySQLStorage-dir
  Messages = Standard
  Pool = MySQLPool
  Priority = 10
  ClientRunBeforeJob = /usr/bin/mysql.backup.sh
  ClientRunAfterJob = /usr/bin/mysql.backup.clear.sh
  Write Bootstrap = "/var/lib/bacula/%c.bsr"
}
Далее добавление каждого клиентского сервера будет довольно простым: нужно будет добавить секции Job и Client
Задание
Job {
  Name = "<Название задания>
  JobDefs = "BackupMySQLDump" #Наследуется от BackupMySQLDump
  Client = <Название клиента>
}
И сразу задание на восстановление
Job {
  Name = "<Название задания>
  Type = Restore
  Client=Forge-fd
  FileSet="MySQLDumpFileSet"
  Storage = MySQLStorage-dir
  Pool = MySQLPool
  Messages = Standard
  Where = /var/restore/
}
Клиент
Client {
  Name =
<Название клиента>
  Address =  
  FDPort = 9102
  Catalog = MegapolisCatalog
  Password = "<длинный пароль>"          #тот самый пароль с клиента
}
 Перезапускаем bacula
/etc/init.d/bacula-director restart
Теперь можно в bacula console (на сервере) проверить соединение с клиентом
bconsole
status client
<выбрать клиента>

Комментариев нет:

Отправить комментарий