提供:ZStack云计算

系列教程

本教程为生产环境构建指南——Web应用系列六篇中的第四篇。

内容简介

在为应用中的各组件建立起恢复规划后,大家需要设置备份系统以为其提供支持。在今天的教程中,我们将了解如何利用Bacula构建备份解决方案。使用Bacula这类完整的备份系统能够帮助大家完全掌控备份内容,立足于单个文件级别进行细化管理,同时根据实际需求选择具体备份及还原方式。

DigitalOcean Droplet备份一文(即为完整Droplet保留快照备份)中的方式适用于每周定期备份等较为简单的备份需求。如果大家希望使用DigitalOcean Backups,可参阅文中“为数据库创建热备份”章节的内容。

在这部分教程中,我们将设置Bacula作为应用设置内各服务器(包括db1、app1、app2以及lb1)的备份方案,其中包括如何利用Bacula创建LAMP堆栈备份。我们还将利用Percona XtraBackup为MySQL数据库创建热备份。最后,我们将利用rsync在远程数据中心的服务器上创建一套备份副本。这意味着设置中将包含两台服务器:备份服务器与远程备份服务器(远程备份服务器存在于单独的数据中心内)。

马上进入正题。

在备份服务器上安装Bacula

备份服务器上的Bacula设置方式请参阅如何在Ubuntu 14.04上安装Bacula服务器

接下来参阅如何利用Bacula备份一套Ubuntu 14.04服务器中的Bacula Director配置(服务器)章节。在这里,我们需要在设置Bacula客户端(位于需要备份的服务器之上)时使用Director名称。

请注意,我们将使用RemoteFile池以处理全部备份任务,因此在实际处理前我们需要对其进行设定调整以满足具体需求。

在各服务器上安装Bacula客户端

请参阅如何利用Bacula备份一套Ubuntu 14.04服务器以了解在各需备份服务器上安装Bacula客户的具体方式。

请注意,大家需要使用各服务器上bacula-fd.conf文件中的FileDaemon Name(通常为添加“-fd”后缀的主机名称)以及Director Password(即Bacula服务器用于同各客户端对接的密码)。

向备份服务器添加Bacula客户端

在每台已经安装了Bacula客户端的服务器上,将Client资源添加至/etc/bacula/conf.d/clients.conf文件。

打开该clients.conf文件:

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

以下示例为面向数据库服务器db1的Client资源定义。请注意,Name值应当与FileDaemon资源的Name相匹配,而Password则需要匹配Director资源的Password。大家可以在各Bacula客户端服务器的/etc/bacula/bacula-fd.conf文件中找到这些值:

clients.conf — Example Client resource definition

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客户端服务器创建同样的Client资源。在本示例中,完成后应共有四项Client资源,分别为db1-fd、app1-fd、app2-fd与lb1-fd。通过这样的Bacula Director设置方式,我们将能够保证Bacula客户端接入各服务器。

保存并退出。

更多细节信息可参阅如何利用Bacula备份一套Ubuntu服务器教程中的“安装并配置Bacula客户端”章节。

为数据库创建热备份

为了确保活动数据库备份的可用性,这里我们可以轻松利用Percona XtraBackup为MySQL创建热备份。

安装Percona XtraBackup

请参阅如何在Ubuntu 14.04上利用Percona XtraBackup为MySQL数据库创建热备份以了解在数据库服务器(db1)上安装并配置Percona XtraBackup的具体方式。

创建XtraBackup脚本

Percona XtraBackup现在已经做好为MySQL数据库创建热备份的准备,但这里我们还需要对热备份进行调度。在本示例中,我们选择最简单的实现方式:使用bash脚本与cron任务。

在/usr/loca/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

保存并退出。运行此脚本(使用superuser权限)将删除/data/backups/full中的现有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

通过这种方式,该脚本将以root权限于每天10:30pm运行。之所以选择这个时间点,是因为Bacula目前的调度计划为每天11:05 pm进行日常运行——我们稍后会对其进行调整。这意味着XtraBackup脚本有35分钟的时间窗口用于执行任务。

现在,数据库热备份机制已经设置完成,下面来看Bacula备份FileSets。

配置Bacula FileSets

Bacula将在与备份任务相关的FileSets当中创建文件备份,由此创造的FileSets还将用于我们的恢复规划。大家可以参阅添加FileSets (服务器)部分内容以了解更多细节信息。

在备份服务器上打开filesets.conf文件:

- sudo vi /etc/bacula/conf.d/filesets.conf
数据库服务器FileSet

根据数据库服务器恢复规划,我们的数据库服务器需要以下几套备份:

  • MySQL数据库: 每天10:30pm在/data/backups/full中由XtraBackup脚本创建一套备份副本。
  • MySQL配置: 位于/etc/mysql。

我们还需要在XtraBackup脚本中包含:

/usr/local/bin/run_xtrabackup.sh以及相关cron文件。

考虑到备份要求,我们还需要将“MySQL Database”FileSet添加到Bacula配置当中:

filesets.conf — MySQL Database

FileSet {
Name = "MySQL Database"
Include {
Options {
  signature = MD5
  compression = GZIP
}
File = /data/backupsFile = /etc/mysql/my.cnfFile = /usr/local/bin/run_xtrabackup.shFile = /etc/cron.d/xtrabackup
}
Exclude {
File = /data/backups/exclude
}
}

接下来处理应用服务器FileSet。

应用服务器FileSet

根据应用服务器备份要求,我们的应用服务器需要以下几套备份:

  • 应用文件:在本示例中位于/var/www/html。

考虑到备份要求,我们将把“Apache DocumentRoot”FileSet添加至Bacula配置当中:

filesets.conf — Apache DocumentRoot

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

大家可能还需要添加Apache端口配置文件,这里可以简单替换因此不再赘述。

现在,让我们着手处理负载均衡服务器FileSet。

负载均衡服务器FileSet

根据负载均衡服务器恢复规划,我们需要的备份包括:

  • SSL证书(PEM)与相关文件: 在本示例中位于/root/certs
  • HAProxy配置文件:位于/etc/haproxy

考虑到备份要求,我们需要将“Apache DocumentRoot”FileSet添加至Bacula配置当中:

filesets.conf — SSL Certs and HAProxy Config

FileSet {
Name = "SSL Certs and HAProxy Config"
Include {
Options {
  signature = MD5
  compression = GZIP
}
File = /root/certsFile = /etc/haproxy
}
Exclude {
File = /root/exclude
}
}

保存并退出。

现在我们的FileSets已经配置完成。下面创建负责使用这些FileSets的Bacula备份Job。

创建Bacula备份Job

在这里,我们要创建负责运行并创建服务器备份的Bacula备份Job。

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

- sudo vi /etc/bacula/conf.d/jobs.conf
数据库服务器备份Job

作为数据库服务器备份任务,我们需要创建一个名为“Backup db1”的Job,请注意使用我们之前指定的正确Client(db1-fd)与FileSet(MySQL Database):

jobs.conf — Backup db1

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

接下来设置应用服务器备份任务。

应用服务器备份Job

在应用服务器方面,我们需要创建两个备份Job,分别为“Backup app1”与“Backup app2”.请注意使用之前指定的正确Client(app1-fd与app2-fd)及FileSet(Apache DocumentRoot)。

App1 Job:

jobs.conf — Backup app1

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

App2 Job:

jobs.conf — Backup app2

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

Now we will set up the load balancer server backup job.

负载均衡服务器备份Job

作为负载均衡服务器备份任务,我们需要创建“Backup lb1”Job。注意使用之前指定的正确Client(lb1-fd)与FileSet(SSL Certs与HAProxy Config):

jobs.conf — Backup lb1

Job {
Name = "Backup lb1"
JobDefs = "DefaultJob"
Client = lb1-fd
Pool = RemoteFile
FileSet="SSL Certs and HAProxy Config"
}

保存并退出。

现在我们的备份Job已经配置完成,最后一步是重启Bacula Director。

重启Bacula Director

在备份服务器上重启Bacula Director以应用各项变更:

- sudo service bacula-director restart

现在,大家可能需要测试自己的客户端连接与备份任务,具体方式可参阅如何利用Bacula备份一台服务器。这份教程讲解了如何恢复Bacula备份。请注意,恢复MySQL数据库的具体方式可参阅执行备份恢复部分内容。

审查备份计划

我们可以修改Bacula Director配置(/etc/bacula/bacula-dir.conf)以调整Bacula备份计划。全部备份Job都将使用“DefaultJob”JobDef,其使用“WeeklyCycle”计划,具体定义为:

  • 每月第一个周日11:05pm进行完整备份
  • 其余各周日11:05pm进行差异备份
  • 周五到周六11:05pm进行增量备份

大家可以利用Bacula控制器检查Director状态进行验证,其应当输出全部预设任务:

Director Status — Scheduled Jobs

Scheduled 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:30pm)能够防止应用与数据库间的备份内容出现不一致冲突。

设置远程备份

现在大家已经可以设置一台远程服务器以存储全部Bacula备份副本。这台远程服务器应当处于不同地理区域,从而保证在生产数据中心遭遇自然灾害时业务仍然不受影响。在本示例中,我们将使用DigitalOcean的旧金山(SF01)服务区作为远程备份服务器。

我们还需要利用公共SSH密钥、rsync与cron将备份副本由备份服务器发送至远程备份服务器。

在远程服务器上创建一个用户,用于实现rsync登录。

接下来,在备份服务器上以root权限生成一条无密码SSH密钥对。将该公共密钥安装在此前创建的远程备份用户之上,具体请参阅如何设置SSH密钥一文。

在备份服务器上,通过rsync命令将Bacula备份数据(位于/bacula/backup)复制到远程备份服务器当中。具体参阅如何使用rsync。具体命令内容如下:

- rsync -az /bacula/backup remoteuser@remotebackups_public_hostname_or_IP:/path/to/remote/backup

将该命令添加至脚本当中,例如/usr/local/bin/rsync_backups.sh,并为其提供执行权限。

最后,我们还需要设置一个cron任务,负责以root权限在Bacula备份任务完成后运行该rsync_backups.sh脚本。具体请参阅如何利用cron设置日常任务一文。

到这里工作就全部完成了,大家可以等待一天并观察远程备份服务器上是否出现了备份副本。

其它注意事项

这里我们并没有谈到备份的磁盘需求。大家当然需要在设计备份方案时考虑磁盘空间资源,同时根据具体情况设定备份规划。

除了为应用服务器创建备份之后,大家可能还需要将其它服务器纳入备份计划。例如,大家应当配置Bacula以创建中央监控日志记录服务器备份。

总结

现在,大家应该已经拥有指向应用服务器的日常备份机制与远程备份副本了。请确保我们有能力对文件进行恢复,同时将数据恢复步骤添加到恢复计划当中。

在下一篇教程中,我们将了解如何对生产服务器设置进行监控:生产环境构建指南:Web应用——监控

本文来源自DigitalOcean Community。英文原文:Building for Production: Web Applications — Backups By Mitchell Anicas

翻译:diradw

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐