为生产构建:网络应用程序 — 备份

简介

在为应用程序的各种组件制定恢复计划之后,您应该建立所需的备份系统以支持它。本教程将重点介绍使用Bacula作为备份解决方案。使用完整的备份系统(如Bacula)的好处在于,它使您能够完全控制备份和恢复的文件级别内容,并且可以根据自己的需求安排备份和恢复。

DigitalOcean Droplet备份(整个Droplet的快照备份)这样的解决方案易于设置,如果只需要每周备份,可能就足够了。如果您选择DigitalOcean备份,请确保通过遵循为您的数据库创建热备份部分来设置数据库的热备份。

在本教程的这一部分,我们将设置一个Bacula以维护应用设置中(之前在恢复计划中定义的db1、app1、app2和lb1)服务器的必需备份的每日备份。本质上,这是一个教程,向您展示了如何使用Bacula为LAMP堆栈创建备份。我们还将使用Percona XtraBackup对MySQL数据库进行热备份。最后,我们将使用rsync在远程数据中心的服务器上创建备份的副本。这将为您设置添加两台服务器:backupsremotebackups(位于单独的数据中心)。

让我们开始吧。

在备份服务器上安装Bacula

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

然后按照本教程的组织Bacula Director配置(服务器)部分进行操作:如何使用Bacula备份Ubuntu 14.04服务器。您需要导演名称设置Bacula客户端(您想要备份的服务器)。当您到达安装和配置Bacula客户机部分时停止。请注意,我们将使用远程文件池为所有备份作业。话说回来,您可能希望在继续之前更改一些设置。

在每台服务器上安装Bacula客户机

按照本教程的安装和配置Bacula客户机部分在每台服务器(db1、app1、app2和lb1)上安装Bacula客户机:如何使用Bacula备份Ubuntu 14.04服务器。在您到达添加文件集(服务器)部分时停止。

请注意,您需要从每台服务器的bacula-fd.conf文件中获取FileDaemon名称(通常是主机名后跟“-fd”)和导演密码(Bacula服务器将用于连接到每个客户端的密码)。

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

备份服务器上,Bacula服务器,为每个安装了Bacula客户端的服务器在/etc/bacula/conf.d/clients.conf文件中添加一个客户端资源

打开clients.conf文件:

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

以下是数据库服务器db1的客户端资源定义的示例。请注意名称的值应与客户端服务器上的FileDaemon资源的名称匹配,密码应与导演资源的密码匹配;这些值可以在每个Bacula客户端服务器上的/etc/bacula/bacula-fd.conf文件中找到:

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-fdapp1-fdapp2-fdlb1-fd。这配置了备份服务器上的Bacula导演,使其能够连接到每个服务器上的Bacula客户端……

保存并退出。

有关本部分的详细信息请参阅《安装和配置Bacula客户端》中的《如何使用Bacula备份Ubuntu服务器》部分。

创建数据库的热备份

为了确保我们产生的数据库备份是可用的,必须采取特殊的措施。一个简单而有效的方法是使用MySQL的Percona XtraBackup创建热备份。

在数据库服务器db1上安装Percona XtraBackup

按照以下教程在数据库服务器db1上安装并配置Percona XtraBackup:如何在Ubuntu 14.04上使用Percona XtraBackup创建热备份MySQL数据库。在到达执行完全热备份部分时停止。

创建XtraBackup脚本

Percona XtraBackup准备好创建MySQL数据库的热备份,最终这些备份将由Bacula(或DigitalOcean备份)来完成,但是必须以某种方式计划这些热备份。我们将设置最简单的解决方案:一个bash脚本和一个cron作业。

/usr/local/bin目录下创建一个名为run_extra_backup.sh的bash脚本:

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

添加以下脚本。确保在安装XtraBackup时设置的用户和密码:

/usr/local/bin/run_xtrabackup.sh
#!/bin/bash

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

# 删除现有的完整备份
rm -r /data/backups/full

# xtrabackup 创建备份
innobackupex --user=bkpuser  --password=bkppassword --no-timestamp /data/backups/full

# xtrabackup 准备备份
innobackupex --apply-log /data/backups/full

保存并退出。以超级用户权限运行此脚本将在/data/backups/full目录下删除现有的XtraBackup备份并创建新的完整备份。有关使用XtraBackup创建备份的详细信息,请参阅XtraBackup教程中的执行完整热备份部分。

使脚本可执行:

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

为了正确备份我们的数据库,必须在Bacula尝试备份数据库服务器之前运行(并完成)XtraBackup脚本。一个好的解决方案是配置您的Bacula备份作业以运行脚本作为“预备份脚本”,但我们将选择使用一个cron作业来保持简单。创建一个cron配置文件(位于/etc/cron.d的文件会被添加到root的crontab中):

创建以下cron作业:

  1. sudo vi /etc/cron.d/xtrabackup

将此cron作业添加到/etc/cron.d目录下,使其被root用户的crontab所读取。该脚本每天晚上10:30执行(22小时,30分钟)。我们选择这个时间是因为Bacula目前设置在每天晚上11:05运行其备份作业——我们将稍后讨论调整这个时间。这允许脚本有35分钟的时间来完成。

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

现在数据库热备份已经设置好,让我们看看Bacula的备份文件集配置。

配置Bacula备份文件集

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

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

  1. 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 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。

应用服务器文件集

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

  • 应用文件: 在我们的示例中位于 /var/www/html

考虑到我们所需的备份,我们将向Bacula配置中添加这个“Apache文档根”文件集:

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端口配置文件,但这是可以轻松替换的。

现在让我们转到负载均衡服务器文件集。

负载均衡服务器文件集

根据我们的负载均衡服务器恢复计划,所需备份包括:

  • SSL证书(PEM)及相关文件: 在我们的示例中位于 /root/certs
  • HAProxy配置文件:/etc/haproxy

考虑到我们所需的备份,我们将向Bacula配置中添加这个“Apache文档根”文件集:

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
  }
}

保存并退出。

现在我们的文件集已经配置好了。让我们继续创建使用这些文件集的Bacula备份作业。

创建Bacula备份作业

我们将为我们的服务器创建Bacula备份作业,这些作业将运行并创建备份。

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

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

数据库服务器备份作业

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

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

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

应用程序服务器备份作业

对于我们的应用程序服务器,我们将创建两个备份作业,名为“Backup_app1”和“Backup_app2”。重要的是指定正确的客户端(app1-fd和app2-fd)和文件集(Apache文档根目录)。

app1作业:

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

应用2工作:

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

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

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

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

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

在备份服务器上,重新启动Bacula Director以使所有更改生效:

  1. sudo service bacula-director restart

在这一步中,您需要测试您的客户端连接和备份作业,这两个内容都已在《如何使用Bacula备份服务器》教程中有所涉及。该教程还涵盖了如何恢复Bacula备份。请注意,恢复MySQL数据库将需要您遵循《使用Percona XtraBackup进行备份恢复》步骤

检查备份计划

Bacula备份计划可以通过修改Director配置文件(/etc/bacula/bacula-dir.conf)进行调整。我们创建的所有备份作业都使用“DefaultJob”作业定义,该定义使用了“WeeklyCycle”调度,其定义如下:

  • 每月第一个星期天晚上11:05进行全备份
  • 其余每个星期天晚上11:05进行差异备份
  • 周一至周六的其他时间晚上11:05进行增量备份

您可以使用Bacula控制台来检查Director的状态,它应该输出所有计划中的作业:

Director Status — Scheduled Jobs
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

您可以自由调整任何备份作业的计划。将应用程序服务器的计划安排在晚上10:30执行Percona XtraBackup脚本时进行修改是有意义的。这样可以确保应用程序和数据库备份不会相互不一致。

设置远程备份

现在我们可以设置一个远程服务器来存储Bacula备份副本。这个远程服务器应该位于与生产数据中心不同的地理区域,这样即使在生产数据中心发生灾难的情况下,您仍然有一个关键备份的副本。在我们的例子中,我们将使用DigitalOcean的旧金山(SFO1)区域作为我们的远程备份服务器。

我们将详细介绍一种简单的方法,使用公共SSH密钥、rsync和cron从备份服务器向远程备份服务器发送备份。

远程备份服务器上,创建一个用户,该用户用于rsync登录。

接下来,在备份服务器上作为root用户生成一个密码为空的SSH密钥对。将公钥安装到您刚刚创建的远程备份用户上。这一步在我们的如何设置SSH密钥教程中有详细说明。

备份服务器上,编写一个rsync命令,将Bacula备份数据(/bacula/backup)复制到远程备份服务器的某个位置。Rsync的使用方法在我们的如何使用Rsync教程中有详细介绍。该命令可能看起来像这样:

  1. 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备份作业完成后由root运行。这一过程在我们的如何使用cron计划定期任务教程中有详细介绍。

设置完所有这些后,第二天检查远程备份服务器上的备份副本。

其他考虑因素

我们还没有谈到备份磁盘的要求。您肯定需要检查您的备份使用了多少磁盘空间,并根据您的需求和资源调整设置和计划。

除了创建应用程序服务器的备份外,您可能还想为添加到您的设置中的其他服务器设置备份。例如,一旦您设置了监控和集中日志记录服务器,您就可以配置Bacula对这些服务器进行备份。

结论

您现在应该每天备份您的生产应用服务器,并且有一个远程副本。确保您可以恢复文件,并将恢复步骤添加到您的恢复计划中。

继续下一个教程开始设置生产服务器的监控:构建生产环境:Web应用程序——监控

Source:
https://www.digitalocean.com/community/tutorials/building-for-production-web-applications-backups