介紹
備份對於雲端伺服器非常重要。無論您正在運行一個專案,將所有數據存儲在一個單獨的伺服器上,還是直接從 Git 部署到虛擬機,這些虛擬機會在保留最小一組日誌的同時被啟動和關閉,您都應該為故障情況做好準備。這可能意味著很多不同的事情,具體取決於您使用的應用程序,即時故障轉移對您有多重要,以及您預期會遇到什麼樣的問題。
在本指南中,您將探討提供備份和數據冗餘的不同方法。由於不同的使用情況需要不同的解決方案,本文無法給出一個適合所有情況的答案,但您將了解到在不同情境下重要的事情以及哪些實現方案最適合您的運營。
在本指南的第一部分,您將查看幾種備份解決方案,並檢討每種解決方案的相對優點,以便您可以選擇適合您環境的方法。在第二部分中,您將探索冗餘選項。
第 1 部分 — 冗餘和備份有何不同?
這些術語冗餘和備份的定義通常是重疊的,在許多情況下容易混淆。這是兩個相關但不同的概念。一些解決方案提供兩者。
冗餘
數據的冗餘意味著在系統出現問題時有立即的故障轉移。故障轉移意味著如果一組數據(或一個主機)不可用,則會立即將另一個完美的副本交換到生產環境中,以取代它。這導致幾乎不可察覺的停機,應用程序或網站可以繼續處理請求,就好像什麼都沒發生一樣。與此同時,系統管理員(在這種情況下,您)有機會修復問題,將系統恢復到完全運行的狀態。
然而,冗餘解決方案通常不是備份解決方案。冗餘存儲不一定提供對影響整個機器或系統的故障的保護。例如,如果您配置了鏡像RAID(如RAID 1),則您的數據是冗餘的,如果一個磁盤失敗,則另一個仍然可用。但是,如果機器本身失敗,則所有數據可能會丟失。
具有冗余解决方案,如MySQL集群复制,通常会在每个数据副本上执行每个操作。这包括恶意或意外的操作。根据定义,备份解决方案还应允许您从数据已知为良好的先前点进行恢复。
备份
一般来说,您需要为重要数据维护功能备份。根据您的情况,这可能意味着备份应用程序或用户数据,或整个网站或机器。备份的理念是,在系统、机器或数据丢失的情况下,您可以恢复、重新部署或以其他方式访问您的数据。从备份中恢复可能需要停机时间,但这可能意味着从一天前开始或从头开始的区别。任何您无法承受丢失的东西都应该根据定义备份。
在方法方面,有许多不同级别的备份。这些可以根据不同类型的问题进行分层。例如,您可以在修改配置文件之前备份它,以便在出现问题时可以恢复到旧的设置。这对于您正在积极监视的小更改来说是理想的。但是,这种设置在磁盘故障或任何更复杂的情况下会失败。您还应该定期将备份自动备份到远程位置。
備份本身不提供自動故障切換。這意味著您的故障可能不會造成任何數據損失(假設您的備份是100%最新的),但可能會影響您的正常運行時間。這是為什麼冗餘和備份通常結合使用的一個原因。
第2部分 — 檔案級別備份
最為熟悉的備份形式之一是檔案級別備份。這種類型的備份使用常規的文件系統級別複製工具將文件傳輸到另一個位置或設備。
如何使用 cp 命令
理論上,您可以使用 cp
命令備份 Linux 機器,比如您的雲服務器。這將文件從一個本地位置複製到另一個本地位置。在本地計算機上,您可以掛載可移動驅動器,然後將文件複製到該驅動器:
此示例將可移動磁碟 sdc
掛載為 /mnt/my-backup
,然後將 /etc
目錄複製到該磁碟。然後卸載驅動器,可以將其存放在其他地方。
如何使用 Rsync
A better alternative to cp
is the rsync
command. Rsync is a powerful tool that provides a wide array of options for replicating files and directories across many different environments, with built-in checksum validation and other features. Rsync can perform the equivalent of the cp
operation above like so:
-azvP
是典型的 Rsync 选项集。以下是对每个选项的详细解释:
a
enables “Archive Mode” for this copy operation, which preserves file modification times, owners, and so on. It is also the equivalent of providing each of the-rlptgoD
options individually (yes, really). Notably, the-r
option tells Rsync to recurse into subdirectories to copy nested files and folders as well. This option is common to many other copy operations, such ascp
andscp
.z
compresses data during the transfer itself, if possible. This is useful for any transfers over slow connections, especially when transferring data that compresses very effectively, like logs and other text.v
enables verbose mode, so you can read more details of your transfer while it is in progress.P
tells Rsync to retain partial copies of any files that do not transfer completely, so that transfers can be resumed later.
您可以在其 man 页面上查看其他 rsync 选项。
当然,在云环境中,您通常不会每次都挂载和复制文件到已挂载的磁盘上。Rsync 还可以通过提供类似于 SSH 的语法在网络上执行远程备份。只要您可以 SSH 进入任何主机,并且在两端都安装了 Rsync,这将适用于任何主机。因为 Rsync 被认为是核心 Linux 工具,这几乎总是一个安全的假设,即使您在 Mac 或 Windows 机器上本地工作也是如此。
这将把本地机器的 /etc
目录备份到位于 remote_host
上的 /backup
目录中。如果您有权限写入此目录并且有可用空间,则此操作将成功。
您还可以查看有关 如何使用 Rsync 同步本地和远程目录 的更多信息。
如何使用其他备份工具
雖然cp
和rsync
都很有用且普遍,但它們本身並不是完整的解決方案。要使用 Rsync 自動備份,您需要創建自己的自動程序、備份計劃、日誌輪轉等等。雖然這對於一些非常小型的部署可能是適合的,這些部署不希望使用外部服務,或者非常大型的部署有專門的資源來維護非常精細的腳本以滿足各種需求,但許多用戶可能會希望投資於專用的備份方案。
Bacula
Bacula 是一個複雜而靈活的解決方案,它采用客戶端-服務器模型。Bacula 設計了客戶端、備份位置和主管(實際備份的組件)之間的分離概念。它還將每個備份任務配置為一個稱為“作業”的單元。
這使得配置極為精細和靈活。您可以將多個客戶端備份到一個存儲設備,將一個客戶端備份到多個存儲設備,並通過添加節點或調整其詳細信息來修改備份方案。它在網絡環境中運行良好,並且可擴展和模塊化,非常適合備份分佈在多個服務器上的站點或應用程式。
Duplicity
Duplicity 是另一個開源的備份工具。它默認使用 GPG 加密進行傳輸。
使用GPG加密進行文件備份的明顯好處是數據不是以純文本形式存儲。只有擁有GPG密鑰的所有者才能解密數據。這提供了一定程度的安全性,以抵消在數據存儲在多個位置時所需的額外安全措施。
對於不經常使用GPG的人來說,可能不明顯的另一個好處是每個交易都必須經過驗證,以確保完全準確。GPG和Rsync一樣,強制執行哈希檢查,以確保在傳輸過程中沒有數據丟失。這意味著從備份恢復數據時,您會明顯更少地遇到文件損壞。
第三部分 — 塊級別備份
A slightly less common, but important alternative to file-level backups are block-level backups. This style of backup is also known as “imaging” because it can be used to duplicate and restore entire devices. Block-level backups allow you to copy on a deeper level than a file. While a file-based backup might copy file1, file2, and file3 to a backup location, a block-based backup system would copy the entire “block” that those files reside on. Another way of explaining the same concept is to say that block-level backups copy information bit after bit. They do not know about the files that may span those bits.
塊級別備份的一個優勢是它們通常更快。而基於文件的備份通常為每個單獨的文件啟動一個新的傳輸,基於塊的備份將傳輸塊,這意味著需要啟動更少的非順序傳輸才能完成複製。
使用dd執行塊級別備份
執行區塊級別備份的最常見方法是使用 dd
工具。 dd
可用於創建整個磁盤映像,並且在封存可移動媒體(如 CD 或 DVD)時也經常使用。這意味著您可以將分割區或磁盤備份到單個文件或原始設備而無需任何準備步驟。
要使用 dd
,您需要指定輸入位置和輸出位置,如下所示:
在這種情況下,if=
參數指定了 輸入 設備或位置。 of=
參數指定了 輸出 文件或位置。請注意不要混淆這些,否則您可能會錯誤地抹掉整個磁盤。
例如,要備份包含您文件的分割區,該分割區位於 /dev/sda3
,您可以提供一個輸出路徑到一個 .img
文件來創建該目錄的映像:
第四部分 — 備份版本控制
備份數據的主要動機之一是能夠在不需要的更改或刪除的情況下恢復文件的以前版本。雖然到目前為止提到的所有備份機制都可以實現這一點,但您也可以實現更細粒度的解決方案。
例如,手動完成這個任務的一種方法是在使用 nano
編輯文件之前創建文件的備份:
你甚至可以通過在每次使用編輯器修改文件時創建時間戳隱藏文件來自動化此過程。例如,你可以將以下內容放入你的~/.bashrc
文件中,這樣每次你從bash
(即$
)shell中執行nano
時,它都會自動創建一個帶有年份(%y
)、月份(%m
)、日期(%d
)等時間戳的備份:
這種方法只適用於你使用nano
手動編輯文件的範圍內,並且存在著一些限制,可能會迅速填滿磁盤。你可以看到,它可能比手動複製你要編輯的文件更糟糕。
解決這種設計中存在的許多問題的替代方法是使用 Git 作為版本控制系統。雖然 Git 主要是為了專注於按行對純文本進行版本控制,通常是源代碼,但你可以使用 Git 來跟踪幾乎任何類型的文件。想了解更多,你可以查閱如何有效使用 Git。
第五部分 — 服務器級別的備份
大多數託管提供商還將提供自己的可選備份功能。DigtalOcean的備份功能定期為已啟用此服務的Droplets執行自動備份。你可以在創建 Droplet 時勾選“備份”复選框來啟用此功能:
這將定期備份您整個雲端伺服器映像。這意味著您可以從備份重新部署,或將其用作新的 droplets 的基礎。
對於系統的一次性成像,您還可以創建快照。這些與備份的工作方式類似,但不是自動的。儘管在某些情況下可能會對運行中的系統進行快照,但根據您如何寫入檔案系統,這並不總是建議的:
您可以從容器和映像文件了解有關 DigitalOcean 備份和快照的更多信息。
GitOps
最後值得注意的是,有些情況下,您不一定會希望按照每個伺服器的方式來實施備份。例如,如果您的部署遵循GitOps的原則,您可能會將許多個別的雲伺服器視為可替換的,而將遠端數據源(如 Git 存儲庫)視為資料的有效真相來源。像這樣的複雜、現代化部署在許多情況下可能更具可擴展性,並且更不容易出現故障。但是,您仍然需要為資料存儲本身或每個這些可替換伺服器可能發送信息到的集中式日誌伺服器實施備份策略。請考慮哪些部署方面可能不需要備份,哪些需要。
結論
在本文中,您探討了各種備份概念和解決方案。接下來,您可能希望查閱啟用冗餘的解決方案。