天天看點

跨平台資料備份工具之restic

作者:超越永無止境技有所長

一 背景

Restic 是一款 GO 語言開發的開源免費且快速、高效和安全的跨平台備份工具。Restic 使用加密技術來保證你的資料安全性和完整性,可以将本地資料加密後傳輸到指定的存儲。

Restic 同樣支援增量備份,可随時備份和恢複備份。Restic 支援大多數主流作業系統,比如:Linux、macOS、Windows 以及一些較小衆的作業系統 FreeBSD 和 OpenBSD 等。

二 restic簡介

2.1 restic 支援類型

  • 本地存儲
  • SFTP
  • REST Server
  • Amazon S3
  • Minio Server
  • OpenStack Swift
  • Backblaze B2
  • Microsoft Azure Blob Storage
  • Google Cloud Storage
  • 通過 Rclone 挂載的存儲 (比如:Google Drive、OneDrive 等)

2.2Restic 與 Rclone差別

2.2.1 相同點

  • 兩者都是基于指令行的開源檔案同步和備份工具。
  • 兩者都支援将檔案備份到本地、遠端伺服器或對象存儲。

2.2.2 異同

  • Rclone 面向的是檔案同步,即保證兩端檔案的一緻,也可以增量備份。
  • Restic 面向的是檔案備份和加密,檔案先加密再傳輸備份,而且是增量備份,即每次隻備份變化的部分。
  • Rclone 倉庫配置儲存在本地,備份的檔案會保持原樣的同步于存儲倉庫中。
  • Restic 配置資訊直接寫在倉庫,隻要有倉庫密碼,在任何安裝了 Restic 的計算機上都可以操作倉庫。
  • Rclone 不記錄檔案版本,無法根據某一次備份找回特定時間點上的檔案。
  • Restic 每次備份都會生成一個快照,記錄目前時間點的檔案結構,可以找回特定時間點的檔案。
  • Rclone 可以在配置的多個存儲端之間傳輸檔案。

總的來說,Rclone 和 Restic 各有所長,要根據不同的業務需求選擇使用。比如:網站資料的增量備份,用 Resitc 就比較合适。而正常檔案的遠端備份歸檔,用 Rclone 就很合适。

2.3 Restic設計原則

Restic 是一個可以正确進行備份的程式,其設計遵循以下原則:

  • 簡單:備份應該是一個順暢的過程,否則您可能會想跳過它。 Restic 應該易于配置和使用,以便在資料丢失的情況下,您可以直接恢複它。同樣,恢複資料不應該很複雜。
  • 快速:用restic備份你的資料應該隻受你的網絡或硬碟帶寬的限制,這樣你就可以每天備份你的檔案。如果需要太多時間,沒有人會進行備份。恢複備份應該隻傳輸要恢複的檔案所需的資料,這樣這個過程也很快。
  • 可驗證:比備份更重要的是恢複,是以restic使您可以輕松驗證所有資料是否可以恢複。
  • 安全:Restic 使用加密技術來保證您資料的機密性和完整性。假設存儲備份資料的位置不是受信任的環境(例如,系統管理者等其他人能夠通路您的備份的共享空間)。 Restic 旨在保護您的資料免受此類攻擊者的侵害。
  • 高效:随着資料的增長,額外的快照應該隻占用實際增量的存儲。更重要的是,在将重複資料實際寫入存儲後端之前,應該對其進行去重,以節省寶貴的備份空間。

2.4 相關術語

  • Repository:備份期間産生的所有資料都以結構化形式發送并存儲在存儲庫中,例如在具有多個子目錄的檔案系統層次結構中。存儲庫實作必須能夠完成許多操作,例如列出内容。v0.12.0中已支援的存儲服務包括:aws s3,minio server,Wasabi, Aliyun OSS, OpenStack Swift,Backlbaze B2,Azure Blob Storage,Google Cloud Storage,rclone*
  • Blob:Blob 将多個資料位元組與識别資訊(如資料的 SHA-256 哈希及其長度),加密的資料塊及中繼資料,其中中繼資料包括長度,SHA-256 哈希資訊。資料塊可以存放檔案資料(data),也可以存放目錄結構資料(tree)。Blob的大小在512KiB到8MiB之間,是以小于512KB的檔案不會被拆分。Restic的實作目标是讓Blob平均大小為1MiB。
  • Pack:一個包結合了一個或多個 Blob,例如在單個檔案中。Restic中的單個資料檔案,包括一個或多個Blob,一旦建立不再修改。
  • 一般隻建立不删除,僅prune操作會删除不再被引用的資料。
  • Snapshot:快照代表在某個時間點已備份的檔案或目錄的狀态。這裡的狀态是指内容和中繼資料,如檔案或目錄及其内容的名稱和修改時間。
  • Storage ID:Pack檔案的SHA256哈希值,通過這個ID可以在倉庫中加載需要的資料檔案。Restic将這個ID作為Pack的檔案名,也就是檔案的SHA256哈希值。Pack檔案名即哈希值的設計也可以友善的檢驗資料檔案是否被改動過。

三 安裝restic

3.1 yum安裝

yum install yum-plugin-copr
yum copr enable copart/restic
yum install restic

           

3.2 docker安裝

docker pull restic/restic
           

更多資訊可參考:https://github.com/Lobaro/restic-backup-docker

3.3 源碼安裝

$ git clone https://github.com/restic/restic

$ cd restic

$ go run build.go
           

3.4 配置自動補全

$ sudo ./restic generate --bash-completion /etc/bash_completion.d/restic
           

四 實戰

将儲存備份的地方稱為“存儲庫”。本章解釋了如何建立(“ init”)這樣的存儲庫。存儲庫可以存儲在本地,也可以存儲在遠端伺服器或伺服器上。

4.1 sftp主機間備份

4.1.1 主機間免密鑰互信

從主機A備份資料到主機B,需要主機A到主機B免密鑰和互信

ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
           

4.1.2 在伺服器A建立備份

初始化備份,/data為 B伺服器目錄。

檢視B伺服器

4.1.3 備份操作

  • 執行資料備份
restic -r [email protected]:/data backup ./
           
  • 檢視備份
restic -r [email protected]:/data snapshots
           
  • 檢視備份内容
restic -r [email protected]:/data ls 875a2a32
           
  • 恢複快照
restic -r [email protected]:/data restore 875a2a32 -t ./
restic -r [email protected]:/data restore 875a2a32 --target ./
           
跨平台資料備份工具之restic
  • 删除備份
restic -r [email protected]:/data forget 875a2a32
           

4.1.4 免密碼

上面備份的時候,都需要輸入密碼,肯定不适合腳本自動備份,是以我們還需要使用--password-file參數來達到自動讀取密碼的步驟。

#先将密碼,比如moerats儲存在/root/resticpasswd文本中
echo 'xxzxxxxxx' > /root/resticpasswd
#然後在備份指令中加--password-file參數來讀取文本中的密碼,這裡以sftp為例
restic -r [email protected]:/data --verbose backup ./ --password-file /root/resticpasswd
           

4.2 對象存儲備份

支援基于s3協定的後端對象存儲,例如minio或者騰訊/阿裡對象存儲

4.2.1 阿裡雲對象存儲

$ export AWS_ACCESS_KEY_ID=<YOUR-OSS-ACCESS-KEY-ID>
$ export AWS_SECRET_ACCESS_KEY=<YOUR-OSS-SECRET-ACCESS-KEY>

$ ./restic -o s3.bucket-lookup=dns -o s3.region=<OSS-REGION> -r s3:https://<OSS-ENDPOINT>/<OSS-BUCKET-NAME> init
$ restic -o s3.bucket-lookup=dns -o s3.region=oss-eu-west-1 -r s3:https://oss-eu-west-1.aliyuncs.com/bucketname init

restic -o s3.bucket-lookup=dns -o oss-cn-beijing.aliyuncs.com -r s3:https:/oss.oss-cn-beijing.aliyuncs.com init

           
  • 建立repository
export AWS_ACCESS_KEY_ID=LTAIxxxxxxxxxxxxxx9
export AWS_SECRET_ACCESS_KEY=XvHxxxxxxxxxxxxxxxJt3wb7
restic -o s3.bucket-lookup=dns -o s3.region=oss-cn-beijing.aliyuncs.com -r s3:https://xueltestoss.oss-cn-beijing.aliyuncs.com/oss init
           

對象存儲上檔案

跨平台資料備份工具之restic
  • 免密鑰
#先将密碼,比如moerats儲存在/root/resticpasswd文本中
echo 'xxzxxxxx' > /root/resticpasswd
#然後在備份指令中加--password-file參數來讀取文本中的密碼,這裡以sftp為例
           
  • 執行備份
restic -r s3:https://oss-cn-beijing.aliyuncs.com/oss --password-file /root/resticpasswd backup /data/
           
跨平台資料備份工具之restic

其他恢複操作基本上和sftp的一緻。

其他

restic 是一個很不錯的資料備份方案,rclone是一個不錯的資料同步方案,以及minio作為資料存儲,內建在一起真的很不錯。

繼續閱讀