Kurangi cadangan sebesar 99,5% dengan hashget

hashget adalah deduplicator berbasis opera gratis - sebuah utilitas yang mirip dengan pengarsip, yang secara signifikan dapat mengurangi ukuran cadangan, serta mengatur skema cadangan inkremental dan diferensial dan banyak lagi.


Ini adalah artikel ulasan untuk menjelaskan fitur-fiturnya. Penggunaan hashget sendiri (cukup sederhana) dijelaskan dalam README dan dokumentasi wiki proyek.


Perbandingan


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


Sampel dataukuran membongkar.tar.gzhashget .tar.gz
Wordpress-5.1.143 Mb11 Mb (26%)155 Kb ( 0,3% )
Kernel Linux 5.0.4934 Mb161 Mb (20%)4,7 Mb ( 0,5% )
Debian 9 (LAMP) LXC VM724 Mb165 Mb (23%)4,1 Mb ( 0,5% )

Latar belakang tentang cadangan yang ideal dan efektif


Setiap kali saya membuat cadangan dari mesin virtual yang baru dibuat, saya dihantui perasaan bahwa saya melakukan sesuatu yang salah. Mengapa saya mendapatkan cadangan berbobot dari sistem di mana kreativitas saya yang tak ternilai harganya adalah indeks single-line.html dengan teks "Halo dunia"?


Mengapa ada 16 megabyte / usr / sbin / mysqld di cadangan saya? Benarkah di dunia ini saya mendapat kehormatan untuk menyimpan file penting ini, dan jika saya tidak bisa melakukannya, file itu akan hilang untuk kemanusiaan? Kemungkinan besar tidak. Ia disimpan di server debian yang sangat andal (keandalan dan kontinuitasnya tidak dapat dibandingkan dengan apa yang dapat saya berikan), serta dalam salinan cadangan (jutaan dari mereka) dari admin lain. Apakah kita benar-benar perlu membuat 10.000.000 salinan pertama dari file penting ini untuk meningkatkan keandalan?


Secara umum, hashget memecahkan masalah ini. Saat berkemas - itu menciptakan cadangan yang sangat kecil. Saat membongkar - sistem yang benar-benar dibongkar, mirip dengan yang akan dengan tar -c / tar -x . (Dengan kata lain, ini adalah kemasan lossless)


Bagaimana hashget bekerja


Hashget memiliki konsep Paket dan HashPackage, dengan bantuan mereka melakukan deduplikasi.


Paket File (biasanya arsip .deb atau .tar.gz) yang dapat diunduh dengan andal dari jaringan dan dari mana satu atau lebih file dapat diperoleh.


HashPackage adalah file JSON kecil yang mewakili Paket, termasuk URL paket dan jumlah hash (sha256) dari file darinya. Misalnya, untuk paket inti-server-mariadb berukuran 5 megabita, ukuran paket hash hanya 6 kilobyte. Sekitar seribu kali lebih kecil.


Deduplikasi - membuat arsip tanpa file duplikat (jika deduplicator tahu di mana paket asli dapat diunduh, itu mengurangi duplikat dari arsip).


Pengepakan


Saat mengepak, semua file dari direktori yang dikemas dilihat, jumlah hashnya dipertimbangkan, dan jika jumlahnya ditemukan di salah satu HashPackage yang diketahui, metadata file (nama, hash, izin, dll.) Disimpan dalam file khusus .hashget-restore.json, yang juga akan dimasukkan dalam arsip.


Kemasan itu sendiri dalam kasus paling sederhana terlihat tidak lebih rumit daripada tar:


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

Membongkar


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


 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, membuka paketnya, dan mengekstrak file yang diperlukan, mengaturnya di jalur yang benar, dengan pemilik / grup / izin yang diperlukan.


Hal-hal yang lebih rumit


Apa yang dijelaskan di atas sudah cukup bagi mereka yang "ingin seperti tar, tetapi untuk mengemas Debian saya menjadi 4 megabita." Selanjutnya kita akan melihat hal-hal yang lebih sulit.


Pengindeksan


Jika hash tidak memiliki HashPackage sama sekali, maka itu tidak dapat menduplikasi apa pun.


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


Untuk mendapatkan paket hash yang Anda butuhkan, ada langkah pengindeksan (secara otomatis dilakukan ketika perintah --pack ) dan heuristik . Saat pengindeksan, hashget "mengumpankan" setiap file yang ditemukan ke semua heuristik yang ada yang diminati. Heuristik kemudian dapat mengindeks Paket apa pun untuk membuat HashPackage.


Misalnya, heuristik Debian menyukai file / var / lib / dpkg / status dan mendeteksi paket debian yang terinstal, dan jika mereka tidak diindeks (HashPackage belum dibuat untuk mereka), unduh dan mengindeksnya. Hasilnya adalah efek yang sangat menyenangkan - hashget akan selalu efektif menduplikat Debian OS, bahkan jika mereka memiliki paket terbaru.


File Petunjuk


Jika jaringan Anda menggunakan beberapa jenis paket eksklusif atau paket publik yang tidak termasuk dalam heuristik hashget, Anda dapat menambahkan file petunjuk hashget-hint.json sederhana ke dalamnya sebagai berikut:


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

Selanjutnya, setiap kali arsip dibuat, paket akan diindeks (jika tidak sebelumnya), dan file paket akan dideduplikasi dari arsip. Tidak diperlukan pemrograman, semuanya dapat dilakukan dari vim dan disimpan di setiap cadangan. Perhatikan bahwa berkat pendekatan melalui 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 berkurang.


Jika beberapa paket Anda diperbarui secara berkala, tetapi perubahannya tidak terlalu besar, Anda hanya bisa memberi petunjuk untuk versi utama. Sebagai contoh, dalam versi 1.0 mereka membuat sebuah petunjuk yang menunjukkan mypackage-1.0.tar.gz, dan itu akan sepenuhnya didupuplikasi, kemudian mereka merilis versi 1.1, yang sedikit berbeda, tetapi mereka tidak memperbarui petunjuk tersebut. Tidak ada yang perlu dikhawatirkan. Hanya file yang cocok (yang dapat dipulihkan) dengan versi 1.0 yang diduplikasi.


Heuristik yang memproses file petunjuk adalah contoh yang baik untuk memahami mekanisme internal heuristik. Ini hanya memproses file hashget-hint.json (atau .hashget-hint.json dengan sebuah titik) dan mengabaikan semua orang. Menggunakan file ini, ini menentukan URL paket mana yang harus diindeks, dan hashget mengindeksnya (jika ini belum pernah dilakukan sebelumnya)


Hashver


Akan sangat memakan waktu untuk melakukan pengindeksan sepenuhnya saat membuat cadangan. Untuk melakukan ini, Anda perlu mengunduh setiap paket, unzip, indeks. Karenanya, hashget menggunakan skema dengan HashServer . Jika paket debian diinstal, jika tidak ditemukan di HashPackage lokal, upaya pertama kali dilakukan untuk mengunduh HashPackage dari server hash. Dan hanya jika ini tidak berhasil - hashget sendiri mengunduh dan mem-hash paket (dan mengunggah ke hashserver, sehingga hashserver menyediakannya nanti).


HashServer - elemen opsional skema, tidak kritis, digunakan secara eksklusif untuk mempercepat dan mengurangi beban pada repositori. Mudah terputus (dengan opsi --hashserver tanpa parameter). Selain itu, Anda dapat dengan mudah membuat hashserver Anda sendiri .


Cadangan inkremental dan diferensial, keusangan terencana


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


Tapi ini bukan pendekatan yang sangat baik, karena mungkin ternyata selama pemulihan kita harus menarik semua hashget cadangan untuk seluruh riwayat (jika masing-masing memiliki setidaknya satu file unik). Ada mekanisme untuk cadangan usang yang dijadwalkan untuk ini. Saat mengindeks, Anda dapat menentukan tanggal kedaluwarsa HashPackage - --expires 2019-06-01 , dan pada tanggal ini (mulai 00:00), ini tidak akan digunakan. Arsip itu sendiri tidak dapat dihapus setelah tanggal ini (walaupun hashget dapat dengan mudah menampilkan URL dari semua cadangan yang kita busuk / busuk saat ini atau pada tanggal berapa pun).


Misalnya, jika Anda membuat cadangan lengkap pada hari pertama dan mengindeksnya seumur hidup sebelum akhir bulan, kami akan mendapatkan skema cadangan diferensial.


Jika kami juga mengindeks cadangan baru, akan ada skema cadangan tambahan.


Tidak seperti skema tradisional, hashget memungkinkan Anda untuk menggunakan beberapa sumber dasar. Cadangan akan berkurang karena pengurangan file dari cadangan sebelumnya (jika ada), dan karena file publik (apa yang dapat diunduh).


Jika karena alasan tertentu kami tidak mempercayai keandalan sumber daya Debian ( https://snapshot.debian.org/ ) atau menggunakan distribusi lain, kami hanya dapat membuat cadangan lengkap dengan semua paket satu kali, dan kemudian bergantung padanya ( menonaktifkan heuristik) ) Sekarang, jika semua server distribusi kami ternyata tidak dapat diakses oleh kami (di internet cinderamata atau selama kiamat zombie), tetapi cadangan kami sesuai - kami dapat memulihkan dari setiap cadangan pendek yang bergantung hanya pada cadangan kami sebelumnya.


Hashget hanya bergantung pada sumber pemulihan yang andal atas kebijakan Anda. Yang Anda anggap andal - yang akan digunakan.

FilePool dan Glacier


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


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

atau


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

Untuk membuat kumpulan di direktori lokal - cukup buat direktori dan unggah file ke dalamnya, hashget sendiri akan menemukan apa yang dibutuhkan oleh hash. Untuk membuat pool 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 pada server hampir nol.


Berkat FilePool, tidak hanya sumber daya http (s) dapat digunakan sebagai sumber daya dasar, tetapi juga, misalnya , Amazon Glacier.


Setelah cadangan diunggah ke gletser, kami mendapatkan ID Unggahnya dan menggunakannya sebagai URL. Sebagai contoh:


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

Sekarang cadangan (diferensial) baru akan bergantung pada cadangan ini dan akan lebih pendek. Setelah tar membuka bungkusnya, kita dapat melihat sumber daya apa yang diandalkannya:


 hashget --info /tmp/unpacked/ list 

dan cukup gunakan skrip shell untuk mengunduh semua file ini dari gletser ke dalam pool dan jalankan pemulihan yang biasa: hashget -u / tmp / unpacked --pool / tmp / pool


Apakah game sepadan dengan lilin


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, jauh lebih sedikit.


Tapi ini bukan satu-satunya. Kuantitas masuk ke kualitas. Anda dapat menggunakan ini untuk mendapatkan peningkatan skema pencadangan berkualitas tinggi. Misalnya, karena cadangan kami sekarang lebih pendek - Anda tidak dapat membuat cadangan bulanan, tetapi cadangan harian. Simpan mereka bukan enam bulan, seperti sebelumnya, tetapi 5 tahun. Sebelumnya, mereka disimpan dalam penyimpanan "dingin" yang lambat tapi murah (Gletser), sekarang Anda dapat menyimpannya di tempat yang panas, tempat Anda selalu dapat dengan cepat mengunduh cadangan dan memulihkan dalam hitungan menit, bukan dalam sehari.


Anda dapat meningkatkan keandalan penyimpanan cadangan. Jika sekarang kita menyimpannya di satu toko, maka dengan mengurangi volume cadangan - kita dapat menyimpan di 2-3 toko dan selamat dengan selamat jika salah satunya rusak.


Bagaimana cara mencoba dan mulai menggunakan?


Kami pergi ke halaman gitlab https://gitlab.com/yaroslaff/hashget , instal dengan satu perintah ( pip3 install hashget[plugins] ) dan baru saja membaca dan menjalankan quick-start. Saya pikir semua hal sederhana untuk dilakukan - itu akan memakan waktu 10-15 menit. Kemudian Anda dapat mencoba untuk mengguncang mesin virtual Anda, membuat file petunjuk jika perlu, untuk menekan lebih keras, bermain dengan kolam, database hash lokal dan server hash, jika itu menarik, dan hari berikutnya lihat berapa ukuran cadangan inkremental kemarin.


Restic + HashGet


(Bab ini ditambahkan kemudian. Terima kasih kepada para komentator atas kritik dan motivasi mereka.)


Ada alat nyaman yang bagus untuk backup - restic . Ia juga dapat melakukan deduplikasi, tetapi hanya di dalam repositori, tidak dapat deduplikasi eksternal, yang tidak mudah dilakukan. Tetapi dalam kombinasi hashget restic , kami berhasil menggunakan keunggulan dari kedua pendekatan!


Persiapan (membongkar wordpress dan mengindeksnya):


 # wget -q https://wordpress.org/wordpress-5.2.2.tar.gz # hashget --submit https://wordpress.org/wordpress-5.2.2.tar.gz -p my --file wordpress-5.2.2.tar.gz --hashserver # tar -xf wordpress-5.2.2.tar.gz # du -sh wordpress 46M wordpress 

Menambahkan snapshot ke restic via


 # hashget -X exclude-list --prepack wordpress --hashserver Saved: 1468 files, 1 pkgs, size: 40.5M. Download: 10.7M # restic --exclude-file exclude-list backup wordpress password is correct scan [/tmp/wp/wordpress] scanned 193 directories, 367 files in 0:02 [0:04] 100.00% 700.829 KiB / 700.829 KiB 560 / 560 items 0 errors ETA 0:00 duration: 0:04 snapshot 76b54230 saved # du -sh /tmp/restic-repo/ 2,1M /tmp/restic-repo/ 

Pada tahap ini, kami menambahkan snapshot katalog (40+ Mb), dan ukuran repositori bertambah hanya 1 Mb.


Pemulihan dilakukan dengan dua perintah:


 # restic restore 76b54230 -t unpacked password is correct restoring <Snapshot 76b54230 of [/tmp/wp/wordpress] at 2019-06-19 04:30:55.760618336 +0700 +07 by root@braconnier> to unpacked # hashget -u unpacked/wordpress/ --hashserver Recovered 1468/1468 files 40.5M bytes (0 downloaded, 0 from pool, 10.7M cached) in 1.56s 

Source: https://habr.com/ru/post/id454826/


All Articles