使用 hashget 將備份減少 99.5%

哈希獲取 - 它是免費的、開源的 重複資料刪除器 是一個類似於存檔器的實用程序,可讓您顯著減小備份的大小,以及組織增量和差異備份方案等。

這是一篇描述功能的概述文章。 hashget的實際使用(非常簡單)在中描述 自述 項目和 維基文檔.

對照

根據類型法則,我將立即開始陰謀——比較結果:

數據樣本
拆封尺寸
名為.tar.gz
hashget.tar.gz

WordPress-5.1.1
43 MB
11 MB (26%)
155 KB( 企業排放佔全球 0.3% )

Linux內核5.0.4
934 MB
161 MB (20%)
4.7 MB( 企業排放佔全球 0.5% )

Debian 9 (LAMP) LXC 虛擬機
724 MB
165 MB (23%)
4.1 MB( 企業排放佔全球 0.5% )

理想且有效的備份應該是什麼樣的背景

每次我對新創建的虛擬機器進行備份時,我都會感到自己做錯了什麼。 為什麼我會從系統中獲得大量備份,而我無價的、不朽的創造力是一行index.html,其中包含文字「Hello world」?

為什麼我的備份中有 16 MB 的 /usr/sbin/mysqld? 難道真的有可能我在這個世界上有幸保存了這份重要的檔案,而如果我失敗了,它就會為人類而失去? 很可能不會。 它儲存在高度可靠的 debian 伺服器上(其可靠性和連續性無法與我提供的相比),以及其他管理員的備份(數百萬個)。 我們真的需要創建這個重要文件的第 10 個以上副本來提高可靠性嗎?

一般來說 哈希獲取 並解決了這個問題。 打包後,它會創建一個非常小的備份。 拆包時 - 一個完全拆包的系統,類似於如果 tar -c / tar -x。 (也就是說,這是無損包裝)

hashget 的工作原理

hashget 具有 Package 和 HashPackage 的概念,在它們的幫助下執行重複資料刪除。

禮包套裝 (塑膠袋). 一種可以從 Internet 安全性下載並從中取得一個或多個檔案的檔案(通常為 .deb 或 .tar.gz 檔案)。

哈希包 — 表示套件的小 JSON 文件,包括套件 URL 和其中文件的雜湊和 (sha256)。 例如,對於 5 MB 的 mariadb-server-core 套件,hashpackage 大小僅為 6 KB。 大約少一千倍。

重複資料刪除 — 建立一個沒有重複檔案的檔案(如果重複資料刪除器知道可以在哪裡下載原始包,它會減少存檔中的重複項)。

包裝

打包時,會掃描正在打包的目錄中的所有文件,計算它們的哈希總和,如果在已知的HashPackages 之一中找到總和,則保存有關該文件的元資料(名稱、哈希、訪問權限等)在一個特殊檔案 .hashget-restore.json 中,該檔案也將包含在檔案中。

在最簡單的情況下,打包本身看起來並不比 tar 複雜:

hashget -zf /tmp/mybackup.tar.gz --pack /path/to/data

開箱

拆包分兩個階段完成。 首先是通常的 tar 解包:

tar -xf mybackup.tar.gz -C /path/to/data

然後從網路恢復:

hashget -u /path/to/data

恢復時,hashget 讀取 .hashget-restore.json 文件,下載必要的包,解壓縮它們,並提取必要的文件,將它們安裝在所需的路徑中,並具有所需的所有者/群組/權限。

比較困難的事情

對於那些「想要像 tar 一樣,但要將我的 Debian 打包成 4 MB」的人來說,上面描述的已經足夠了。 稍後我們再看看更複雜的事情。

索引

如果 hashget 根本沒有單一 HashPackage,那麼它根本無法刪除任何內容。

您也可以手動建立 HashPackage(簡單來說: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my),但是還有一種更方便的方法。

為了獲得必要的hash包,有一個階段 索引 (它是透過命令自動執行的 --pack)和 啟發式。 建立索引時,hashget 將找到的每個檔案「饋送到」對其感興趣的所有可用啟發式方法。 Heuristics 然後可以索引任何 Package 以建立 HashPackage。

例如,Debian 啟發式喜歡檔案 /var/lib/dpkg/status 並偵測已安裝的 debian 軟體包,如果它們沒有索引(沒有為它們建立 HashPackage),則下載它們並索引它們。 結果是一個非常好的效果 - hashget 將始終有效地刪除 Debian 作業系統的重複數據,即使它們具有最新的軟體包。

提示文件

如果您的網路使用一些專有套件或未包含在 hashget 啟發式中的公共包,您可以向其中添加一個簡單的 hashget-hint.json 提示文件,如下所示:

{
    "project": "wordpress.org",
    "url": "https://ru.wordpress.org/wordpress-5.1.1-ru_RU.zip"
}

接下來,每次建立存檔時,都會對該套件建立索引(如果之前沒有索引過),並且將從存檔中刪除套件檔案的重複資料。 無需編程,一切都可以透過 vim 完成並保存在每個備份中。 請注意,由於採用雜湊和方法,如果套件中的某些檔案在本機發生變更(例如,設定檔發生變更),則變更的檔案將「原樣」儲存在檔案中,並且不會被截斷。

如果你自己的一些包定期更新,但變化不是很大,你可以只提示主要版本。 例如,在1.0版本中,他們做了一個指向mypackage-1.0.tar.gz的提示,它將被完全去重,然後他們發布了1.1版本,略有不同,但提示沒有更新。 沒關係。 僅符合(可還原至)版本 1.0 的檔案會進行重複資料刪除。

處理提示文件的啟發式方法是理解啟發式工作原理的內部機制的一個很好的例子。 它只處理 hashget-hint.json 檔案(或帶點的 .hashget-hint.json)並忽略所有其他檔案。 從這個檔案中,它確定應該對哪個套件 URL 建立索引,並且 hashget 對其進行索引(如果尚未這樣做)

哈希伺服器

在建立備份時執行完整索引將是相當耗費人力的。 為此,您需要下載每個包,解壓縮它並為其建立索引。 因此 hashget 使用一種方案 哈希伺服器。 當偵測到已安裝的 Debian 軟體包時,如果在本機 HashPackage 中找不到該軟體包,請先嘗試從雜湊伺服器下載 HashPackage。 只有當這不起作用時,hashget 本身才會下載並哈希該套件(並將其上傳到 hashserver,以便 hashserver 將來提供它)。

HashServer 是該方案的一個可選元素,並不重要,它僅用於加速和減少儲存庫的負載。 輕鬆停用(可選 --hashserver 不帶參數)。 此外,您還可以輕鬆地 製作你自己的哈希伺服器.

增量和差異備份、計畫報廢

哈希獲取 使製作圖表變得非常容易 增量備份和差異備份。 為什麼我們不為備份本身(以及所有獨特的文件)建立索引? 一個團體 --submit 你就完成了! hashget 建立的下一個備份將不包含此檔案中的檔案。

但這不是一種很好的方法,因為在恢復時我們可能必須提取整個歷史記錄中的所有 hashget 備份(如果每個備份至少包含一個唯一檔案)。 有一個機制可以做到這一點 有計劃地廢棄備份。 建立索引時,可以指定HashPackage的過期日期 --expires 2019-06-01,並且在此日期之後(從 00:00 開始),將不再使用。 在此日期之後,無法刪除存檔本身(儘管 hashget 可以方便地顯示當前或任何日期的所有備份的 URL)。

例如,如果我們在 1 日進行完整備份,並將生命週期索引,直到月底,我們將得到差異備份方案。

如果我們用同樣的方式索引新的備份,就會有增量備份的方案。

與傳統方案不同,hashget 允許您使用多個底層來源。 備份將透過減少先前備份的檔案(如果有)和公共檔案(可以下載的檔案)來減少。

如果我們因為某些原因不信任 Debian 資源的可靠性(https://snapshot.debian.org/)或使用其他發行版,我們可以簡單地對所有套件進行一次完整備份,然後依賴它(透過停用啟發式)。 現在,如果我們發行版的所有伺服器都無法使用(在紀念互聯網上或在殭屍大災難期間),但我們的備份正常,我們可以從任何僅依賴我們早期備份的簡短差異備份中恢復。

Hashget 僅依賴您自行決定的可信任復原來源。 您認為可靠的將被使用。

文件池和冰川

機制 文件池 允許您不必不斷地聯繫外部伺服器來下載軟體包,而是使用本地目錄或公司伺服器中的軟體包,例如:

$ hashget -u . --pool /tmp/pool

$ hashget -u . --pool http://myhashdb.example.com/

要在本機目錄中建立池,您只需建立目錄並將檔案放入其中,hashget 本身將使用雜湊值找到它需要的內容。 為了使池可以透過 HTTP 訪問,您需要以一種特殊的方式建立符號連結;這是透過一個命令完成的(hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool)。 HTTP FilePool本身是靜態文件,因此任何簡單的Web伺服器都可以為其提供服務,伺服器的負載幾乎為零。

感謝 FilePool,您不僅可以使用 http(s) 資源作為基礎資源,還可以 例如,亞馬遜冰川。

將備份上傳到冰川後,我們獲取其上傳 ID 並將其用作 URL。 例如:

hashget --submit Glacier_Upload_ID --file /tmp/my-glacier-backup.tar.gz --project glacier --hashserver --expires 2019-09-01

現在,新的(差異)備份將基於此備份,並且會更短。 tar解壓縮diffbackup後,我們可以看到它依賴了哪些資源:

hashget --info /tmp/unpacked/ list

只需使用 shell 腳本將所有這些檔案從 Glacier 下載到池中並執行常規復原: hashget -u /tmp/unpacked —pool /tmp/pool

這款遊戲值得嗎?

在最簡單的情況下,您只需支付更少的備份費用(如果您將它們儲存在雲端中的某個位置以獲取金錢)。 也許很多很多。

但這並不是唯一的事。 數量變成品質。 您可以使用它來獲得備份方案的高品質升級。 例如,由於我們的備份現在更短,我們可以不再每月備份,而是每天進行備份。 儲存期限不再像以前那樣儲存六個月,而是儲存五年。 以前,您將其存儲在緩慢但廉價的“冷”存儲(Glacier)中,現在您可以將其存儲在熱存儲中,從那裡您可以隨時快速下載備份並在幾分鐘內恢復,而不是一天之內。

您可以提高備份儲存的可靠性。 如果我們目前將它們儲存在一個儲存設施中,那麼透過減少備份量,我們將能夠將它們儲存在 2-3 個儲存設施中,並且即使其中一個儲存設施損壞也可以輕鬆生存。

如何嘗試並開始使用?

進入gitlab頁面 https://gitlab.com/yaroslaff/hashget,使用一個指令安裝(pip3 install hashget[plugins])然後只需閱讀並執行快速啟動即可。 我認為做完所有簡單的事情需要10-15分鐘。 然後你可以嘗試壓縮你的虛擬機,如果有必要的話製作提示檔案以使壓縮更強,如果你感興趣的話可以使用池、本地哈希資料庫和哈希伺服器,第二天看看增量備份的大小是多少將在昨天的之上。

來源: www.habr.com

添加評論