为生产而构建:Web应用程序—备份

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

DigitalOcean Droplet Backups(整个 Droplet 的快照备份)等解决方案易于设置,如果您只需要每周备份,可能就足以满足您的需求。 如果您选择 DigitalOcean Backups,请务必按照 创建数据库的热备份 部分设置数据库的热备份。

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

让我们开始吧。

在备份服务器上安装 Bacula

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

然后按照本教程的 组织 Bacula Director 配置(服务器) 部分:如何使用 Bacula 备份 Ubuntu 14.04 服务器。 设置 Bacula 客户端(在要备份的服务器上)时,您将需要 Director Name。 当您到达 Install and Configure Bacula Client 部分时停止。

请注意,我们将为我们将设置的所有备份作业使用 RemoteFile 池。 话虽如此,您可能希望在继续之前更改一些设置。

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

按照本教程的 安装和配置 Bacula 客户端 部分,在要备份的每台服务器(db1、app1、app2 和 lb1)上安装 Bacula 客户端:如何备份带有 Bacula 的 Ubuntu 14.04 服务器。 当您到达 Add FileSets (Server) 部分时停止。

请注意,您将需要 FileDaemon Name(通常是附加“-fd”的主机名)和 Director Password(Bacula 服务器用于连接每个客户端的密码)来自每个服务器上的 bacula-fd.conf 文件。

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

在 Bacula 服务器 backups 上,将 Client 资源 添加到您安装 Bacula 客户端的每台服务器的 /etc/bacula/conf.d/clients.conf 文件中。

打开clients.conf文件:

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

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

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 客户端服务器创建一个类似的客户端资源。 在我们的示例中,完成后应该有四个客户端资源:db1-fd、app1-fd、app2-fd 和 lb1 -fd。 这将 backups 服务器上的 Bacula Director 配置为能够连接到每个服务器上的 Bacula 客户端……

保存并退出。

有关本节的更多详细信息,请参阅 如何使用 Bacula 备份 Ubuntu 服务器教程 中的 安装和配置 Bacula 客户端 。

创建数据库的热备份

确保我们生产一致(即 可用)我们活动数据库的备份,必须特别小心。 使用 MySQL 创建热备份的一种简单有效的方法是使用 Percona XtraBackup。

安装 Percona XtraBackup

在您的数据库服务器 db1 上,按照以下教程安装和配置 Percona XtraBackup:如何在 Ubuntu 14.04 上使用 Percona XtraBackup 创建 MySQL 数据库的热备份。 当您到达 Perform Full Hot Backup 部分时停止。

创建 XtraBackup 脚本

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

在 /usr/local/bin 中创建一个名为 run_extra_backup.sh 的 bash 脚本:

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

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

使脚本可执行:

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

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

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

sudo vi /etc/cron.d/xtrabackup

添加以下 cron 作业:

/etc/cron.d/xtrabackup

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

这安排脚本在每天晚上 10:30(第 22 小时第 30 分钟)以 root 身份运行。 我们之所以选择这个时间,是因为 Bacula 目前计划在每天晚上 11:05 运行其备份作业——我们将在稍后讨论如何调整。 这允许 XtraBackup 脚本在 35 分钟内完成。

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

配置 Bacula 文件集

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

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

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

数据库服务器文件集

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

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

我们还将包括 XtraBackup 脚本:/usr/local/bin/run_xtrabackup.sh,以及相关的 cron 文件。

考虑到我们需要的备份,我们将把这个“MySQL 数据库”文件集添加到我们的 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。

应用服务器文件集

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

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

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

filesets.conf — Apache 文档根目录

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

您可能还想包含 Apache 端口配置文件,但它很容易替换。

现在让我们继续讨论负载平衡器服务器 FileSet。

负载均衡服务器文件集

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

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

考虑到我们需要的备份,我们将把这个“Apache DocumentRoot”文件集添加到我们的 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
  }
}

保存并退出。

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

创建 Bacula 备份作业

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

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

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

数据库服务器备份作业

对于我们的数据库服务器备份作业,我们将创建一个名为“Backup db1”的新作业。 这里重要的是我们指定了正确的 Client (db1-fd) 和 FileSet (MySQL Database):

jobs.conf — 备份 db1

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

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

应用程序服务器备份作业

对于我们的应用程序服务器,我们将创建两个名为“Backup app1”和“Backup app2”的备份作业。 这里重要的是我们指定了正确的 Clients(app1-fd 和 app2-fd)和 FileSet(Apache DocumentRoot)。

应用程序1工作:

jobs.conf — 备份 app1

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

应用程序2工作:

jobs.conf — 备份 app2

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

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

负载均衡服务器备份作业

对于我们的负载平衡器服务器备份作业,我们将创建一个名为“Backup lb1”的新作业。 这里重要的是我们指定了正确的 Client (lb1-fd) 和 FileSet (SSL Certs and HAProxy Config):

jobs.conf — 备份 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

此时,您将需要测试您的客户端连接和备份作业,这两者都包含在 如何使用 Bacula 备份服务器教程 中。 该教程还介绍了如何恢复 Bacula 备份。 请注意,恢复 MySQL 数据库需要您按照 Percona XtraBackup 教程中的 执行备份恢复 步骤进行操作。

查看备份计划

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

  • 每月第一个星期日晚上 11:05 进行完整备份
  • 其他所有周日晚上 11:05 进行差异备份
  • 其他日子(周一至周六晚上 11:05)的增量备份

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

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 脚本的同时(晚上 10:30)修改应用程序服务器的计划是有意义的。 这将防止应用程序和数据库备份彼此不一致。

设置远程备份

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

我们将解释一种使用公共 SSH 密钥、rsync 和 cron 将备份从我们的 backups 服务器发送到我们的 remotebackups 服务器的简单方法。

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

接下来,在 backups 服务器上,以 root 身份生成无密码 SSH 密钥对。 在您刚刚创建的 remotebackups 用户上安装公钥。 这在我们的 如何设置 SSH 密钥 教程中有介绍。

在 backups 服务器上,编写一个 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 并使其可执行。

最后,在 Bacula 备份作业通常完成后,您需要设置一个以 root 身份运行 rsync_backups.sh 脚本的 cron 作业。 这在我们的 如何使用 Cron 安排例行任务教程 中有介绍。

设置完所有这些后,请确认第二天在 remotebackups 服务器上有备份副本。

其他注意事项

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

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

结论

您现在应该拥有生产应用程序服务器的每日备份以及这些备份的远程副本。 请务必确认您能够恢复文件,并将恢复数据的步骤添加到恢复计划中。

继续学习下一个教程,开始为您的生产服务器设置设置监控:Building for Production:Web 应用程序 — 监控。