如何在Ubuntu 14.04上使用Bacula备份LAMP服务器

介绍

启动并运行应用程序服务器后,下一个重要步骤就是设置备份系统。备份系统允许您创建数据的定期备份副本,并从这些备份中还原数据。由于用户错误或任何计算机系统容易出现的终端硬件故障导致数据丢失,您需要将备份设置为安全网。

本教程将向您展示如何通过使用运行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证书:如何设置此证书取决于你是否拥有可解析该服务器的域名。

可以按照初始设置的软件安装步骤替换服务器上的其余文件。在服务器发生故障的情况下,我们可以通过遵循准备中的教程,然后恢复备份并重新启动相应的服务来创建替换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时设置的内容替换用户和密码:

#!/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备份并创建新的完整备份。简而言之,此脚本将维护数据库热备份的单个副本。

使脚本可执行:

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运行 - 我们将在稍后讨论调整此问题。这需要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配置中:

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文件):

Job {
  Name = "Backup LAMP"
  JobDefs = "DefaultJob"
  Client = lamp-fd
  Pool = RemoteFile
  FileSet="LAMP Files"
}

保存并退出。

现在我们的备份作业已配置。最后一步是重新启动Bacula Director。

重启Bacula Director

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

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的状态来验证这一点。它应该输出所有预定的作业:

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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏自动化测试实战

接口测试基础——第9篇 写代码常用的快捷方式

3117
来自专栏流柯技术学院

CentOS下Zabbix安装部署及汉化

1.安装开发软件包 yum -y groupinstall "Development Tools"

1522
来自专栏SpringBoot 核心技术

第二十一章:SpringBoot项目中的全局异常处理

6853
来自专栏F_Alex

SpringCloud-微服务配置统一管理SpringCloud Config(七)

2383
来自专栏Vamei实验室

Java网络01 Tomcat初次尝试

Tomcat是一套开源软件,它由Apache Software Foundation(ASF)开发,用于实现Java Servlet和JavaServer Pa...

2089
来自专栏运维咖啡吧

记一次诡异的故障排查经历

管理员通过Jenkins调用“发布程序(代号varian,以下简称varian)”,发布程序会进行一系列的初始化操作,完成后生成Docker镜像上传到Docke...

962
来自专栏为数不多的Android技巧

把Sublime添加到Mac右键菜单

虽然大部分的时候是使用命令行,但是有些时候我们需要在Finder里面编辑某些文件的时候,如果还是拘泥于这样,就必须打开 iTerm (幸好有Profile可以一...

6601
来自专栏IMWeb前端团队

Nodejs进阶:核心模块net入门与实例讲解

模块概览 net模块是同样是nodejs的核心模块。在http模块概览里提到,http.Server继承了net.Server,此外,http客户端与http服...

3076
来自专栏Java学习123

shell获取当前工作目录绝对路径

2K7
来自专栏【转载】DRF+Vue+Mysql_生鲜超市系统

Django+nginx+uwsgi部署教程(centos7+ubuntu16.4)

这里有安装方法:https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on...

1940

扫码关注云+社区

领取腾讯云代金券