建设生产:Web应用程序 - 备份

在这部分“建设生产:Web应用程序”系列(6投4中),我们将设置所需支持我们的恢复计划备份系统。本教程将重点介绍如何使用Bacula的作为备份解决方案。使用一个完整的备份系统,如Bacula的,带来的好处是,它可以让你完全掌控你备份和还原在单个文件级别,你可以安排备份和还原根据什么是最适合你的。

介绍

在为您的应用程序的各个组件制定恢复计划后,您应该设置支持它所需的备份系统。 本教程将重点介绍使用Bacula作为备份解决方案。 使用完整备份系统(例如Bacula)的好处是,它可以完全控制您在单个文件级别备份和还原的内容,并且可以根据最适合的情况安排备份和恢复。

备份图

解决方案如DigitalOceanDroplet备份 (整个Droplet的快照备份)是很容易设置和可能足以满足您的需求,如果你只需要每周备份。 如果您选择DigitalOcean备份,请务必遵循创建数据库节热备份设置您的数据库热备份。

在教程的这一部分,我们将成立一个Bacula的维护构成应用程序的设置(DB1,APP1,APP2和LB1)服务器所需备份每日备份,在我们的恢复计划,基本上是以前定义的,这是一个教程,显示如何使用Bacula创建LAMP的备份。 我们还将使用Percona XtraBackup来创建MySQL数据库的热备份。 最后,我们将使用rsync在远程数据中心的服务器上创建备份的副本。 这将两台服务器添加到您的设置: 备份remotebackups(位于一个单独的数据中心)。

让我们开始吧。

在备份服务器上安装Bacula

按照本教程设置Bacula的备份服务器上: 如何在Ubuntu 14.04安装Bacula的服务器

然后按照本教程的组织Bacula的Director配置(服务器)部分: 如何备份一个Ubuntu 14.04服务器与Bacula的 在设置Bacula客户端(在要备份的服务器上)时,您将需要“Director”名称。 当你到达了安装和配置客户端Bacula的部分停止。

请注意,我们将使用RemoteFile池作为我们将要设置的所有备份作业。 有了这个,你可能想改变一些设置,然后继续。

在每个服务器上安装Bacula客户端

:要按照本教程的安装和配置客户端Bacula的部分备份(DB1,APP1,APP2和LB1)每个服务器上安装客户端Bacula的如何备份一个Ubuntu 14.04服务器与Bacula的 当你到达添加文件集(服务器)部分停止。

请注意,您将需要FileDaemon名称 (通常由“-fd”Stapling的主机名)和密码主任从(该Bacula的服务器将用于连接到每个客户的密码) bacula-fd.conf每台服务器上的文件。

将Bacula客户端添加到备份服务器

备份 ,Bacula的服务器,添加客户端资源/etc/bacula/conf.d/clients.conf为您安装的客户端Bacula的每台服务器上的文件。

打开clients.conf文件:

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

这里是数据库服务器,db1中的客户机资源定义的一个例子。 需要注意的是名称的值应该匹配的名称FileDaemon资源和密码应与主管资源的密码,客户端服务器的这些值中可以找到关于/etc/bacula/bacula-fd.conf每个Bacula客户端服务器:

clients.conf - 客户端资源定义示例
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客户端服务器创建一个类似的客户端资源。 在我们的例子,应该是当我们完成4客户资源:DB1-FD,APP1-FD,APP2-FDLB1-FD。 此配置Bacula的主任, 备份服务器上,才能够连接到客户端Bacula的每台服务器上..

保存并退出。

关于这部分的更多细节可以在安装和配置客户端Bacula的在中找到如何备份一个Ubuntu服务器Bacula的教程

创建数据库的热备份

为了确保我们对活动数据库生成一致(即可用)备份,必须特别注意。 使用MySQL创建热备份的一个简单而有效的方法是使用Percona XtraBackup。

安装Percona XtraBackup

在您的数据库服务器,DB1,安装并按照本教程中配置的Percona XtraBackup: 如何在Ubuntu 14.04与Percona的XtraBackup创建MySQL数据库的热备份 停止当你到达进行全热备份一节。

创建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创建备份的更多细节进行全热备份的的XtraBackup教程的部分。

使脚本可执行:

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

为了正确备份我们的数据库,我们必须在Bacula尝试备份数据库服务器之前运行(并完成)XtraBackup脚本。 一个好的解决办法是配置Bacula的备份作业来运行该脚本作为“备份前脚本”,但我们会选择使用cron作业 ,以保持它的简单。

创建一个cron配置文件(文件/etc/cron.d被添加到根的crontab):

sudo vi /etc/cron.d/xtrabackup

添加以下cron作业:

/etc/cron.d/xtrabackup
30 22    * * *   root    /usr/local/bin/run_xtrabackup.sh

这将调度脚本以root用户每天晚上10:30(第22小时,第30分钟)运行。 我们选择了这个时间,因为Bacula目前计划在每天下午11:05运行其备份作业 - 我们将在后面讨论调整。 这允许XtraBackup脚本完成35分钟。

现在,数据库热备份已设置,让我们看看Bacula备份FileSets。

配置Bacula FileSet

Bacula将创建在与将要执行的备份作业相关联的FileSets中指定的文件的备份。 本节将介绍创建文件集,包括我们在我们的恢复计划中确定的所需的备份 可以在中找到有关添加文件集Bacula的更多细节添加文件集(服务器)的Bacula的教程部分。

备份服务器上,打开filesets.conf文件:

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

数据库服务器FileSet

根据我们的数据库服务器恢复计划,我们的数据库服务器所需的备份包括:

  • MySQL数据库:备份副本是由我们XtraBackup脚本创建/data/backups/full日晚上10:30,每天
  • MySQL配置:位于/etc/mysql

我们也将包括XtraBackup脚本: /usr/local/bin/run_xtrabackup.sh和关联的cron文件。

考虑到我们需要的备份,我们将这个“MySQL数据库”FileSet添加到我们的Bacula配置:

filesets.conf - MySQL数据库
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

根据我们的应用服务器恢复计划,我们的应用服务器所需的备份包括:

  • 应用程序文件:位于/var/www/html在我们的例子

考虑到我们所需的备份,我们将把这个“Apache DocumentRoot”FileSet添加到我们的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证书(PEM)和相关文件:位于/root/certs在我们的例子
  • HAProxy的配置文件:位于/etc/haproxy

考虑到我们所需的备份,我们将把这个“Apache DocumentRoot”FileSet添加到我们的Bacula配置中:

filesets.conf - SSL证书和HAProxy配置
FileSet {
  Name = "SSL Certs and HAProxy Config"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /root/certs
    File = /etc/haproxy
  }
  Exclude {
    File = /root/exclude
  }
}

保存并退出。

现在我们的FileSet被配置。 让我们继续创建将使用这些FileSet的Bacula备份作业。

创建Bacula备份作业

我们将创建Bacula备份作业,将运行和创建我们的服务器的备份。

创建一个jobs.conf文件/etc/bacula/conf.d

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

数据库服务器备份作业

对于我们的数据库服务器备份作业,我们将创建一个名为“备份db1”的新作业。 这里最重要的是,我们指定了正确的客户端 (DB1-FD)和文件集 (MySQL数据库):

jobs.conf - 备份db1
Job {
  Name = "Backup db1"
  JobDefs = "DefaultJob"
  Client = db1-fd
  Pool = RemoteFile
  FileSet="MySQL Database"
}

现在我们将设置应用程序服务器备份作业。

应用程序服务器备份作业

对于我们的应用服务器,我们将创建两个名为“备份app1”和“备份app2”的备份作业。 这里最重要的是,我们指定了正确的客户端 (APP1-FD和app2的-FD)和文件集 (Apache的DocumentRoot的)。

App1工作:

jobs.conf - 备份app1
Job {
  Name = "Backup app1"
  JobDefs = "DefaultJob"
  Client = app1-fd
  Pool = RemoteFile
  FileSet="Apache DocumentRoot"
}

App2工作:

jobs.conf - 备份app2
Job {
  Name = "Backup app2"
  JobDefs = "DefaultJob"
  Client = app2-fd
  Pool = RemoteFile
  FileSet="Apache DocumentRoot"
}

现在我们将设置负载均衡器服务器备份作业。

负载平衡器服务器备份作业

对于我们的负载均衡器服务器备份作业,我们将创建一个名为“备份lb1”的新作业。 这里最重要的是,我们指定了正确的客户端 (LB1-FD)和文件集 (SSL证书和HAProxy的配置):

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

保存并退出。

现在我们配置了备份作业。 最后一步是重新启动Bacula Director。

重新启动Bacula Director

备份服务器上,重新启动Bacula的主任把我们所有的更改生效:

sudo service bacula-director restart

在这一点上,你会想测试你的客户端连接和备份工作,这两者都覆盖在如何备份服务器与Bacula的教程 该教程还包括如何恢复Bacula备份。 请注意,还原MySQL数据库将要求您遵守执行备份恢复的Percona的XtraBackup教程一步。

查看备份计划

所述Bacula的备份时间表可以通过修改Bacula的Director配置(被调整/etc/bacula/bacula-dir.conf )。 我们创建的所有备份作业都使用“DefaultJob”JobDef,它使用“WeeklyCycle”计划,定义为:

  • 一个月的第一个星期日下午11:05完全备份
  • 所有其他星期日晚上11点05分的差异备份
  • 在其他日子(周一至周六,下午11:05)执行增量备份

您可以通过使用Bacula控制台检查控制器的状态来验证这一点。 它应该输出所有计划的作业:

Scheduled 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脚本的同时(10:30 pm)是有意义的。 这将防止应用程序和数据库备份彼此不一致。

设置远程备份

现在我们准备好设置一个远程服务器,存储我们Bacula备份的副本。 此远程服务器应位于地理上分离的区域中,因此即使生产数据中心发生灾难,您也将拥有关键备份的副本。 在我们的例子中,我们将使用DigitalOcean旧金山(SFO1)地区为我们remotebackups服务器。

我们将介绍一个简单的方法来利用公共SSH密钥,rsync的和cron从我们的备份服务器发送我们的备份到我们remotebackups服务器。

remotebackups服务器, 创建用户将被用于rsync的登录。

接下来, 备份服务器上生成一个无密码SSH密钥对的根。 安装在您刚刚创建的用户remotebackups公共密钥。 这是覆盖在我们如何设置SSH密钥教程。

备份服务器上,写了一个rsync命令的副本Bacula的备份数据( /bacula/backup )到remotebackups服务器上的某个地方。 rsync的使用覆盖在我们如何使用rsync教程 命令可能看起来像这样:

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

命令添加到脚本,如/usr/local/bin/rsync_backups.sh并使其可执行文件。

最后,你会想建立一个运行一个cron作业rsync_backups.sh脚本作为根,在Bacula的备份工作,通常完成后。 这是覆盖在我们如何安排日常任务:用cron教程

在设置了这一切后,验证是否有在remotebackups服务器上的备份第二天的副本。

其他注意事项

我们没有谈论备份的磁盘要求。 您一定要查看您的备份使用了多少磁盘空间,并根据您的需求和资源修改您的设置和备份计划。

除了创建应用程序服务器的备份之外,您可能还需要为添加到设置中的任何其他服务器设置备份。 例如,在您启动并运行监控和集中式日志记录服务器后,您应该配置Bacula来创建备份。

结论

您现在应该有生产应用程序服务器的每日备份和这些备份的远程副本。 请务必验证您是否能够还原文件,并添加将数据还原到恢复计划的步骤。

继续下一个教程开始设置为您的生产服务器设置监控: 构建用于生产:Web应用程序-监视