Riduci i backup del 99.5% con hashget

hashget - è gratuito, open source deduplicatore è un'utilità simile a un archiviatore che consente di ridurre significativamente la dimensione dei backup, nonché di organizzare schemi di backup incrementali e differenziali e altro ancora.

Questo è un articolo di panoramica per descrivere le funzionalità. L'uso effettivo di hashget (abbastanza semplice) è descritto in README progetto e documentazione wiki.

Confronto

Secondo la legge del genere, inizierò subito con l'intrigo, confrontando i risultati:

Campione di dati
dimensione non imballata
.tar.gz
hashget.tar.gz

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

Kernel 5.0.4 di Linux
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% )

Informazioni su come dovrebbe essere un backup ideale ed efficace

Ogni volta che eseguivo il backup di una macchina virtuale appena creata, ero perseguitato dalla sensazione di fare qualcosa di sbagliato. Perché ricevo un backup pesante dal sistema, dove la mia creatività inestimabile e imperitura è un file index.html di una riga con il testo "Hello world"?

Perché nel mio backup sono presenti 16 MB di /usr/sbin/mysqld? È davvero possibile che in questo mondo io abbia l'onore di conservare questo importante dossier e, se fallisco, andrà perso per l'umanità? Molto probabilmente no. È archiviato su server Debian altamente affidabili (la cui affidabilità e continuità non possono essere paragonate a ciò che posso fornire), nonché nei backup (milioni di essi) di altri amministratori. Abbiamo davvero bisogno di creare oltre 10 di prima copia di questo importante file per migliorare l'affidabilità?

In genere hashget e risolve questo problema. Una volta imballato, crea un backup molto piccolo. Durante il disimballaggio: un sistema completamente disimballato, simile a quello che sarebbe se tar -c / tar -x. (In altre parole, questo è un imballaggio senza perdite)

Come funziona l'hashget

hashget ha i concetti di Package e HashPackage, con il loro aiuto esegue la deduplicazione.

CONFEZIONE (sacchetto di plastica). Un file (solitamente un archivio .deb o .tar.gz) che può essere scaricato in modo sicuro da Internet e da cui è possibile ottenere uno o più file.

HashPackage — un piccolo file JSON che rappresenta un pacchetto, incluso l'URL del pacchetto e le somme hash (sha256) dei file da esso. Ad esempio, per un pacchetto mariadb-server-core da 5 megabyte, la dimensione del pacchetto hash è di soli 6 kilobyte. Circa mille volte meno.

Deduplicazione — creazione di un archivio senza file duplicati (se il deduplicatore sa dove può essere scaricato il pacchetto originale, riduce i duplicati dall'archivio).

Confezione

Durante l'imballaggio, tutti i file della directory da comprimere vengono scansionati, vengono calcolate le relative somme hash e, se la somma viene trovata in uno degli HashPackage conosciuti, vengono salvati i metadati del file (nome, hash, diritti di accesso, ecc.). in un file speciale .hashget-restore.json, che sarà anch'esso incluso nell'archivio.

Nel caso più semplice, la confezione in sé non sembra più complicata del catrame:

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

Apertura della confezione

Il disimballaggio avviene in due fasi. Prima il solito disimballaggio del tar:

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

quindi ripristinare dalla rete:

hashget -u /path/to/data

Durante il ripristino, hashget legge il file .hashget-restore.json, scarica i pacchetti necessari, li decomprime ed estrae i file necessari, installandoli nei percorsi richiesti, con il proprietario/gruppo/autorizzazioni richiesti.

Cose più difficili

Quanto sopra descritto è già sufficiente per chi “lo vuole come tar, ma per comprimere la mia Debian in 4 megabyte”. Consideriamo più avanti cose più complesse.

indicizzazione

Se hashget non avesse alcun HashPackage, semplicemente non sarebbe in grado di deduplicare nulla.

Puoi anche creare un HashPackage manualmente (semplicemente: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), ma esiste un modo più conveniente.

Per ottenere il pacchetto hash necessario, c'è una fase indicizzazione (viene eseguito automaticamente con il comando --pack) E euristico. Durante l'indicizzazione, hashget "alimenta" ogni file trovato a tutte le euristiche disponibili che sono interessate ad esso. L'euristica può quindi indicizzare qualsiasi pacchetto per creare un HashPackage.

Ad esempio, l'euristica Debian ama il file /var/lib/dpkg/status e rileva i pacchetti Debian installati e, se non sono indicizzati (non è stato creato alcun HashPackage per loro), li scarica e li indicizza. Il risultato è un effetto molto gradevole: hashget deduplicherà sempre in modo efficace i sistemi operativi Debian, anche se dispongono dei pacchetti più recenti.

File di suggerimenti

Se la tua rete utilizza alcuni dei tuoi pacchetti proprietari o un pacchetto pubblico che non è incluso nell'euristica hashget, puoi aggiungere un semplice file suggerimento hashget-hint.json in questo modo:

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

Inoltre, ogni volta che viene creato un archivio, il pacchetto verrà indicizzato (se non lo è stato in precedenza) e i file del pacchetto verranno deduplicati dall'archivio. Non è necessaria alcuna programmazione, tutto può essere fatto da vim e salvato in ogni backup. Tieni presente che grazie all'approccio della somma hash, se alcuni file del pacchetto vengono modificati localmente (ad esempio, un file di configurazione viene modificato), i file modificati verranno salvati nell'archivio "così come sono" e non verranno troncati.

Se alcuni dei tuoi pacchetti vengono aggiornati periodicamente, ma i cambiamenti non sono molto grandi, puoi suggerire solo le versioni principali. Ad esempio, nella versione 1.0 hanno creato un suggerimento che punta a miopacchetto-1.0.tar.gz e verrà completamente deduplicato, quindi hanno rilasciato la versione 1.1, che è leggermente diversa, ma il suggerimento non è stato aggiornato. Va bene. Vengono deduplicati solo i file che corrispondono alla versione 1.0 (che possono essere ripristinati).

L'euristica che elabora il file dei suggerimenti è un buon esempio per comprendere il meccanismo interno di funzionamento dell'euristica. Elabora solo i file hashget-hint.json (o .hashget-hint.json con un punto) e ignora tutti gli altri. Da questo file determina quale URL del pacchetto deve essere indicizzato e hashget lo indicizza (se non lo ha già fatto)

HashServer

Sarebbe piuttosto dispendioso in termini di manodopera eseguire l'indicizzazione completa durante la creazione dei backup. Per fare ciò, devi scaricare ciascun pacchetto, decomprimerlo e indicizzarlo. Pertanto hashget utilizza uno schema con HashServer. Quando viene rilevato un pacchetto Debian installato, se non viene trovato nell'HashPackage locale, viene innanzitutto effettuato un tentativo di scaricare semplicemente l'HashPackage dal server hash. E solo se questo non funziona, hashget stesso scarica ed esegue l'hashing del pacchetto (e lo carica su hashserver, in modo che hashserver lo fornisca in futuro).

HashServer è un elemento opzionale dello schema, non critico, serve esclusivamente a velocizzare e ridurre il carico sui repository. Facilmente disabilitabile (facoltativo --hashserver senza parametri). Inoltre, puoi facilmente crea il tuo hashserver.

Backup incrementali e differenziali, obsolescenza programmata

hashget rende molto semplice la creazione di un diagramma backup incrementali e differenziali. Perché non indicizziamo il nostro backup stesso (con tutti i nostri file univoci)? Una squadra --submit e hai finito! Il prossimo backup creato da hashget non includerà i file di questo archivio.

Ma questo non è un approccio molto valido, perché potrebbe succedere che durante il ripristino dovremo estrarre tutti i backup degli hashget nell'intera cronologia (se ciascuno contiene almeno un file univoco). C'è un meccanismo per questo obsolescenza pianificata dei backup. Durante l'indicizzazione, è possibile specificare la data di scadenza di HashPackage --expires 2019-06-01, e dopo tale data (dalle 00:00), non verrà utilizzato. L'archivio stesso non può essere eliminato dopo questa data (anche se hashget può mostrare comodamente gli URL di tutti i backup che sono/saranno danneggiati in questo momento o in qualsiasi data).

Ad esempio, se eseguiamo un backup completo il 1° giorno e lo indicizziamo con una durata fino alla fine del mese, otterremo uno schema di backup differenziale.

Se indicizziamo i nuovi backup allo stesso modo, ci sarà uno schema di backup incrementali.

A differenza degli schemi tradizionali, hashget ti consente di utilizzare più fonti sottostanti. Il backup verrà ridotto sia riducendo i file dei backup precedenti (se presenti) sia i file pubblici (quelli che possono essere scaricati).

Se per qualche motivo non ci fidiamo dell'affidabilità delle risorse Debian (https://snapshot.debian.org/) o utilizza un'altra distribuzione, possiamo semplicemente fare un backup completo una volta con tutti i pacchetti, e poi affidarci ad esso (disabilitando le euristiche). Ora, se tutti i server delle nostre distribuzioni risultano non disponibili per noi (su Internet souvenir o durante un'apocalisse zombi), ma i nostri backup sono in ordine, possiamo ripristinare da qualsiasi backup diff breve che si basa solo sui nostri backup precedenti .

Hashget si affida solo a fonti di recupero attendibili a TUA discrezione. Verranno utilizzati quelli che ritieni affidabili.

FilePool e ghiacciaio

Механизм Pool di file permette di non contattare costantemente server esterni per scaricare pacchetti, ma utilizzare pacchetti da una directory locale o da un server aziendale, ad esempio:

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

o

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

Per creare un pool in una directory locale, devi solo creare una directory e inserirvi dei file, hashget stesso troverà ciò di cui ha bisogno utilizzando gli hash. Per rendere il pool accessibile tramite HTTP, è necessario creare collegamenti simbolici in un modo speciale; questo viene fatto con un comando (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). Lo stesso HTTP FilePool è costituito da file statici, quindi qualsiasi semplice server Web può servirlo, il carico sul server è quasi zero.

Grazie a FilePool, puoi utilizzare non solo le risorse http(s) come risorse di base, ma anche per esempio,Ghiacciaio dell'Amazzonia.

Dopo aver caricato il backup sul ghiacciaio, otteniamo il suo ID di caricamento e lo utilizziamo come URL. Per esempio:

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

Ora i nuovi backup (differenziali) saranno basati su questo backup e saranno più brevi. Dopo aver decompresso tar diffbackup, possiamo vedere su quali risorse fa affidamento:

hashget --info /tmp/unpacked/ list

e usa semplicemente uno script di shell per scaricare tutti questi file da Glacier nel pool ed eseguire il solito ripristino: hashget -u /tmp/unpacked —pool /tmp/pool

Il gioco vale la candela?

Nel caso più semplice, pagherai semplicemente meno per i backup (se li archivi da qualche parte nel cloud a pagamento). Forse molto, molto meno.

Ma non è l'unica cosa. La quantità si trasforma in qualità. Puoi usarlo per ottenere un aggiornamento di alta qualità al tuo schema di backup. Ad esempio, poiché i nostri backup ora sono più brevi, possiamo eseguire backup non mensili, ma giornalieri. Conservali non per sei mesi, come prima, ma per 5 anni. In precedenza, lo archiviavi in ​​un archivio "freddo" lento ma economico (Glacier), ora puoi archiviarlo in un archivio caldo, da dove puoi sempre scaricare rapidamente un backup e ripristinarlo in pochi minuti, non in un giorno.

È possibile aumentare l'affidabilità dell'archiviazione di backup. Se attualmente li archiviamo in una struttura di archiviazione, riducendo il volume dei backup, saremo in grado di archiviarli in 2-3 strutture di archiviazione e sopravvivere senza problemi se uno di essi viene danneggiato.

Come provare a iniziare a utilizzare?

Vai alla pagina gitlab https://gitlab.com/yaroslaff/hashget, installa con un comando (pip3 install hashget[plugins]) e basta leggere ed eseguire l'avvio rapido. Penso che ci vorranno 10-15 minuti per fare tutte le cose semplici. Quindi puoi provare a comprimere le tue macchine virtuali, creare file di suggerimento se necessario per rendere la compressione più forte, giocare con pool, un database hash locale e un server hash se sei interessato, e il giorno successivo vedere quale è la dimensione del backup incrementale sarà in cima a quello di ieri.

Fonte: habr.com

Aggiungi un commento