Kurangi cadangan sebesar 99.5% dengan hashget

hashget - gratis, sumber terbuka deduplikasi adalah utilitas yang mirip dengan pengarsip yang memungkinkan Anda mengurangi ukuran cadangan secara signifikan, serta mengatur skema cadangan tambahan dan diferensial, dan banyak lagi.

Ini adalah artikel ikhtisar untuk menjelaskan fitur-fiturnya. Penggunaan sebenarnya dari hashget (cukup sederhana) dijelaskan di README proyek dan dokumentasi wiki.

Сравнение

Menurut hukum genre, saya akan segera memulai dengan intrik - membandingkan hasilnya:

sampel data
ukuran yang belum dibongkar
.tar.gz
hashget.tar.gz

WordPress-5.1.1
43 Mb
11 Mb (26%)
155 Kb ( 0.3% )

Linux kernel 5.0.4
934 Mb
161 Mb (20%)
4.7 Mb ( 0.5% )

Debian 9 (LAMP) LXC VM
724 Mb
165 Mb (23%)
4.1 Mb ( 0.5% )

Latar belakang tentang pencadangan yang ideal dan efektif

Setiap kali saya membuat cadangan mesin virtual yang baru dibuat, saya dihantui oleh perasaan bahwa saya melakukan sesuatu yang salah. Mengapa saya mendapatkan cadangan yang besar dan kuat dari sistem, di mana kreativitas saya yang tak ternilai dan tidak dapat binasa adalah satu baris index.html dengan teks “Halo dunia”?

Mengapa ada 16 MB /usr/sbin/mysqld di cadangan saya? Mungkinkah di dunia ini saya mendapat kehormatan untuk menyimpan file penting ini, dan jika saya gagal, file tersebut akan hilang ke tangan umat manusia? Kemungkinan besar tidak. Itu disimpan di server debian yang sangat andal (keandalan dan waktu aktifnya tidak dapat dibandingkan dengan apa yang dapat saya berikan), serta di cadangan (jutaan) dari admin lain. Apakah kita benar-benar perlu membuat 10+ salinan pertama file penting ini untuk meningkatkan keandalan?

Secara umum hashget dan memecahkan masalah ini. Saat dikemas, itu membuat cadangan yang sangat kecil. Saat membongkar - sistem yang sepenuhnya dibongkar, mirip dengan apa yang akan terjadi jika tar -c / tar -x. (Dengan kata lain, ini adalah kemasan lossless)

Cara kerja hash

hashget memiliki konsep Paket dan HashPackage, dengan bantuannya ia melakukan deduplikasi.

Paket (kantong plastik). File (biasanya arsip .deb atau .tar.gz) yang dapat diunduh dengan aman dari Internet, dan dari sana satu atau lebih file dapat diperoleh.

Paket Hash — file JSON kecil yang mewakili sebuah Paket, termasuk URL paket dan jumlah hash (sha256) file darinya. Misalnya, untuk paket mariadb-server-core 5 megabyte, ukuran paket hash hanya 6 kilobyte. Sekitar seribu kali lebih sedikit.

Deduplikasi — membuat arsip tanpa file duplikat (jika deduplicator mengetahui di mana paket asli dapat diunduh, ini akan mengurangi duplikat dari arsip).

Kemasan

Saat mengemas, semua file dari direktori yang dikemas dipindai, jumlah hashnya dihitung, dan jika jumlahnya ditemukan di salah satu HashPackages yang diketahui, maka metadata tentang file (nama, hash, hak akses, dll.) disimpan dalam file khusus .hashget-restore.json, yang juga akan disertakan dalam arsip.

Dalam kasus paling sederhana, kemasannya sendiri terlihat tidak lebih rumit dari tar:

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

Membongkar

Pembongkaran dilakukan dalam dua tahap. Pertama, pembongkaran tar biasa:

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

lalu pulihkan dari jaringan:

hashget -u /path/to/data

Saat memulihkan, hashget membaca file .hashget-restore.json, mengunduh paket yang diperlukan, membongkarnya, dan mengekstrak file yang diperlukan, menginstalnya di jalur yang diperlukan, dengan pemilik/grup/izin yang diperlukan.

Hal-hal yang lebih sulit

Apa yang dijelaskan di atas sudah cukup bagi mereka yang “menginginkannya seperti tar, tetapi mengemas Debian saya menjadi 4 megabyte.” Mari kita lihat hal-hal yang lebih kompleks nanti.

Pengindeksan

Jika hashget tidak memiliki satu HashPackage sama sekali, maka hashget tidak akan dapat menghapus duplikat apa pun.

Anda juga dapat membuat HashPackage secara manual (cukup: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), tapi ada cara yang lebih nyaman.

Untuk mendapatkan paket hash yang diperlukan, ada tahapannya pengindeksan (secara otomatis dijalankan dengan perintah --pack) Dan heuristik. Saat mengindeks, hashget “mengumpankan” setiap file yang ditemukan ke semua heuristik yang tersedia yang tertarik padanya. Heuristik kemudian dapat mengindeks Paket apa pun untuk membuat HashPackage.

Misalnya, heuristik Debian menyukai file /var/lib/dpkg/status dan mendeteksi paket debian yang diinstal, dan jika paket tersebut tidak diindeks (tidak ada HashPackage yang dibuat untuk paket tersebut), unduh dan indekskan paket tersebut. Hasilnya adalah efek yang sangat bagus - hashget akan selalu secara efektif menghapus duplikat OS Debian, meskipun mereka memiliki paket terbaru.

File petunjuk

Jika jaringan Anda menggunakan beberapa paket milik Anda atau paket publik yang tidak termasuk dalam heuristik hashget, Anda dapat menambahkan file petunjuk hashget-hint.json sederhana ke dalamnya seperti ini:

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

Selanjutnya, setiap kali arsip dibuat, paket akan diindeks (jika belum pernah diindeks sebelumnya), dan file paket akan dihapus duplikatnya dari arsip. Tidak diperlukan pemrograman, semuanya dapat dilakukan dari vim dan disimpan di setiap cadangan. Harap dicatat bahwa berkat pendekatan jumlah hash, jika beberapa file dari paket diubah secara lokal (misalnya, file konfigurasi diubah), maka file yang diubah akan disimpan dalam arsip “sebagaimana adanya” dan tidak akan terpotong.

Jika beberapa paket Anda diperbarui secara berkala, tetapi perubahannya tidak terlalu besar, Anda hanya dapat memberi petunjuk untuk versi mayor. Misalnya, di versi 1.0 mereka membuat petunjuk yang menunjuk ke mypackage-1.0.tar.gz, dan itu akan dihapus duplikatnya sepenuhnya, kemudian mereka merilis versi 1.1, yang sedikit berbeda, tetapi petunjuk itu tidak diperbarui. Tidak apa-apa. Hanya file yang cocok (dapat dikembalikan ke) versi 1.0 yang dihapus duplikatnya.

Heuristik yang memproses file petunjuk adalah contoh yang baik untuk memahami mekanisme internal cara kerja heuristik. Itu hanya memproses file hashget-hint.json (atau .hashget-hint.json dengan titik) dan mengabaikan yang lainnya. Dari file ini, ia menentukan URL paket mana yang harus diindeks, dan hashget mengindeksnya (jika belum melakukannya)

Server Hash

Melakukan pengindeksan penuh saat membuat cadangan akan memakan banyak tenaga kerja. Untuk melakukan ini, Anda perlu mengunduh setiap paket, membongkarnya, dan mengindeksnya. Oleh karena itu hashget menggunakan skema dengan Server Hash. Ketika paket Debian yang diinstal terdeteksi, jika tidak ditemukan di HashPackage lokal, pertama-tama dilakukan upaya untuk mengunduh HashPackage dari server hash. Dan hanya jika ini tidak berhasil, hashget sendiri mengunduh dan meng-hash paket tersebut (dan mengunggahnya ke server hash, sehingga server hash menyediakannya di masa mendatang).

HashServer adalah elemen opsional dari skema, tidak penting, ini hanya berfungsi untuk mempercepat dan mengurangi beban pada repositori. Mudah dinonaktifkan (opsional --hashserver tanpa parameter). Selain itu, Anda bisa dengan mudah buat server hash Anda sendiri.

Pencadangan tambahan dan diferensial, keusangan terencana

hashget membuatnya sangat mudah untuk membuat diagram cadangan inkremental dan diferensial. Mengapa kita tidak mengindeks cadangan kita sendiri (dengan semua file unik kita)? Satu tim --submit dan kamu sudah selesai! Cadangan berikutnya yang dibuat hashget tidak akan menyertakan file dari arsip ini.

Tapi ini bukan pendekatan yang baik, karena mungkin saat memulihkan kita harus menarik semua cadangan hashget di seluruh riwayat (jika masing-masing berisi setidaknya satu file unik). Ada mekanisme untuk hal ini keusangan cadangan yang direncanakan. Saat mengindeks, Anda dapat menentukan tanggal kedaluwarsa HashPackage --expires 2019-06-01, dan setelah tanggal ini (mulai pukul 00:00), tidak akan digunakan. Arsip itu sendiri tidak dapat dihapus setelah tanggal ini (Meskipun hashget dapat dengan mudah menampilkan URL semua cadangan yang sedang/akan rusak saat ini atau pada tanggal berapa pun).

Misalnya, jika kita membuat full backup pada tanggal 1 dan mengindeksnya dengan seumur hidup hingga akhir bulan, kita akan mendapatkan skema differential backup.

Jika kita mengindeks cadangan baru dengan cara yang sama, akan ada skema cadangan tambahan.

Tidak seperti skema tradisional, hashget memungkinkan Anda menggunakan berbagai sumber yang mendasarinya. Cadangan akan dikurangi baik dengan mengurangi file dari cadangan sebelumnya (jika ada) maupun dengan file publik (yang dapat diunduh).

Jika karena alasan tertentu kami tidak mempercayai keandalan sumber daya Debian (https://snapshot.debian.org/) atau menggunakan distribusi lain, kita cukup membuat cadangan penuh satu kali dengan semua paket, lalu mengandalkannya (dengan menonaktifkan heuristik). Sekarang, jika semua server distribusi kami tidak tersedia bagi kami (di Internet suvenir atau selama kiamat zombie), tetapi cadangan kami baik-baik saja, kami dapat memulihkan dari cadangan short diff yang hanya mengandalkan cadangan kami sebelumnya. .

Hashget hanya mengandalkan sumber pemulihan tepercaya sesuai kebijaksanaan ANDA. Yang Anda anggap dapat diandalkan akan digunakan.

FilePool dan Gletser

Mekanisme Kumpulan File memungkinkan Anda untuk tidak terus-menerus menghubungi server eksternal untuk mengunduh paket, tetapi menggunakan paket dari direktori lokal atau server perusahaan, misalnya:

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

или

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

Untuk membuat kumpulan di direktori lokal, Anda hanya perlu membuat direktori dan memasukkan file ke dalamnya, hashget sendiri akan menemukan apa yang dibutuhkannya menggunakan hash. Untuk membuat kumpulan dapat diakses melalui HTTP, Anda perlu membuat symlink dengan cara khusus; ini dilakukan dengan satu perintah (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). HTTP FilePool sendiri adalah file statis, sehingga server web sederhana mana pun dapat menyajikannya, beban di server hampir nol.

Berkat FilePool, Anda tidak hanya dapat menggunakan sumber daya http(s) sebagai sumber daya dasar, tetapi juga misalnya, Gletser Amazon.

Setelah mengunggah cadangan ke gletser, kami mendapatkan ID Unggahannya dan menggunakannya sebagai URL. Misalnya:

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

Sekarang pencadangan (diferensial) baru akan didasarkan pada pencadangan ini dan akan lebih singkat. Setelah tar membongkar diffbackup, kita dapat melihat sumber daya apa yang diandalkannya:

hashget --info /tmp/unpacked/ list

dan cukup gunakan skrip shell untuk mengunduh semua file ini dari Glacier ke pool dan jalankan pemulihan seperti biasa: hashget -u /tmp/unpacked —pool /tmp/pool

Apakah game ini layak untuk diperjuangkan?

Dalam kasus paling sederhana, Anda hanya akan membayar lebih sedikit untuk cadangan (jika Anda menyimpannya di suatu tempat di cloud untuk mendapatkan uang). Mungkin jauh lebih sedikit.

Tapi itu bukan satu-satunya. Kuantitas berubah menjadi kualitas. Anda dapat menggunakan ini untuk mendapatkan peningkatan kualitas tinggi pada skema cadangan Anda. Misalnya, karena pencadangan kami sekarang lebih singkat, kami tidak dapat membuat pencadangan bulanan, tetapi pencadangan harian. Simpan bukan selama enam bulan, seperti sebelumnya, tetapi selama 5 tahun. Sebelumnya, Anda menyimpannya di penyimpanan “dingin” (Glacier) yang lambat tapi murah, sekarang Anda dapat menyimpannya di penyimpanan panas, di mana Anda selalu dapat dengan cepat mengunduh cadangan dan memulihkannya dalam hitungan menit, bukan dalam sehari.

Anda dapat meningkatkan keandalan penyimpanan cadangan. Jika saat ini kami menyimpannya di satu fasilitas penyimpanan, maka dengan mengurangi volume cadangan, kami akan dapat menyimpannya di 2-3 fasilitas penyimpanan dan bertahan tanpa rasa sakit jika salah satu darinya rusak.

Bagaimana cara mencoba dan mulai menggunakan?

Buka halaman gitlab https://gitlab.com/yaroslaff/hashget, instal dengan satu perintah (pip3 install hashget[plugins]) dan cukup baca dan jalankan quick-start. Saya rasa perlu waktu 10-15 menit untuk melakukan semua hal sederhana. Kemudian Anda dapat mencoba mengompres mesin virtual Anda, membuat file petunjuk jika perlu untuk membuat kompresi lebih kuat, bermain-main dengan kumpulan, database hash lokal, dan server hash jika Anda tertarik, dan keesokan harinya lihat berapa ukuran cadangan tambahan akan berada di atas kemarin.

Sumber: www.habr.com

Tambah komentar