介绍
启动并运行应用程序服务器后,下一个重要步骤就是设置备份系统。备份系统允许您创建数据的定期备份副本,并从这些备份中还原数据。由于用户错误或任何计算机系统容易出现的终端硬件故障导致数据丢失,您需要将备份设置为安全网。
本教程将向您展示如何通过使用运行Bacula的单独备份服务器,在单个Ubuntu 14.04服务器上运行LAMP堆栈来创建正确的PHP应用程序备份。使用像Bacula这样的备份系统的一个好处是,它可以让您完全控制应在单个文件级别备份和还原的内容,以及应该创建备份的时间表。在创建备份时具有文件级粒度允许我们将备份选择限制为仅需要的文件,与备份整个文件系统相比,这将节省磁盘空间。
如果您的文件太多,您可能需要考虑用快照创建云硬盘,快照是腾讯云提供的一种数据备份方式,通过对指定云硬盘进行完全可用的拷贝,使该备份独立于云硬盘的生命周期。快照不占据用户的存储空间,腾讯云将以冗余的方式把用户创建的快照存储在多个可用区,从而进一步确保了备份的可靠性。
准备
本教程假设您正在运行一个PHP应用程序,例如WordPress,它运行在单个Ubuntu 14.04服务器上的LAMP(Linux,Apache,MySQL / MariaDB和PHP)堆栈上,并启用了专用网络。我们将此称为LAMP服务器。要完成本教程,你需要具备以下内容:
- 一台已经设置好可以使用
sudo
命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。 - 安装Linux,Apache,MySQL,PHP(LAMP)堆栈,若您还未安装,您可以在腾讯云 社区找到很多相关专栏文章进行学习和安装。
- 通过以下教程创建WordPress服务器:如何使用WP-CLI安装Wordpress
如果您正在运行不同的PHP应用程序,或者使用Nginx而不是Apache,假设您还想对备份选择进行必要的调整,本教程仍然可以适用。
当然,您需要sudo访问将安装Bacula服务器软件,我们将其称为备份服务器。理想情况下,它将与您的LAMP服务器位于同一数据中心,并启用了专用网络。创建的备份将存在于此服务器上,因此需要足够的磁盘空间来存储备份选择的多个副本。
备份选择
如介绍中所述,选择每次创建备份时需要备份的文件,将仅包含将应用程序还原到先前状态所必需的文件。简而言之,这意味着我们将备份以下数据:
- PHP应用程序文件:这将是您的Web服务器的文档根目录。在Ubuntu上,默认是在
/var/www/html
下。 - MySQL数据库:虽然MySQL数据文件通常存储在
/var/lib/mysql
中,但我们必须在另一个位置创建数据库的热备份。热备份将成为我们备份选择的一部分。
为方便起见,我们还将在备份选择中包含Apache和MySQL配置文件。如果您有任何其他重要文件,例如SSL密钥和证书文件,请务必也包含这些文件。
SSL证书:如何设置此证书取决于你是否拥有可解析该服务器的域名。
- 如果你有域名,保护你网站的最简单方法是使用腾讯云SSL证书服务,它提供免费的可信证书。腾讯云SSL证书安装操作指南进行设置。
- 如果你没有域名,建议您先去这里注册一个域名,如果你只是使用此配置进行测试或个人使用,则可以使用自签名证书,不需要购买域名。自签名证书提供了相同类型的加密,但没有域名验证公告。关于自签名证书,你可以参考为Apache创建自签名SSL证书和如何为Nginx创建自签名SSL证书这两篇文章。
可以按照初始设置的软件安装步骤替换服务器上的其余文件。在服务器发生故障的情况下,我们可以通过遵循准备中的教程,然后恢复备份并重新启动相应的服务来创建替换LAMP服务器。
接下里,让我们设置数据库的热备份。
创建数据库的热备份
为确保我们为活动数据库生成一致(即可用)备份,必须特别小心。使用MySQL创建热备份的一种简单有效的方法是使用Percona XtraBackup。
安装Percona XtraBackup
在LAMP服务器上,参考相关教程安装和配置Percona XtraBackup,到达“ 执行完全热备份”部分时停止。
创建XtraBackup脚本
Percona XtraBackup已准备好创建MySQL数据库的热备份,最终将由Bacula备份,但必须以某种方式安排热备份。我们将设置最简单的解决方案:bash脚本和cron作业。
在/usr/local/bin
下创建一个名为run_extra_backup.sh
的bash脚本:
sudo vi /usr/local/bin/run_xtrabackup.sh
添加以下脚本。确保用安装XtraBackup时设置的内容替换用户和密码:
代码语言:javascript复制#!/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备份并创建新的完整备份。简而言之,此脚本将维护数据库热备份的单个副本。
使脚本可执行:
代码语言:javascript复制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进程:
代码语言:javascript复制30 22 * * * root /usr/local/bin/run_xtrabackup.sh
这会以root身份将脚本安排为每天晚上10:30运行(第22小时,第30分钟)。我们选择这个时间段是因为Bacula的默认备份工作计划在每天晚上11:05运行 - 我们将在稍后讨论调整此问题。这需要35分钟完成XtraBackup脚本。
现在已经设置了数据库热备份,让我们在备份服务器上安装Bacula。
在备份服务器上安装Bacula
设置Bacula服务器。
组织Bacula Director配置(服务器)。
请注意,我们将使用RemoteFile池来处理我们将要设置的所有备份作业。话虽如此,您可能希望在继续之前更改某些设置。
在LAMP服务器上安装Bacula Client
安装Bacula客户端。
请注意,您需要从LAMP服务器上的bacula-fd.conf
文件中获取FileDaemon名称(通常是“-fd”附加的主机名)和Director密码(Bacula服务器将用于连接Bacula客户端的密码)。
将备份客户端添加到备份服务器
在备份服务器Bacula上,将LAMP服务器的客户端资源添加到/etc/bacula/conf.d/clients.conf
文件中。
打开clients.conf
文件:
sudo vi /etc/bacula/conf.d/clients.conf
LAMP服务器的客户端资源定义应类似于以下代码块。请注意,Name的值应与FileDaemon资源的名称匹配,密码应与LAMP服务器上Director资源的密码匹配- 这些值可在LAMP服务器的/etc/bacula/bacula-fd.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
}
保存并退出。这将配置备份服务器上的Bacula Director,以便能够连接到每台服务器上的Bacula客户端。
现在让我们配置Bacula备份文件集。
配置Bacula FileSet
Bacula将在FileSets中创建指定文件的备份,这些文件与将要执行的备份进程相关联。本节将介绍如何创建包含我们之前确定为备份选择一部分的文件的文件集。
在备份服务器上,打开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配置中:
代码语言:javascript复制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块中。这些是我们要备份的所有文件。如果要从备份作业中排除任何文件(包含目录中存在的文件),请将它们添加到“ 排除”块。
现在我们的FileSet已配置完毕。让我们继续创建将使用此FileSet的Bacula备份作业。
创建Bacula备份作业
我们将创建Bacula备份作业,该作业将运行并创建LAMP服务器的备份。
在/etc/bacula/conf.d
位置创建jobs.conf
文件:
sudo vi /etc/bacula/conf.d/jobs.conf
LAMP服务器备份作业
对于我们的LAMP服务器备份作业,我们将创建一个名为“Backup LAMP”的新作业。这里重要的是我们指定正确的客户端(lamp-fd)和FileSet(LAMP文件):
代码语言:javascript复制Job {
Name = "Backup LAMP"
JobDefs = "DefaultJob"
Client = lamp-fd
Pool = RemoteFile
FileSet="LAMP Files"
}
保存并退出。
现在我们的备份作业已配置。最后一步是重新启动Bacula Director。
重启Bacula Director
在备份服务器上,重新启动Bacula Director以使我们的所有更改生效:
代码语言:javascript复制sudo service bacula-director restart
此时,您将需要测试客户端连接和备份作业,请注意,恢复MySQL数据库将要求您遵循Percona XtraBackup教程中的步骤。
修改备份计划
可以通过修改Bacula Director配置(/etc/bacula/bacula-dir.conf
)来调整Bacula备份计划。我们创建的备份作业使用“DefaultJob”JobDef,它使用“WeeklyCycle”计划,其定义为:
- 完全备份:在一个月的第一个星期日晚上11:05
- 差异备份:所有其他星期日晚上11:05
- 其他日期的增量备份:周一至周六,晚上11:05
您可以使用Bacula控制台检查Director的状态来验证这一点。它应该输出所有预定的作业:
代码语言:javascript复制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备份的副本。此远程服务器应位于独立地理位置的区域,因此即使生产数据中心发生灾难,您也将拥有关键备份的副本。
我们将解析一种公共SSH密钥,使用rsync和cron 将备份从备份服务器发送到remotebackups服务器的简单方法。
在remotebackups服务器上,创建将用于rsync登录的用户。
接下来,在备份服务器上,以root身份生成无密码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
并使其可执行。
最后,在Bacula备份作业通常完成之后,您将需要以root身份使用cron作业运行rsync_backups.sh
脚本。
设置完所有内容后,请确认第二天在remotebackups服务器上有备份副本。
查看备份磁盘要求
我们没有谈论备份的磁盘要求。您肯定希望查看备份使用的磁盘空间,并根据您的需求和资源修改设置和备份计划。
在这个教程中,除非您的PHP应用程序具有大量的内容和媒体,否则备份只会占用相对较少的磁盘空间。这是因为我们的备份选择非常保守,默认备份作业会尽可能创建增量备份。
结论
您现在应该有每日备份,并且(如果您设置了)LAMP服务器的那些备份的远程副本。确保通过快速运行还原过程来验证是否能够还原备份的文件。
想要了解更多关于备份的开源信息教程,请前往腾讯云 社区学习更多知识。
参考文献:《How to Back Up a LAMP Server with Bacula on Ubuntu 14.04》