構建生產:網絡應用程序—備份

引言

在為您的應用程序的各種组成部分制定恢復計劃之後,您應該建立所需的備份系統來支撐它。本教程將著重於使用Bacula作為備份解決方案。使用像Bacula這樣的全方位備份系統的優點是,它讓您能夠在個別文件级别上完全控制您要備份和恢復的内容,並且您可以根據對您來說最好的方式來計劃備份和恢復。

DigitalOcean Droplet 備份(您整個Droplet的快照備份)這樣的解決方案很容易設定,如果只需要週期性備份,可能會足夠滿足您的需求。如果您選擇DigitalOcean 備份,請確保通過遵循為您的數據庫創建熱備份部分來設定數據庫的热備份。

在本教程的这一部分,我們將為 必需備份 的服務器(db1、app1、app2 和 lb1)設定 Bacula,這些服務器之前在我們的恢復計劃中已經被定義—— essentially, this is a tutorial that shows you how to use Bacula to create backups of a LAMP stack. 我們還將使用 Percona XtraBackup 創建 MySQL 數據庫的熱備份。最後,我們將使用 rsync 在遠程數據中心的服务器上創建備份副本。這將為您的設置增加兩台服務器:backupsremotebackups(位於不同的數據中心)。

讓我們開始吧。

在 Backups 服務器上安裝 Bacula

按照以下教程在您的 backups 服務器上設定 Bacula:如何在 Ubuntu 14.04 上安裝 Bacula 服務器

然後按照 Organize Bacula Director Configuration (Server) 這一節的指示進行:How To Back Up an Ubuntu 14.04 Server with Bacula. 您需要在設定 Bacula 客户端時用到 Director Name(伺服器名)。當您到達 Install and Configure Bacula Client 那一節時便停止。留意我們將會使用 RemoteFile 池來儲存所有備份Job。在這之前,您或許想改變一些設定再繼續。

記住,我們將使用 RemoteFile 池來存儲所有的備份工作。在此之前,您也許想要改變一些設定再繼續。

Install Bacula Client on Each Server

在每個要備份的服务器上安裝Baculaclient(例如 db1、app1、app2 和 lb1),請遵循 Install and Configure Bacula Client 這一節的指示:How To Back Up an Ubuntu 14.04 Server with Bacula。當您到達 Add FileSets (Server) 那一節時便停止。

請注意您將需要從每個伺服器的bacula-fd.conf文件中取得的FileDaemon 名稱(通常是在主機名稱後加上“-fd”)和Director 密碼(Bacula 服務器將使用以連接到每個客戶端的密碼)。

將Bacula客戶端添加到備份伺服器

backups,Bacula服務器上,為您已在其上安裝Bacula客戶端的每個伺服器在/etc/bacula/conf.d/clients.conf文件中添加一個客戶端資源

打開clients.conf文件:

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

以下是与数据库服务器db1相关的客户资源定义的示例。注意Name的值应与FileDaemon资源的名称相匹配,Password应与Director资源的密码相匹配,在客户机服务器上—这些值可以在每个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客户机服务器创建一个类似的客户资源。在我们的示例中,完成时应该有四个客户资源:db1-fdapp1-fdapp2-fdlb1-fd。这配置了backups服务器上的Bacula Director,使其能够连接到每个服务器上的Bacula客户机…

儲存並退出。

關於此部分的更多詳細信息,請在《如何使用Bacula备份Ubuntu伺服器》教程的《安装和配置Bacula客户端》節中查找。

建立数据库的热备份

為了確保我們生成的活性数据库备份是一致的(即可用),必須特別留意。使用MySQL建立熱備份的一个簡單有效方法是使用Percona XtraBackup。

安裝Percona XtraBackup

在您的數據庫服務器db1上,按照這個教程《如何在Ubuntu 14.04上使用Percona XtraBackup为MySQL数据库创建热备份》來安裝和配置Percona XtraBackup。當您達到执行完整的热备份部分時,停止。

建立 XtraBackup 脚本

Percona XtraBackup 準備好為您的 MySQL 數據庫創建熱备份,這將最終由 Bacula(或 DigitalOcean 備份)進行備份,但是熱備份必須以某种方式計劃。我們將建立最簡單的解決方案:一個 bash 腳本和一個 cron 工作任务。

/usr/local/bin 目錄下建立一個名為 run_extra_backup.sh 的 bash 腳本:

  1. 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 "{}" \;

# 刪除现有的完整備份
rm -r /data/backups/full

# xtrabackup 創建備份
innobackupex --user=bkpuser  --password=bkppassword --no-timestamp /data/backups/full

# xtrabackup 準備備份
innobackupex --apply-log /data/backups/full

保存並退出。以超用戶權限運行此腳本將刪除 /data/backups/full 目錄中的现有 XtraBackup 備份並創建新的完整備份。關於使用 XtraBackup 創建備份的詳細信息,請查看 XtraBackup 教程中的 進行完整熱備份 部分。

將腳本設置為可執行:

  1. sudo chmod +x /usr/local/bin/run_xtrabackup.sh

為了正確備份我們的數據庫,我們必須在 Bacula 試圖備份數據庫伺服器之前運行(並完成)XtraBackup 腳本。一個好的解決方案是將您的 Bacula 備份任務配置為運行該腳本作為“預備份腳本”,但我們將選擇使用cron 作業以保持簡單。

創建一個 cron 配置文件(位於/etc/cron.d中的文件將添加到 root 的 crontab):

  1. 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 備份 FileSets。

配置 Bacula FileSets

Bacula會為在FileSets中指定的文件建立備份,這些FileSets與將要執行的備份工作關聯。本節將覆盖創建包含我們在恢復計劃中識別的必需備份的FileSets。有关將FileSets添加到Bacula的詳細信息,可以在Bacula教程的添加FileSets(服務器)部分找到。

在您的備份服務器上,打開filesets.conf文件:

  1. sudo vi /etc/bacula/conf.d/filesets.conf

數據庫服務器FileSet

根據我們的數據庫服務器恢復計劃,我們數據庫服務器的必需備份包括:

  • MySQL數據庫:我們的XtraBackup腳本在/data/backups/full於每晚10:30創建備份副本
  • MySQL配置:位於/etc/mysql

我們還將包括XtraBackup腳本:/usr/local/bin/run_xtrabackup.sh及相關的计划文件。

考慮到我們的必需備份,我們將向Bacula配置中添加這個“MySQL數據庫”FileSet:

filesets.conf — MySQL Database
FileSet {
  Name = "MySQL Database"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /data/backups
    File = /etc/mysql/my.cnf
    File = /usr/local/bin/run_xtrabackup.sh
    File = /etc/cron.d/xtrabackup
  }
  Exclude {
    File = /data/backups/exclude
  }
}

現在讓我們繼續到應用程序服務器的FileSet。

應用服務器文件集

根據我們的應用服務器恢復計劃,我們需要的應用服務器備份包括:

  • 應用文件:在我們的示例中位於 /var/www/html

考慮到我們需要的備份,我們將向我們的Bacula配置中添加這個“Apache文檔根”文件集:

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端口配置文件,但該文件可以輕鬆地替換。

現在讓我們繼續移至負載平衡器服務器的文件集。

負載平衡器服務器文件集

根據我們的負載平衡器服務器恢復計劃,我們需要的負載平衡器服務器備份包括:

  • SSL證書(PEM)及相关文件:在我們的示例中位於 /root/certs
  • HAProxy配置文件:位於 /etc/haproxy

考慮到我們需要的備份,我們將向我們的Bacula配置中添加這個“Apache文檔根”文件集:

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

保存並退出。

現在我們的檔案集已經配置好了。讓我們繼續來設定會使用這些檔案集的Bacula備份Job。

建立Bacula備份Job

我們將會為我們的伺服器创建Bacula備份Job。

在/etc/bacula/conf.d中創建一個jobs.conf檔案:

  1. sudo vi /etc/bacula/conf.d/jobs.conf

資料庫伺服器備份Job

對於我们的資料庫伺服器的備份Job,我們將創一个新的Job named “Backup_db1”.重要的是我們指定正確的 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

對於我們的應用服務器,我們將會創兩個备份Job named “Backup_app1″和”Backup_app2”.重要的是我們指定正確的 Clients (app1-fd和app2-fd)和 FileSet (Apache DocumentRoot)。

App1Job:

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

應用2工作:

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

現在我們將設定负载均衡伺服器備份Job。

負載均衡伺服器備份Job

對於我們的负载均衡伺服器備份Job,我们将創一个新的Job名稱為“备份lb1”。重要的是我們指定正確的客戶端(lb1-fd)和檔案集(SSL Certs和HAProxyConfig):

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以使所有更改生效:

  1. sudo service bacula-director restart

在這個時候,你將會想要測試你的客户端連接和備份工作,這都cover在如何用Bacula备份伺服器的教程當中。那個教程也cover了如何恢復Bacula備份。請記住恢復MySQL資料庫需要跟從執行備份恢復步驟。

檢視備份計劃

Bacula的備份計劃可以透過修改Director的配置(/etc/bacula/bacula-dir.conf)來調整。我們所建立的全部Job都使用“DefaultJob”JobDef,它使用“WeeklyCycle”計劃,定義為:

  • 每月第一個星期天的晚上11:05進行全備份
  • 其他所有星期天晚上11:05進行差分備份
  • 在其他日子,星期一至星期六,於晚上11:05進行 incremental備份

你可以通過Bacula控制台來檢查Director的状态,應該會輸出所有的预定Job:

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:30)是有意义的。这样可以确保应用程序和数据库备份之间的一致性。

设置远程备份

现在我们可以设置一个远程服务器来存储Bacula备份副本。这个远程服务器应该位于与生产数据中心不同的地理区域,这样即使在生产数据中心发生灾难的情况下,您仍然有一个关键备份的副本。在我们的例子中,我们将使用DigitalOcean的旧金山(SFO1)地区作为我们的远程备份服务器。

我们将解释一种简单的方法,使用公共SSH密钥、rsync和cron从备份服务器将备份发送到远程备份服务器。

远程备份服务器上,创建一个用户,该用户用于rsync登录。

接著,在 備份伺服器 上,作為root用戶生成一個不需要密码的SSH密鑰對。將public key安裝於剛剛創建的 遠端备份 用户的帐户上。這裏有我們 如何设置SSH密鑰 的教程可供參考。

備份 伺服器上,寫一個rsync命令來複製Bacula的備份資料(/bacula/backup)到 remotepackages 伺服器上的某个位置。Rsync的使用方法在我们的 如何使用Rsync 教程中有介紹。該命令可能會像這樣:

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

將命令加入到一個腳本中,例如 /usr/local/bin/rsync_backups.sh 並使其可執行。

最後,您需要設置一个cronjob来讓 rsync_backups.sh 脚本在Bacula的备份作业完成后作为root用户执行。这部分内容可以在我们的 如何使用cron安排定期任务 教程中找到。

配置好后,第二天检查 远程备份 服务器上是否有您的备份副本。

其他考慮因素

我們剛剛沒有谈到備份所需要的磁碟空間。你一定要檢查一下你的備份用了多少空間,並且根據你的需要和資源來調整你的設置和備份計劃。

除了對應用服務器的備份之外,你可能還想要為任何其他添加到你的设置中的服务器設定備份。例如,一旦你设置了監控和集中日志記錄伺服器,你就應該配置Bacula來对这些服务器创建备份。

結論

你现在应该每天对你的生产应用程序服务器进行备份,并且有一个远程副本。确保您能够恢复文件,并将恢复步骤添加到您的恢复计划中。

继续下一个教程来开始为你的生产服务器设置监控:构建生产环境:Web应用程序——监控

Source:
https://www.digitalocean.com/community/tutorials/building-for-production-web-applications-backups