1. 程式人生 > >生產環境構建指南:Web應用——備份

生產環境構建指南: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 Director配置(伺服器)章節。在這裡,我們需要在設定Bacula客戶端(位於需要備份的伺服器之上)時使用Director名稱。

請注意,我們將使用RemoteFile池以處理全部備份任務,因此在實際處理前我們需要對其進行設定調整以滿足具體需求。

在各伺服器上安裝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客戶端接入各伺服器。

儲存並退出。

為資料庫建立熱備份

為了確保活動資料庫備份的可用性,這裡我們可以輕鬆利用Percona XtraBackup為MySQL建立熱備份。

安裝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 [email protected]_public_hostname_or_IP:/path/to/remote/backup

將該命令新增至腳本當中,例如/usr/local/bin/rsync_backups.sh,併為其提供執行許可權。

最後,我們還需要設定一個cron任務,負責以root許可權在Bacula備份任務完成後執行該rsync_backups.sh指令碼。具體請參閱如何利用cron設定日常任務一文。

到這裡工作就全部完成了,大家可以等待一天並觀察遠端備份伺服器上是否出現了備份副本。

其它注意事項

這裡我們並沒有談到備份的磁碟需求。大家當然需要在設計備份方案時考慮磁碟空間資源,同時根據具體情況設定備份規劃。

除了為應用伺服器建立備份之後,大家可能還需要將其它伺服器納入備份計劃。例如,大家應當配置Bacula以建立中央監控日誌記錄伺服器備份。

總結

現在,大家應該已經擁有指向應用伺服器的日常備份機制與遠端備份副本了。請確保我們有能力對檔案進行恢復,同時將資料恢復步驟新增到恢復計劃當中。

在下一篇教程中,我們將瞭解如何對生產伺服器設定進行監控:生產環境構建指南:Web應用——監控

翻譯:diradw

相關推薦

生產環境構建指南Web應用——備份

系列教程 內容簡介 在為應用中的各元件建立起恢復規劃後,大家需要設定備份系統以為其提供支援。在今天的教程中,我們將瞭解如何利用Bacula構建備份解決方案。使用Bacula這類完整的備份系統能夠幫助大家完全掌控備份內容,立足於單個檔案級別進行細化

生產環境構建指南Web應用——部署

系列教程 內容簡介 在今天的教程中,我們將探討如何部署示例PHP應用、WordPress以及專有DNS: 使用者可通過域名經由HTTPS訪問我們的應用,而此域名則指向負載均衡器。負載均衡器將充當應用伺服器的反向代理,而應用伺服器則接入資料庫伺服

生產環境構建指南Web應用——恢復規劃

系列教程 內容介紹 現在我們已經擁有了自己的示例應用設定,接下來為其構建一套恢復規劃。所謂恢復規劃是一套配備文字記錄的規程集合,用於在伺服器設定內恢復潛在故障或者管理錯誤。另外,建立這樣一套恢復規劃還能幫助大家掌握應用伺服器設定內的元件與資料。

構建Fabric的web應用--搭建一個Fabric網路環境(二)

想知道更多區塊鏈技術開發問題,請百度【鏈客區塊鏈技術問答社群】進入 配置docker-compose.yml檔案 在 fixtures 目錄下建立一個 docker-compose.yml 檔案並編輯 $ vim docker-compose.yml 將 network下的bas

構建Fabric的web應用--搭建一個Fabric網路環境(一)

想知道更多區塊鏈實戰技術,請百度【鏈客區塊鏈技術問答社群】進入 引言 a. 說明 我們不會在本教程中詳細解釋 Hyperledger Fabric 的工作原理。在學習本教程之前,您應該通過Hyperledger Fabric 官網 或其它渠道學習 Hyperledger Fabric 的

摘記Web應用系統測試內容

目標 最小化 ica 界面 電子郵件 描述 郵件 時間 運行 表示層: 內容測試,包括整體審美、字體、色彩、拼寫、內容準確性和默認值 Web站點結構,包括無效的鏈接或圖形 用戶環境,包括Web瀏覽器版本和操作系統配置(

Repractise基礎篇Web應用開發七日談

一些事 mit 個人 性能 簡單的 第五天 第一天 ogg 喜歡 Repractise基礎篇:Web應用開發七日談 本來想的僅僅是畫一個例如以下的七日圖來說說Web開發的。隨後又想了想這似乎是一個非常棒的Web開發相關的知識介紹。應用開發是一個非常有意

【Head First Servlets and JSP】筆記 26 web 應用部署

ins servlet schema servlets pre cati www 錯誤 b- 【須知】 物理目錄結構與虛擬目錄結構的差異 WAR 實際上就是 JAR 什麽東西應該放在 WEB-INF 文件夾下? 【了解】 <mime-mappin

django1.11.6+nginx1.12.2+uwsgi2.0.15 部署 | autoops 生產環境部署指南

nginx uwsgi djang autoops 安裝python3.6 yum -y install xz wget gcc make gdbm-devel openssl-devel sqlite-devel zlib-devel bzip2-devel wget http://mir

go語言快速入門Web應用的HelloWorld(11)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

SpringBoot | 第十七章web 應用開發之檔案上傳

前言 上一章節,我們講解了利用模版引擎實現前端頁面渲染,從而實現動態網頁的功能,同時也提出了相容jsp專案的解決方案。既然開始講解web開發了,我們就接著繼續往web這個方向繼續吧。通常,我們在做web開發時,碰見諸如附件上傳、圖片頭像上傳等檔案的上傳需求也是再正常不過的。

SpringBoot | 第十九章web 應用開發之 WebSocket

前言 web開發也講解了三章了,這章節開始講解關於與前端通訊相關知識。實現一個線上聊天室類似的功能或者後端推送訊息到前端,在沒有WebSocket時,讀大學那夥還有接觸過DWR(Direct Web Remoting),也使用過輪詢的方式,當Servlet3.0出來後,也有

ASP.NET Core 入門教程 1、使用ASP.NET Core 構建第一個Web應用

一、前言 1、本文主要內容 Visual Studio Code 開發環境配置 使用 ASP.NET Core 構建Web應用 ASP.NET Core Web 應用啟動類說明 ASP.NET Core Web 專案結構說明 2、本教程環境資訊 軟體/環境說明 作業系統 Windows 10

SpringBoot | 第十八章web應用開發之WebJars使用

前言 前面一章節我們主要講解了關於檔案上傳的兩種方式。本章節繼續web開發的相關知識點。通常對於web開發而言,像js、css、images等靜態資源版本管理是比較混亂的,比如Jquery、Bootstrap、Vue.js可能各個前端框架所依賴的自個元件的版本都不盡相同,一

換個姿勢學習Kubernetes運營,如何5個月在生產環境構建K8S?_Kubernetes中文社群

在分散式系統上管理服務是運維團隊面臨的最困難的問題之一。在生產中突破新軟體並學習如何可靠地運營是非常重要的。本文是一則例項,講述為什麼學習運營Kubernetes很重要,以及為什麼很難。本文是關於Kubernetes bug導致的一小時中斷故障的事後剖析。為什麼選擇在Kuberne

系統架構Web應用架構的新趨勢---前端和後端分離的一點想法

  最近研究servlet,看書時候書裡講到了c/s架構到b/s架構的演變,講servlet的書都很老了,現在的b/s架構已經不是幾年前的b/s架構,其實b/s架構就是web應用開發,對於這樣的架構我們現在應該考慮的是前端和後端的分離(注意:這裡的後端是指服務端)。   Web前端現在是一個獨立的技術工種,

Building Modern Web Apps-構建現代的 Web 應用程式(一些感想)

視訊長度:1 小時左右 視訊作者:Scott Hunter 和 Scott Hanselman 視訊背景:Visual Studio 2013 最新版本釋出 視訊來源:MSDN - Channel 9 一些感想 這段視訊雖然標題設定為 Visual Studio 2013 最新版本釋出,但其實並沒有對

【譯】唯快不破Web 應用的 13 個優化步驟

時過境遷,Web 應用比以往任何時候都更具互動性。搞定效能可以幫助你極大地改善終端使用者的體驗。閱讀以下的技巧並學以致用,看看哪些可以用來改善延遲,渲染時間以及整體效能吧! 更快的 Web 應用 優化 Web 應用是一項費勁的工作。Web 應用不僅處於客戶端

SSH開發環境的配置web.xml、Spring整合hibernate和Spring整合Struts2

一、struts + hibernate + Spring整合開發包的匯入:從myeclipse整合開發工具中匯入或者從相應網站下載然後放在工程專案WEB-INF包下的lib包內即可。 二、本文主要說明開發包匯入後對配置檔案的配置。 三、相應配置檔案的配置:web.xml、

Apache+MySQL+Python+Django在Windows下環境搭建指南(Python Web環境搭建)

搭建一個簡單的Python的Web環境 之前一直都是採用PHP做Web伺服器環境,目前一個專案中需要用到python的一個第三方庫(Beautifual Soup ),但是又希望這個服務以Web服務形式提供,苦尋了好久,沒找到php中有對應的庫,只好另闢蹊徑,採用pytho