如何在Ubuntu14.04上使用Bacula备份LAMP服务器
介绍
启动并运行您的应用程序服务器后,重要的下一步是设置备份系统。 备份系统将允许您创建数据的定期备份副本,并从这些备份中恢复数据。 由于用户错误或任何计算机系统容易发生的最终硬件故障都可能导致数据丢失,因此您需要将备份设置为安全网。
本教程将向您展示如何使用运行 Bacula 的单独备份服务器创建 PHP 应用程序的正确备份,在单个 Ubuntu 14.04 服务器上运行 LAMP 堆栈。 使用像 Bacula 这样的备份系统的好处之一是,它可以让您在单个文件级别完全控制应该备份和恢复的内容,以及创建备份的时间安排。 创建备份时具有文件级粒度允许我们将备份选择限制为仅需要的文件,与备份整个文件系统相比,这将节省磁盘空间。
如果这对您来说似乎太过分了,您可能需要考虑 DigitalOcean Droplet Backups(整个 Droplet 的快照备份),它必须在您创建 Droplet 时启用。 这些备份很容易设置,如果您只需要每周备份,可能足以满足您的需求。 如果您选择 DigitalOcean Backups,请务必按照 创建数据库的热备份 部分设置数据库的热备份 - 这是确保您的数据库备份一致(可用)的必要条件。
先决条件
本教程假设您正在运行 PHP 应用程序,例如 WordPress,该应用程序在单个 Ubuntu 14.04 服务器上的 LAMP(Linux、Apache、MySQL/MariaDB 和 PHP)堆栈上运行,并启用了私有网络。 我们将其称为 LAMP 服务器。 对于我们的示例,我们将创建通过以下教程创建的 WordPress 服务器的备份:
如果您正在运行不同的 PHP 应用程序,或者使用 Nginx 而不是 Apache,假设您对备份选择进行任何必要的调整,本教程仍然可以正常工作。
当然,您需要 sudo 访问将安装 Bacula 服务器软件的服务器,我们将其称为 backups 服务器。 理想情况下,它将与您的 LAMP 服务器位于同一数据中心,并启用专用网络。 创建的备份将存在于此服务器上,因此需要足够的磁盘空间来存储备份选择的多个副本。
备份选择
如简介中所述,我们的备份选择(每次创建备份时将复制的文件)将仅包含将应用程序恢复到先前状态所需的文件。 简而言之,这意味着我们将备份以下数据:
- PHP 应用程序文件: 这将是您的 Web 服务器的 DocumentRoot。 在 Ubuntu 上,默认为
/var/www/html
- MySQL 数据库: 虽然 MySQL 数据文件通常存储在
/var/lib/mysql
中,但我们必须在另一个位置创建数据库的热备份。 热备份将成为我们备份选择的一部分
为方便起见,我们还将在备份选择中包含 Apache 和 MySQL 配置文件。 如果您有任何其他重要文件,例如 SSL 密钥和证书文件,请确保也包含这些文件。
可以按照初始设置的软件安装步骤替换服务器上的其余文件。 在服务器出现故障的情况下,我们可以按照先决条件教程创建替换 LAMP 服务器,然后恢复备份并重新启动相应的服务。
如果您不确定我们为什么在备份选择中包含上述文件,请查看多部分 生产构建:Web 应用程序 教程系列的 恢复计划 部分。 它以多服务器设置为例,描述了如何为 Web 应用程序开发恢复计划。
让我们设置数据库的热备份。
创建数据库热备份
确保我们生产一致(即 可用)我们活动数据库的备份,必须特别小心。 使用 MySQL 创建热备份的一种简单有效的方法是使用 Percona XtraBackup。
安装 Percona XtraBackup
在您的 LAMP 服务器上,按照以下教程安装和配置 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。
在备份服务器上安装 Bacula
在您的 backups 服务器上,按照以下教程设置 Bacula 服务器:如何在 Ubuntu 14.04 上安装 Bacula 服务器。
然后按照本教程的 组织 Bacula Director 配置(服务器) 部分:如何使用 Bacula 备份 Ubuntu 14.04 服务器。 设置 Bacula 客户端(在要备份的服务器上)时,您将需要 Director Name。 当您到达 Install and Configure Bacula Client 部分时停止。
请注意,我们将为我们将设置的所有备份作业使用 RemoteFile 池。 话虽如此,您可能希望在继续之前更改一些设置。
在 LAMP 服务器上安装 Bacula 客户端
在您的 LAMP 服务器上,按照本教程的 安装和配置 Bacula 客户端 部分安装 Bacula 客户端:如何使用 Bacula 备份 Ubuntu 14.04 服务器. 当您到达 Add FileSets (Server) 部分时停止。
请注意,您将需要 FileDaemon Name(通常是附加“-fd”的主机名)和 Director Password(Bacula 服务器用于连接 Bacula 客户端的密码) ) 来自 LAMP 服务器上的 bacula-fd.conf
文件。
将备份客户端添加到备份服务器
在您的 backups 服务器(Bacula 服务器)上,将 LAMP 服务器的 Client 资源 添加到 /etc/bacula/conf.d/clients.conf
文件中。
打开clients.conf
文件:
sudo vi /etc/bacula/conf.d/clients.conf
LAMP 服务器的客户端资源定义应类似于以下代码块。 请注意,Name 的值应与 FileDaemon 资源的名称匹配,Password 的值应与 Director 资源的密码匹配, 在 LAMP 服务器上——这些值可以在 LAMP 服务器上的 /etc/bacula/bacula-fd.conf
中找到:
clients.conf - 示例客户端资源定义
Client { Name = lamp-fd Address = lamp_private_IP_or_hostname 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 }
保存并退出。 这将 backups 服务器上的 Bacula Director 配置为能够连接到每个服务器上的 Bacula 客户端……
有关本节的更多详细信息,请参阅 如何使用 Bacula 备份 Ubuntu 服务器教程 中的 安装和配置 Bacula 客户端 。
现在让我们配置 Bacula 备份文件集。
配置 Bacula 文件集
Bacula 将创建与将要执行的备份作业相关联的文件集中指定的文件的备份。 本节将介绍如何创建包含我们之前确定为 备份选择 一部分的文件的文件集。 有关将文件集添加到 Bacula 的更多详细信息,请参阅 Bacula 教程的 添加文件集(服务器) 部分。
在您的 backups 服务器上,打开 filesets.conf
文件:
sudo vi /etc/bacula/conf.d/filesets.conf
根据我们的备份选择,我们的 LAMP 服务器所需的备份包括:
- PHP 应用程序文件:
/var/www/html
- MySQL数据库:
/data/backups/full
— full hot backup is created daily at 10:30pm by our XtraBackup script
为方便起见,我们还将包括以下文件:
- MySQL配置:
/etc/mysql
- 阿帕奇配置:
/etc/apache2
- XtraBackup 脚本:
/usr/local/bin/run_xtrabackup.sh
- XtraBackup cron 文件:
/etc/cron.d/xtrabackup
考虑到我们的备份选择,我们将以下 FileSet 添加到我们的 Bacula 配置中:
filesets.conf — MySQL 数据库
FileSet { Name = "LAMP Files" Include { Options { signature = MD5 compression = GZIP } File = /var/www/html File = /data/backups File = /etc/mysql File = /etc/apache2 File = /usr/local/bin/run_xtrabackup.sh File = /etc/cron.d/xtrabackup } Exclude { File = /data/backups/exclude } }
保存并退出。 请注意,所有突出显示的 File 指令都在 Include 块中。 这些是我们要备份的所有文件。 如果要从备份作业中排除任何文件,包括目录中存在的文件,请将它们添加到 Exclude 块。
现在我们的 FileSet 已经配置好了。 让我们继续创建将使用此 FileSet 的 Bacula 备份作业。
创建 Bacula 备份作业
我们将创建 Bacula 备份作业,该作业将运行并创建 LAMP 服务器的备份。
在/etc/bacula/conf.d
中创建一个jobs.conf
文件:
sudo vi /etc/bacula/conf.d/jobs.conf
LAMP 服务器备份作业
对于我们的 LAMP 服务器备份作业,我们将创建一个名为“Backup LAMP”的新作业。 这里重要的是我们指定了正确的 Client (lamp-fd) 和 FileSet (LAMP Files):
jobs.conf — 备份 db1
Job { Name = "Backup LAMP" JobDefs = "DefaultJob" Client = lamp-fd Pool = RemoteFile FileSet="LAMP Files" }
保存并退出。
现在我们的备份作业已配置完毕。 最后一步是重新启动 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 lamp Remote-0002
随意添加或调整任何备份作业的计划。 如果您希望备份更加灵活,将数据库备份与其他所有备份分开是明智的。 这样,您可以修改应用程序文件备份作业的时间表,使其与 Percona XtraBackup 脚本执行的同时发生(晚上 10:30),并在完成时备份数据库的热备份(由 XtraBackup 生成)正在准备中。 这将减少应用程序和数据库备份相互不一致的机会。
设置远程备份(可选)
如果您愿意,您可以创建一个远程服务器来存储 Bacula 备份的副本。 此远程服务器应位于地理上独立的区域,因此即使生产数据中心发生灾难,您也将拥有关键备份的副本。 例如,如果您的 LAMP 和备份服务器位于纽约,您可以将 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 服务器上有备份副本。
查看备份磁盘要求
我们没有讨论备份的磁盘要求。 您肯定会想要查看备份使用了多少磁盘空间,并根据您的需求和资源修改设置和备份计划。
在我们的示例中,除非您的 PHP 应用程序具有相当大量的内容和媒体,否则备份可能会消耗相对较少的磁盘空间。 这是因为我们的备份选择非常保守,默认备份作业会尽可能创建 增量 备份。
结论
您现在应该有每日备份,并且(如果您设置了)这些备份的远程副本,您的 LAMP 服务器。 请务必通过快速运行恢复过程来验证您是否能够恢复备份的文件。