Hashget ile yedeklemeleri %99.5 azaltın

hashget - ücretsiz, açık kaynaktır tekilleştirici yedeklemelerin boyutunu önemli ölçüde azaltmanıza, artımlı ve farklı yedekleme şemalarını ve daha fazlasını düzenlemenize olanak tanıyan, arşivleyiciye benzer bir yardımcı programdır.

Bu, özellikleri açıklayan bir genel bakış makalesidir. Hashget'in gerçek kullanımı (oldukça basit) şurada açıklanmıştır: README proje ve wiki belgeleri.

Karşılaştırma

Türün kanununa göre, sonuçları karşılaştırarak hemen entrikayla başlayacağım:

Veri örneği
ambalajsız boyut
.tar.gz
hashget.tar.gz

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

Linux çekirdeği 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 )

İdeal ve etkili bir yedeklemenin ne olması gerektiğine dair arka plan

Yeni oluşturulmuş bir sanal makinenin yedeğini her aldığımda, yanlış bir şey yaptığım hissine kapılıyordum. Paha biçilmez, ölümsüz yaratıcılığımın "Merhaba dünya" metnini içeren tek satırlık bir index.html olduğu sistemden neden büyük bir yedek alıyorum?

Yedeklememde neden 16 MB /usr/sbin/mysqld var? Bu dünyada bu önemli dosyayı saklama onuruna sahip olmam ve eğer başarısız olursam insanlığın kaybolması gerçekten mümkün mü? Büyük olasılıkla hayır. Oldukça güvenilir debian sunucularında (güvenilirliği ve çalışma süresi benim sağlayabileceğimle karşılaştırılamayacak kadar) ve ayrıca diğer yöneticilerin yedeklerinde (milyonlarca) depolanır. Güvenilirliği artırmak için gerçekten bu önemli dosyanın 10'dan fazla 000. kopyasını oluşturmamız gerekiyor mu?

Genel olarak hashget ve bu sorunu çözüyor. Paketlendiğinde çok küçük bir yedek oluşturur. Paketi açarken - tamamen paketinden çıkarılmış bir sistem, şuna benzer: tar -c / tar -x. (Yani kayıpsız ambalajdır)

Hashget nasıl çalışır?

Hashget, Paket ve HashPackage kavramlarına sahiptir ve bunların yardımıyla tekilleştirme gerçekleştirir.

paket (naylon poşet). İnternetten güvenli bir şekilde indirilebilen ve içinden bir veya daha fazla dosyanın alınabildiği bir dosya (genellikle .deb veya .tar.gz arşivi).

Hash Paketi — Paket URL'sini ve içindeki dosyaların karma toplamlarını (sha256) içeren, bir Paketi temsil eden küçük bir JSON dosyası. Örneğin, 5 megabaytlık bir mariadb-server-core paketi için hashpackage boyutu yalnızca 6 kilobayttır. Yaklaşık bin kat daha az.

Tekilleştirme — yinelenen dosyalar olmadan bir arşiv oluşturmak (tekilleştirici orijinal paketin nereden indirilebileceğini biliyorsa, arşivdeki kopyaları azaltır).

Ambalajlama

Paketleme sırasında, paketlenmekte olan dizindeki tüm dosyalar taranır, karma toplamları hesaplanır ve toplam, bilinen HashPackages'lerden birinde bulunursa, dosyayla ilgili meta veriler (ad, karma, erişim hakları vb.) kaydedilir. arşive de eklenecek olan .hashget-restore.json özel dosyasında.

En basit durumda, ambalajın kendisi katrandan daha karmaşık görünmüyor:

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

Ambalajın açılması

Paket açma iki aşamada gerçekleştirilir. Öncelikle her zamanki katran paketini açma işlemi:

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

ardından ağdan geri yükleyin:

hashget -u /path/to/data

Geri yükleme sırasında, hashget .hashget-restore.json dosyasını okur, gerekli paketleri indirir, paketlerinden çıkarır ve gerekli dosyaları, gerekli sahip/grup/izinlerle gerekli yollara yükleyerek çıkarır.

Daha zor şeyler

Yukarıda anlatılanlar zaten “katran gibi ama Debian'ımı 4 megabayta sığdırmak isteyenler için” yeterli. Daha karmaşık şeylere daha sonra bakalım.

Endeksleme

Hashget'in tek bir HashPackage'i olmasaydı, hiçbir şeyin tekilleştirilmesi mümkün olmazdı.

Ayrıca manuel olarak bir HashPackage oluşturabilirsiniz (basitçe: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), ancak daha uygun bir yol var.

Gerekli hashpackage'i elde etmek için bir aşama var indeksleme (komutla otomatik olarak yürütülür --pack) Ve Sezgisel. İndeksleme sırasında hashget, bulunan her dosyayı, onunla ilgilenen mevcut tüm buluşsal yöntemlere "besler". Buluşsal yöntem daha sonra bir HashPackage oluşturmak için herhangi bir Paketi indeksleyebilir.

Örneğin, Debian buluşsal yöntemi /var/lib/dpkg/status dosyasını sever ve kurulu debian paketlerini algılar ve eğer indekslenmemişlerse (onlar için oluşturulmuş bir HashPackage yoksa), bunları indirir ve indeksler. Sonuç çok hoş bir etkidir; hashget, en son paketlere sahip olsalar bile Debian işletim sistemlerini her zaman etkili bir şekilde tekilleştirir.

İpucu dosyaları

Ağınız özel paketlerinizden bazılarını veya hashget buluşsal yöntemine dahil olmayan genel bir paketi kullanıyorsa, buna basit bir hashget-hint.json ipucu dosyasını şu şekilde ekleyebilirsiniz:

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

Daha sonra, her arşiv oluşturulduğunda paket indekslenecek (eğer daha önce indekslenmemişse) ve paket dosyaları arşivden tekilleştirilecek. Hiçbir programlamaya gerek yoktur, her şey vim'den yapılabilir ve her yedeklemeye kaydedilebilir. Hash sum yaklaşımı sayesinde, paketteki bazı dosyalar yerel olarak değiştirilirse (örneğin, bir yapılandırma dosyası değiştirilirse), değiştirilen dosyaların arşive "olduğu gibi" kaydedileceğini ve kesilmeyeceğini lütfen unutmayın.

Kendi paketlerinizden bazıları periyodik olarak güncelleniyorsa ancak değişiklikler çok büyük değilse, yalnızca ana sürümler için ipucu verebilirsiniz. Örneğin 1.0 sürümünde mypackage-1.0.tar.gz'ye işaret eden bir ipucu yaptılar ve tamamen tekilleştirilecek, ardından biraz farklı olan 1.1 sürümünü yayınladılar ancak ipucu güncellenmedi. Önemli değil. Yalnızca sürüm 1.0 ile eşleşen (geri yüklenebilen) dosyalar tekilleştirilir.

İpucu dosyasını işleyen buluşsal yöntem, buluşsal yöntemin nasıl çalıştığının iç mekanizmasını anlamak için iyi bir örnektir. Yalnızca hashget-hint.json dosyalarını (veya noktalı .hashget-hint.json) işler ve diğerlerini yok sayar. Bu dosyadan hangi paket URL'sinin indekslenmesi gerektiğini belirler ve hashget onu indeksler (eğer henüz yapmamışsa)

Hash Sunucusu

Yedekleme oluştururken tam indeksleme yapmak oldukça emek yoğun olacaktır. Bunu yapmak için her paketi indirmeniz, paketini açmanız ve dizine eklemeniz gerekir. Bu nedenle hashget aşağıdaki şemayı kullanır: Hash Sunucusu. Kurulu bir Debian paketi tespit edildiğinde, yerel HashPackage'de bulunamazsa, ilk önce HashPackage'i hash sunucusundan indirmeye çalışılır. Ve ancak bu işe yaramazsa, hashget'in kendisi paketi indirir ve hashing yapar (ve onu hashserver'a yükler, böylece hashserver gelecekte bunu sağlar).

HashServer, şemanın isteğe bağlı bir öğesidir, kritik değildir, yalnızca depolardaki yükü hızlandırmaya ve azaltmaya hizmet eder. Kolayca devre dışı bırakılır (isteğe bağlı --hashserver parametreler olmadan). Ayrıca kolayca yapabilirsiniz kendi karma sunucunu yap.

Artımlı ve diferansiyel yedeklemeler, planlı eskitme

hashget Diyagram yapmayı çok kolaylaştırır artımlı ve diferansiyel yedeklemeler. Neden yedeklememizin kendisini (tüm benzersiz dosyalarımızla birlikte) indekslemiyoruz? Bir takım --submit ve işin bitti! Hashget'in oluşturduğu bir sonraki yedekleme bu arşivdeki dosyaları içermeyecektir.

Ancak bu pek iyi bir yaklaşım değil, çünkü geri yükleme sırasında tüm geçmişteki tüm hashget yedeklerini (her biri en az bir benzersiz dosya içeriyorsa) çekmemiz gerekebileceği ortaya çıkabilir. Bunun bir mekanizması var Yedeklerin planlı eskimesi. İndeksleme sırasında HashPackage'in son kullanma tarihini belirtebilirsiniz. --expires 2019-06-01Bu tarihten sonra (00:00'dan itibaren) kullanılmayacaktır. Arşivin kendisi bu tarihten sonra silinemez (Ancak hashget, o anda veya herhangi bir tarihte çürümüş/çürüyecek tüm yedeklerin URL'lerini rahatlıkla gösterebilmektedir).

Örneğin ayın 1'inde tam yedekleme yapıp bunu ay sonuna kadar ömür boyu indekslersek, diferansiyel bir yedekleme şeması elde ederiz.

Yeni yedekleri de aynı şekilde indekslersek, artımlı yedekleme şeması ortaya çıkacaktır.

Geleneksel şemalardan farklı olarak hashget, birden fazla temel kaynağı kullanmanıza olanak tanır. Yedekleme, hem önceki yedeklemelerdeki (varsa) dosyaların azaltılması hem de genel dosyalar (indirilebilenler) azaltılarak azaltılacaktır.

Herhangi bir nedenle Debian kaynaklarının güvenilirliğine güvenmiyorsak (https://snapshot.debian.org/) veya başka bir dağıtım kullanıyorsa, tüm paketlerle birlikte bir kez tam yedekleme yapabiliriz ve ardından ona güvenebiliriz (buluşsal yöntemi devre dışı bırakarak). Şimdi, dağıtımlarımızın tüm sunucuları bizim için kullanılamaz hale gelirse (hatıra internette veya bir zombi kıyameti sırasında), ancak yedeklerimiz düzgünse, yalnızca önceki yedeklemelerimize dayanan herhangi bir kısa fark yedeklemesinden kurtarabiliriz. .

Hashget yalnızca SİZİN takdirinize bağlı olarak güvenilir kurtarma kaynaklarına güvenir. Güvenilir olduğunu düşündükleriniz kullanılacaktır.

Dosya Havuzu ve Buzul

Mekanizma Dosya Havuzu Paketleri indirmek için sürekli olarak harici sunucularla iletişim kurmanıza değil, yerel bir dizindeki veya kurumsal sunucudaki paketleri kullanmanıza olanak tanır, örneğin:

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

veya

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

Yerel bir dizinde havuz oluşturmak için, sadece bir dizin oluşturup içine dosyalar atmanız yeterlidir, hashget'in kendisi, karmaları kullanarak ihtiyacı olanı bulacaktır. Havuzu HTTP üzerinden erişilebilir kılmak için özel bir şekilde sembolik bağlantılar oluşturmanız gerekir; bu tek bir komutla yapılır (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). HTTP FilePool'un kendisi statik dosyalardır, dolayısıyla herhangi bir basit web sunucusu bunu sunabilir, sunucudaki yük neredeyse sıfırdır.

FilePool sayesinde yalnızca http(s) kaynaklarını temel kaynak olarak değil, aynı zamanda örneğin, Amazon Buzulu.

Yedeği buzullara yükledikten sonra Yükleme Kimliğini alıyoruz ve URL olarak kullanıyoruz. Örneğin:

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

Artık yeni (diferansiyel) yedeklemeler bu yedeklemeyi temel alacak ve daha kısa olacaktır. Diffbackup'ın paketini katranla açtıktan sonra, hangi kaynaklara dayandığını görebiliriz:

hashget --info /tmp/unpacked/ list

ve tüm bu dosyaları Glacier'den havuza indirmek için bir kabuk betiği kullanın ve olağan kurtarma işlemini çalıştırın: hashget -u /tmp/unpacked —pool /tmp/pool

Oyun muma değer mi?

En basit durumda, yedeklemeler için daha az ödersiniz (eğer bunları para karşılığında bulutta bir yerde saklarsanız). Belki çok, çok daha az.

Ama tek şey bu değil. Nicelik kaliteye dönüşür. Yedekleme planınıza yüksek kaliteli bir yükseltme almak için bunu kullanabilirsiniz. Örneğin yedeklemelerimiz artık daha kısa olduğu için aylık değil günlük yedekleme yapabiliyoruz. Bunları eskisi gibi altı ay değil, 5 yıl saklayın. Daha önce onu yavaş ama ucuz "soğuk" depoda (Glacier) saklıyordunuz, şimdi onu her zaman hızlı bir şekilde bir yedeği indirebileceğiniz ve bir gün değil, dakikalar içinde geri yükleyebileceğiniz sıcak depoda saklayabilirsiniz.

Yedek depolamanın güvenilirliğini artırabilirsiniz. Şu anda bunları tek bir depolama tesisinde saklarsak, yedeklerin hacmini azaltarak 2-3 depolama tesisinde saklayabileceğiz ve bunlardan birinin zarar görmesi durumunda acısız bir şekilde hayatta kalabileceğiz.

Nasıl denenir ve kullanmaya başlanır?

Gitlab sayfasına gidin https://gitlab.com/yaroslaff/hashget, tek komutla yükleyin (pip3 install hashget[plugins]) ve hızlı başlatmayı okuyup yürütmeniz yeterli. Tüm basit şeyleri yapmanın 10-15 dakika süreceğini düşünüyorum. Daha sonra sanal makinelerinizi sıkıştırmayı deneyebilir, gerekirse sıkıştırmayı daha güçlü hale getirmek için ipucu dosyaları oluşturabilir, havuzlarla, yerel karma veritabanıyla ve ilgileniyorsanız bir karma sunucusuyla oynayabilir ve ertesi gün artımlı yedeklemenin boyutunun ne olduğunu görebilirsiniz. dünün üstünde olacak.

Kaynak: habr.com

Yorum ekle