Строительство для производства: веб-приложения - резервные копии

Вступление

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

Backup Diagram

Такие решения, какDigitalOcean Droplet Backups (резервные копии моментальных снимков всей вашей капли) легко настраиваются и могут быть достаточными для ваших нужд, если вам требуется только еженедельное резервное копирование. Если вы выберете DigitalOcean Backups, обязательно настройте горячее резервное копирование своей базы данных, следуя разделуCreate Hot Backups of Your Database.

В этой части руководства мы настроим Bacula для ежедневного резервного копированияrequired backupsсерверов, составляющих настройку вашего приложения (db1, app1, app2 и lb1), определенных ранее в нашем плане восстановления - По сути, это руководство, которое показывает вам, как использовать Bacula для создания резервных копий стека LAMP. Мы также будем использовать Percona XtraBackup для создания горячих резервных копий вашей базы данных MySQL. Наконец, мы будем использовать rsync для создания копии ваших резервных копий на сервере в удаленном центре обработки данных. Это добавит к вашей настройке два сервера:backups иremotebackups (расположенные в отдельном центре обработки данных).

Давайте начнем.

Установите Bacula на сервер резервного копирования

Настройте Bacula на сервереbackups, следуя этому руководству:How To Install Bacula Server on Ubuntu 14.04.

Затем следуйте разделуOrganize Bacula Director Configuration (Server) этого руководства:How To Back Up an Ubuntu 14.04 Server with Bacula. Имя Директора вам понадобится при настройке клиентов Bacula (на серверах, для которых вы хотите создать резервную копию). Остановитесь, когда дойдете до разделаInstall and Configure Bacula Client.

Обратите внимание, что мы будем использовать пул RemoteFile для всех заданий резервного копирования, которые мы будем настраивать. С учетом сказанного, вы можете изменить некоторые настройки, прежде чем продолжить.

Установите клиент Bacula на каждом сервере

Установите клиент Bacula на каждый сервер, для которого требуется создать резервную копию (db1, app1, app2 и lb1), следуя разделуInstall and Configure Bacula Client этого руководства:How To Back Up an Ubuntu 14.04 Server with Bacula. Остановитесь, когда дойдете до разделаAdd FileSets (Server).

Обратите внимание, что вам понадобятсяFileDaemon Name (обычно имя хоста, добавляемое с помощью «-fd») иDirector Password (пароль, который сервер Bacula будет использовать для подключения к каждому клиенту) изbacula-fd.conf файл на каждом сервере.

Добавление клиентов Bacula на сервер резервного копирования

Наbackups, сервере Bacula, добавьтеClient resource в файл/etc/bacula/conf.d/clients.conf для каждого сервера, на котором вы установили клиент Bacula.

Откройте файлclients.conf:

sudo vi /etc/bacula/conf.d/clients.conf

Вот пример определения клиентского ресурса для сервера базы данных,db1. Обратите внимание, что значениеName должно соответствовать имени ресурсаFileDaemon, аPassword должно соответствовать паролю ресурсаDirector на клиентском сервере - эти значения можно найти в/etc/bacula/bacula-fd.conf на каждом клиентском сервере Bacula:

clients.conf — Example Client resource definition

Client {
  Name = db1-fd
  Address = db1.nyc3.example.com
  FDPort = 9102
  Catalog = MyCatalog
  Password = "PDL47XPnjI0QzRpZVJKCDJ_xqlMOp4k46"          # password for Remote FileDaemon
  File Retention = 30 days            # 30 days
  Job Retention = 6 months            # six months
  AutoPrune = yes                     # Prune expired Jobs/Files
}

Создайте аналогичный клиентский ресурс для каждого из оставшихся клиентских серверов Bacula. В нашем примере, когда мы закончим, должно быть четыре клиентских ресурса:db1-fd,app1-fd,app2-fd иlb1-fd. Это настраивает Bacula Director на сервереbackups так, чтобы он мог подключаться к клиенту Bacula на каждом сервере.

Сохранить и выйти.

Более подробную информацию об этом разделе можно найти вInstall and Configure Bacula Client вHow To Back Up an Ubuntu Server with Bacula tutorial.

Создавайте горячие резервные копии вашей базы данных

Чтобы гарантировать, что мы производим последовательный (т.е. резервное копирование нашей активной базы данных, особое внимание должно быть уделено. Простой и эффективный способ создания горячих резервных копий с MySQL - это использовать Percona XtraBackup.

Установите Percona XtraBackup

На сервере базы данныхdb1 установите и настройте Percona XtraBackup, следуя этому руководству:How To Create Hot Backups of MySQL Databases with Percona XtraBackup on Ubuntu 14.04. Остановитесь, когда дойдете до разделаPerform Full Hot Backup.

Создать скрипт XtraBackup

Percona XtraBackup готова создавать горячие резервные копии вашей базы данных MySQL, которые в конечном итоге будут создаваться резервными копиями Bacula (или резервными копиями DigitalOcean), но горячие резервные копии должны быть запланированы каким-либо образом. Мы создадим самое простое решение: скрипт bash и задание cron.

Создайте сценарий bash с именемrun_extra_backup.sh в/usr/local/bin:

sudo vi /usr/local/bin/run_xtrabackup.sh

Добавьте следующий скрипт. Обязательно замените пользователя и пароль тем, что вы установили при установке XtraBackup:

/usr/local/bin/run_xtrabackup.sh

#!/bin/bash

# pre xtrabackup
chown -R mysql: /var/lib/mysql
find /var/lib/mysql -type d -exec chmod 770 "{}" \;

# delete existing full backup
rm -r /data/backups/full

# xtrabackup create backup
innobackupex --user=bkpuser  --password=bkppassword --no-timestamp /data/backups/full

# xtrabackup prepare backup
innobackupex --apply-log /data/backups/full

Сохранить и выйти. Запуск этого сценария (с привилегиями суперпользователя) удалит существующую резервную копию XtraBackup в/data/backups/full и создаст новую полную резервную копию. Более подробную информацию о создании резервных копий с помощью XtraBackup можно найти в разделеPerform Full Hot Backup руководства по XtraBackup.

Сделайте скрипт исполняемым:

sudo chmod +x /usr/local/bin/run_xtrabackup.sh

Чтобы правильно сделать резервную копию нашей базы данных, мы должны запустить (и завершить) сценарий XtraBackup, прежде чем Bacula попытается выполнить резервное копирование сервера базы данных. Хорошее решение - настроить задание резервного копирования Bacula на запуск сценария в качестве «сценария предварительного резервного копирования», но мы предпочтем использоватьcron job, чтобы это было проще.

Создайте файл конфигурации cron (файлы в/etc/cron.d добавляются в crontab root):

sudo vi /etc/cron.d/xtrabackup

Добавьте следующую работу cron:

/etc/cron.d/xtrabackup

30 22    * * *   root    /usr/local/bin/run_xtrabackup.sh

Это планирует запуск скрипта от имени root каждый день в 22:30 (22 час, 30 минута). Мы выбрали это время, потому что в настоящее время Bacula планирует запускать задания резервного копирования ежедневно в 23:05 - об этом мы поговорим позже. Это позволяет 35 минут для завершения сценария XtraBackup.

Теперь, когда настроено горячее резервное копирование базы данных, давайте посмотрим на наборы файлов резервных копий Bacula.

Настроить наборы файлов Bacula

Bacula создаст резервные копии файлов, указанных в наборах файлов, связанных с заданиями резервного копирования, которые будут выполнены. В этом разделе будет рассмотрено создание наборов файлов, включающихrequired backups, которые мы определили в наших планах восстановления. Более подробную информацию о добавлении наборов файлов в Bacula можно найти в разделеAdd FileSets (Server) руководства по Bacula.

На вашем сервереbackups откройте файлfilesets.conf:

sudo vi /etc/bacula/conf.d/filesets.conf

FileSet сервера базы данных

Необходимые резервные копии для нашего сервера базы данных, в соответствии с нашим планом восстановления сервера базы данных, включают в себя:

  • MySQL database: резервная копия создается нашим скриптом XtraBackup в/data/backups/full, ежедневно в 22:30

  • MySQL configuration: находится в/etc/mysql

Мы также включим сценарий XtraBackup:/usr/local/bin/run_xtrabackup.sh и связанный с ним файл cron.

Учитывая наши необходимые резервные копии, мы добавим этот набор файлов «MySQL Database» в нашу конфигурацию Bacula:

filesets.conf — MySQL Database

FileSet {
  Name = "MySQL Database"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /data/backups
    File = /etc/mysql/my.cnf
    File = /usr/local/bin/run_xtrabackup.sh
    File = /etc/cron.d/xtrabackup
  }
  Exclude {
    File = /data/backups/exclude
  }
}

Теперь перейдем к серверу приложений FileSet.

FileSet сервера приложений

Необходимые резервные копии для наших серверов приложений, в соответствии с нашим планом восстановления сервера приложений, включают в себя:

  • Application Files: находится в/var/www/html в нашем примере

Учитывая наши необходимые резервные копии, мы добавим этот набор файлов Apache DocumentRoot в нашу конфигурацию Bacula:

filesets.conf — Apache DocumentRoot

FileSet {
  Name = "Apache DocumentRoot"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /var/www/html
  }
  Exclude {
    File = /var/www/html/exclude
  }
}

Вы можете также включить файл конфигурации портов Apache, но его легко заменить.

Теперь перейдем к серверу балансировки нагрузки FileSet.

FileSet сервера балансировки нагрузки

Необходимые резервные копии для наших серверов балансировки нагрузки, согласно нашему плану восстановления сервера балансировки нагрузки, включают:

  • SSL Certificate (PEM) and related files: находится в/root/certs в нашем примере

  • HAProxy configuration file: находится в/etc/haproxy

Учитывая наши необходимые резервные копии, мы добавим этот набор файлов Apache DocumentRoot в нашу конфигурацию Bacula:

filesets.conf — SSL Certs and HAProxy Config

FileSet {
  Name = "SSL Certs and HAProxy Config"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /root/certs
    File = /etc/haproxy
  }
  Exclude {
    File = /root/exclude
  }
}

Сохранить и выйти.

Теперь наши FileSets настроены. Перейдем к созданию заданий резервного копирования Bacula, которые будут использовать эти наборы файлов.

Создание резервных заданий Bacula

Мы создадим задания резервного копирования Bacula, которые будут выполняться, и создадим резервные копии наших серверов.

Создайте файлjobs.conf в/etc/bacula/conf.d:

sudo vi /etc/bacula/conf.d/jobs.conf

Задание резервного копирования сервера базы данных

Для нашего задания резервного копирования сервера базы данных мы создадим новое задание с именем «Backup db1». Здесь важно указать правильныеClient (db1-fd) иFileSet (база данных MySQL):

jobs.conf — Backup db1

Job {
  Name = "Backup db1"
  JobDefs = "DefaultJob"
  Client = db1-fd
  Pool = RemoteFile
  FileSet="MySQL Database"
}

Теперь мы настроим задания резервного копирования сервера приложений.

Задания резервного копирования сервера приложений

Для наших серверов приложений мы создадим два задания резервного копирования с именами «Приложение резервного копирования 1» и «Приложение резервного копирования 2». Здесь важно указать правильныеClients (app1-fd и app2-fd) иFileSet (Apache DocumentRoot).

App1 работа:

jobs.conf — Backup app1

Job {
  Name = "Backup app1"
  JobDefs = "DefaultJob"
  Client = app1-fd
  Pool = RemoteFile
  FileSet="Apache DocumentRoot"
}

App2 работа:

jobs.conf — Backup app2

Job {
  Name = "Backup app2"
  JobDefs = "DefaultJob"
  Client = app2-fd
  Pool = RemoteFile
  FileSet="Apache DocumentRoot"
}

Теперь мы настроим задание резервного копирования сервера балансировки нагрузки.

Задание резервного копирования сервера балансировки нагрузки

Для нашего задания резервного копирования сервера балансировки нагрузки мы создадим новое задание с именем «Backup lb1». Здесь важно указать правильныеClient (lb1-fd) иFileSet (SSL-сертификаты и HAProxy Config):

jobs.conf — Backup lb1

Job {
  Name = "Backup lb1"
  JobDefs = "DefaultJob"
  Client = lb1-fd
  Pool = RemoteFile
  FileSet="SSL Certs and HAProxy Config"
}

Сохранить и выйти.

Теперь наши резервные задания настроены. Последний шаг - перезапустить Bacula Director.

Перезагрузите Bacula Director

На сервереbackups перезапустите Bacula Director, чтобы все наши изменения вступили в силу:

sudo service bacula-director restart

На этом этапе вы захотите протестировать свои клиентские соединения и задания резервного копирования, оба из которых описаны вHow To Back Up a Server with Bacula tutorial. В этом руководстве также рассказывается, как восстановить резервные копии Bacula. Обратите внимание, что для восстановления базы данных MySQL вам потребуется выполнить шагPerform Backup Restoration в руководстве Percona XtraBackup.

Расписание резервного копирования

График резервного копирования Bacula можно настроить, изменив конфигурацию Bacula Director (/etc/bacula/bacula-dir.conf). Все созданные нами задания резервного копирования используют JobDef «DefaultJob», который использует расписание «WeeklyCycle», которое определяется как:

  • Полное резервное копирование в первое воскресенье месяца в 23:05.

  • Разностные резервные копии по всем остальным воскресеньям в 23:05

  • Инкрементные резервные копии в другие дни, с понедельника по субботу, в 23:05

Вы можете проверить это с помощью консоли Bacula, чтобы проверить статус директора. Он должен вывести все ваши запланированные задания:

Director Status — Scheduled JobsScheduled Jobs:
Level          Type     Pri  Scheduled          Name               Volume
===================================================================================
Incremental    Backup    10  20-May-15 23:05    BackupLocalFiles   MyVolume
Incremental    Backup    10  20-May-15 23:05    Backup lb1         Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup app2        Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup app1        Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup db1         Remote-0002

Не стесняйтесь добавлять или настраивать расписание любых заданий резервного копирования. Было бы целесообразно изменить расписание серверов приложений так, чтобы оно происходило одновременно с выполнением сценария Percona XtraBackup (22:30). Это предотвратит несовместимость резервных копий приложения и базы данных.

Настройка удаленного резервного копирования

Теперь мы готовы настроить удаленный сервер, на котором будут храниться копии наших резервных копий Bacula. Этот удаленный сервер должен находиться в географически отдельном регионе, чтобы у вас была копия критических резервных копий, даже если в вашем производственном центре обработки данных произошла авария. В нашем примере мы будем использовать регион Сан-Франциско (SFO1) DigitalOcean для нашего сервераremotebackups.

Мы объясним простой метод отправки наших резервных копий с нашего сервераbackups на наш серверremotebackups с использованием открытых ключей SSH, rsync и cron.

На сервереremotebackupscreate a user, который будет использоваться для входа в систему rsync.

Затем на сервереbackups сгенерируйте пару ключей SSH без пароля от имени пользователя root. Установите открытый ключ только что созданного пользователяremotebackups. Это описано в нашем руководствеHow To Set Up SSH Keys.

На сервереbackups напишите команду rsync, которая копирует данные резервной копии Bacula (/bacula/backup) куда-нибудь на сервереremotebackups. Использование Rsync описано в нашихHow To Use Rsync tutorial. Команда, вероятно, будет выглядеть примерно так:

rsync -az /bacula/backup remoteuser@remotebackups_public_hostname_or_IP:/path/to/remote/backup

Добавьте команду в сценарий, например/usr/local/bin/rsync_backups.sh, и сделайте ее исполняемой.

Наконец, вы захотите настроить задание cron, которое запускает сценарийrsync_backups.sh от имени пользователя root после того, как обычно завершаются задания резервного копирования Bacula. Это описано в нашемHow To Schedule Routine Tasks With Cron tutorial.

После того, как вы все это настроили, убедитесь, что на следующий день есть копия ваших резервных копий на сервереremotebackups.

Другие соображения

Мы не говорили о требованиях к диску для ваших резервных копий. Вы определенно захотите проверить, сколько дискового пространства используется в ваших резервных копиях, и пересмотреть расписание установки и резервного копирования в соответствии с вашими потребностями и ресурсами.

Помимо создания резервных копий серверов приложений, вы, вероятно, захотите настроить резервные копии для любых других серверов, добавленных в ваши настройки. Например, вы должны настроить Bacula для создания резервных копий серверов мониторинга и централизованного ведения журналов, как только вы их запустите и запустите.

Заключение

Теперь у вас должны быть ежедневные резервные копии и удаленные копии этих резервных копий ваших рабочих серверов приложений. Убедитесь, что вы можете восстановить файлы, и добавьте шаги по восстановлению данных в свои планы восстановления.

Перейдите к следующему руководству, чтобы начать настройку мониторинга для вашего рабочего сервера:Building for Production: Web Applications — Monitoring.

Related