介绍
在使应用程序服务器启动并运行后,下一个重要步骤是设置备份系统。 备份系统将允许您创建数据的定期备份副本,并从这些备份中恢复数据。 由于数据可能会由于用户错误或任何计算机系统容易出现的最终硬件故障而丢失,因此您需要将备份设置为安全网。
本教程将介绍如何通过使用运行Bacula的单独备份服务器,在单个Ubuntu 14.04服务器上运行LAMP来创建PHP应用程序的正确备份。 使用像Bacula这样的备份系统的一个好处是,它可以完全控制应该备份和恢复的数据,在单个文件级别以及创建备份的时间。 在创建备份时具有文件级粒度允许我们将备份选择限制为仅需要的文件,与备份整个文件系统相比,这将节省磁盘空间。
如果这似乎是过分了你,你可能要考虑DigitalOceanDroplet备份 (整个Droplet的快照备份),当你创建你的Droplet,必须启用。 这些备份很容易设置,并且可能足以满足您的需要,如果您只需要每周备份。 如果您选择DigitalOcean备份,请务必遵循创建数据库的热备份设置您的数据库热备份部分,这是必要的,以确保您的数据库备份将是一致的(可用)。
先决条件
本教程假设您正在运行一个PHP应用程序,如WordPress,在一个Ubuntu 14.04服务器上启用了专用网络的LAMP(Linux,Apache,MySQL / MariaDB和PHP)上运行。 我们将把它作为LAMP服务器。 对于我们的示例,我们将创建通过以下教程创建的WordPress服务器的备份:
如果你正在运行一个不同的PHP应用程序,或使用Nginx而不是Apache,本教程仍然会正常工作,假设你对备份选择进行任何必要的调整。
当然,你需要的Bacula的服务器软件上安装一个服务器,我们将称之为备份服务器sudo访问。 理想情况下,它将与您的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数据库的热备份 。 停止当你到达进行全热备份一节。
创建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时设置的任何内容替换用户和密码:
#!/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作业:
30 22 * * * root /usr/local/bin/run_xtrabackup.sh
这将调度脚本以root用户每天晚上10:30(第22小时,第30分钟)运行。 我们选择了这一次,因为Bacula的默认备份作业计划在每天下午11:05运行 - 我们将在后面讨论调整。 这允许XtraBackup脚本完成35分钟。
现在,设置了数据库热备份,让我们在我们的备份服务器上安装Bacula。
在备份服务器上安装Bacula
:在备份服务器上,按照本教程设置Bacula的服务器如何在Ubuntu 14.04安装Bacula的服务器 。
然后按照本教程的组织Bacula的Director配置(服务器)部分: 如何备份一个Ubuntu 14.04服务器与Bacula的 。 在设置Bacula客户端(在要备份的服务器上)时,您将需要“Director”名称。 当你到达了安装和配置客户端Bacula的部分停止。
请注意,我们将使用RemoteFile池作为我们将要设置的所有备份作业。 有了这个,你可能想改变一些设置,然后继续。
在LAMP服务器上安装Bacula客户端
:在您的LAMP服务器,按照本教程的安装和配置客户端Bacula的部分安装客户端Bacula的如何备份一个Ubuntu 14.04服务器与Bacula的 。 当你到达添加文件集(服务器)部分停止。
请注意,您将需要FileDaemon名称 (通常由“-fd”Stapling的主机名),并从主任密码 (该Bacula的服务器将使用连接到客户端Bacula的密码) bacula-fd.conf
灯泡文件服务器。
将备份客户端添加到备份服务器
在备份服务器上,Bacula的服务器,添加客户端资源为LAMP服务器到/etc/bacula/conf.d/clients.conf
文件。
打开clients.conf
文件:
sudo vi /etc/bacula/conf.d/clients.conf
LAMP服务器的客户端资源定义应类似于以下代码块。 需要注意的是名称的值应该匹配的名称FileDaemon资源和密码应与主管资源的密码,在LAMP服务器的这些值中可以找到/etc/bacula/bacula-fd.conf
上LAMP服务器:
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
}
保存并退出。 此配置Bacula的主任, 备份服务器上,才能够连接到客户端Bacula的每台服务器上..
关于这部分的更多细节可以在安装和配置客户端Bacula的在中找到如何备份一个Ubuntu服务器Bacula的教程 。
现在让我们配置Bacula备份FileSets。
配置Bacula FileSet
Bacula将创建在与将要执行的备份作业相关联的FileSets中指定的文件的备份。 本节将介绍创建文件集,包括我们确定为我们的备份选择的一部分,早期的文件。 可以在中找到有关添加文件集Bacula的更多细节添加文件集(服务器)的Bacula的教程部分。
在备份服务器上,打开filesets.conf
文件:
sudo vi /etc/bacula/conf.d/filesets.conf
根据我们的备份选择,我们的LAMP服务器所需的备份包括:
- PHP应用程序文件:
/var/www/html
- MySQL数据库:
/data/backups/full
-全热备份是由我们XtraBackup脚本创建每天晚上10:30
为方便起见,我们还将包括以下文件:
- MySQL配置:
/etc/mysql
- Apache的配置:
/etc/apache2
- XtraBackup脚本:
/usr/local/bin/run_xtrabackup.sh
- XtraBackup的cron文件:
/etc/cron.d/xtrabackup
考虑到我们的备份选择,我们将添加以下FileSet到我们的Bacula配置:
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
}
}
保存并退出。 请注意,所有突出显示的文件指令在包含块。 这些是我们要备份的所有文件。 如果要排除备份作业的任何文件,包括存在目录内的人,将它们添加到排除块。
现在我们的FileSet被配置。 让我们继续创建将使用此FileSet的Bacula备份作业。
创建Bacula备份作业
我们将创建Bacula备份作业,将运行和创建我们的LAMP服务器的备份。
创建一个jobs.conf
文件/etc/bacula/conf.d
:
sudo vi /etc/bacula/conf.d/jobs.conf
LAMP服务器备份作业
对于我们的LAMP服务器备份作业,我们将创建一个名为“备份LAMP”的新作业。 这里最重要的是,我们指定了正确的客户端 (灯FD)和文件集 (LAMP文件):
Job {
Name = "Backup LAMP"
JobDefs = "DefaultJob"
Client = lamp-fd
Pool = RemoteFile
FileSet="LAMP Files"
}
保存并退出。
现在我们配置了备份作业。 最后一步是重新启动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控制台检查控制器的状态来验证这一点。 它应该输出所有计划的作业:
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 pm),并在完成后备份数据库的热备份(由XtraBackup生成)正在准备。 这将减少应用程序和数据库备份彼此不一致的可能性。
设置远程备份(可选)
如果需要,您可以创建一个远程服务器,用于存储Bacula备份的副本。 此远程服务器应位于地理上分离的区域中,因此即使生产数据中心发生灾难,您也将拥有关键备份的副本。 例如,如果你的灯和备份服务器在纽约,你可以使用DigitalOcean的旧金山(SFO1)区为您remotebackups服务器。
我们将介绍一个简单的方法来利用公共SSH密钥,rsync的和cron从我们的备份服务器发送我们的备份到我们remotebackups服务器。
在remotebackups服务器, 创建用户将被用于rsync的登录。
接下来, 备份服务器上生成一个无密码SSH密钥对的根。 安装在您刚刚创建的用户remotebackups公共密钥。 这是覆盖在我们教程。
在备份服务器上,写了一个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服务器上的备份第二天的副本。
查看备份磁盘要求
我们没有谈论备份的磁盘要求。 您一定要查看您的备份使用了多少磁盘空间,并根据您的需求和资源修改您的设置和备份计划。
在我们的示例中,除非您的PHP应用程序具有相当大量的内容和媒体,否则备份可能会消耗相对较少的磁盘空间。 这是因为我们的备份选择是非常保守的,默认的备份作业创建时, 增量备份成为可能。
结论
您现在应该有每日备份,并且(如果您设置)您的LAMP服务器的那些备份的远程副本。 请务必验证您是否能够通过快速运行恢复过程来恢复备份的文件。