Μειώστε τα αντίγραφα ασφαλείας κατά 99.5% με το hashget

hashget - είναι δωρεάν, ανοιχτού κώδικα αποτυπωτής είναι ένα βοηθητικό πρόγραμμα παρόμοιο με ένα πρόγραμμα αρχειοθέτησης που σας επιτρέπει να μειώσετε σημαντικά το μέγεθος των αντιγράφων ασφαλείας, καθώς και να οργανώσετε αυξητικά και διαφορικά σχήματα δημιουργίας αντιγράφων ασφαλείας και πολλά άλλα.

Αυτό είναι ένα άρθρο επισκόπησης για την περιγραφή των χαρακτηριστικών. Η πραγματική χρήση του hashget (αρκετά απλή) περιγράφεται στο README έργο και τεκμηρίωση wiki.

Σύγκριση

Σύμφωνα με το νόμο του είδους, θα ξεκινήσω αμέσως με την ίντριγκα - συγκρίνοντας τα αποτελέσματα:

Δείγμα δεδομένων
μη συσκευασμένο μέγεθος
.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% )

Ιστορικό για το τι πρέπει να είναι ένα ιδανικό και αποτελεσματικό αντίγραφο ασφαλείας

Κάθε φορά που έκανα ένα αντίγραφο ασφαλείας μιας πρόσφατα δημιουργημένης εικονικής μηχανής, με στοίχειωνε η ​​αίσθηση ότι έκανα κάτι λάθος. Γιατί λαμβάνω ένα τεράστιο αντίγραφο ασφαλείας από το σύστημα, όπου η ανεκτίμητη, άφθαρτη δημιουργικότητά μου είναι ένα index.html μιας γραμμής με το κείμενο "Hello world";

Γιατί υπάρχει ένα 16 MB /usr/sbin/mysqld στο αντίγραφο ασφαλείας μου; Είναι πραγματικά δυνατόν σε αυτόν τον κόσμο να έχω την τιμή να κρατήσω αυτόν τον σημαντικό φάκελο, και αν αποτύχω, να χαθεί για την ανθρωπότητα; Πιθανότατα όχι. Αποθηκεύεται σε εξαιρετικά αξιόπιστους διακομιστές debian (η αξιοπιστία και ο χρόνος λειτουργίας των οποίων δεν συγκρίνεται με αυτό που μπορώ να παρέχω), καθώς και σε αντίγραφα ασφαλείας (εκατομμύρια από αυτούς) άλλων διαχειριστών. Χρειάζεται πραγματικά να δημιουργήσουμε 10+ 000ο αντίγραφο αυτού του σημαντικού αρχείου για να βελτιώσουμε την αξιοπιστία;

Γενικά hashget και λύνει αυτό το πρόβλημα. Όταν συσκευάζεται, δημιουργεί ένα πολύ μικρό αντίγραφο ασφαλείας. Κατά την αποσυσκευασία - ένα εντελώς αποσυσκευασμένο σύστημα, παρόμοιο με αυτό που θα ήταν αν tar -c / tar -x. (Με άλλα λόγια, πρόκειται για συσκευασία χωρίς απώλειες)

Πώς λειτουργεί το hashget

Το hashget έχει τις έννοιες του Package και του HashPackage, με τη βοήθειά τους εκτελεί deduplication.

Πακέτο (πλαστική σακούλα). Ένα αρχείο (συνήθως αρχείο .deb ή .tar.gz) που μπορεί να ληφθεί με ασφάλεια από το Διαδίκτυο και από το οποίο μπορούν να ληφθούν ένα ή περισσότερα αρχεία.

HashPackage — ένα μικρό αρχείο JSON που αντιπροσωπεύει ένα Πακέτο, συμπεριλαμβανομένου του URL του πακέτου και των αθροισμάτων κατακερματισμού (sha256) των αρχείων από αυτό. Για παράδειγμα, για ένα πακέτο πυρήνα διακομιστή mariadb 5 megabyte, το μέγεθος του πακέτου κατακερματισμού είναι μόνο 6 kilobyte. Περίπου χίλιες φορές λιγότερο.

Αποδιπλασιασμός — δημιουργία αρχείου χωρίς διπλότυπα αρχεία (εάν το πρόγραμμα κατάργησης διπλότυπων γνωρίζει πού μπορεί να γίνει λήψη του αρχικού πακέτου, μειώνει τα διπλότυπα από το αρχείο).

Συσκευασία

Κατά τη συσκευασία, όλα τα αρχεία από τον κατάλογο που συσκευάζονται σαρώνονται, υπολογίζονται τα αθροίσματα κατακερματισμού τους και εάν το άθροισμα βρεθεί σε ένα από τα γνωστά πακέτα Hash, τότε αποθηκεύονται τα μεταδεδομένα για το αρχείο (όνομα, κατακερματισμός, δικαιώματα πρόσβασης κ.λπ.) σε ένα ειδικό αρχείο .hashget-restore.json, το οποίο θα περιλαμβάνεται επίσης στο αρχείο.

Στην απλούστερη περίπτωση, η ίδια η συσκευασία δεν φαίνεται πιο περίπλοκη από την πίσσα:

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

Αποσυσκευασία

Η αποσυσκευασία γίνεται σε δύο στάδια. Πρώτα η συνηθισμένη αποσυσκευασία πίσσας:

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

στη συνέχεια επαναφέρετε από το δίκτυο:

hashget -u /path/to/data

Κατά την επαναφορά, το hashget διαβάζει το αρχείο .hashget-restore.json, κατεβάζει τα απαραίτητα πακέτα, τα αποσυσκευάζει και εξάγει τα απαραίτητα αρχεία, εγκαθιστώντας τα στις απαιτούμενες διαδρομές, με τα απαιτούμενα δικαιώματα κατόχου/ομάδας/αδειών.

Πιο δύσκολα πράγματα

Αυτό που περιγράφεται παραπάνω είναι ήδη αρκετό για όσους «το θέλουν σαν πίσσα, αλλά να συσκευάσουν το Debian μου σε 4 megabyte». Ας δούμε πιο σύνθετα πράγματα αργότερα.

Ευρετηρίαση

Εάν το hashget δεν είχε καθόλου ένα μόνο HashPackage, τότε απλά δεν θα μπορούσε να αφαιρέσει τίποτα.

Μπορείτε επίσης να δημιουργήσετε ένα HashPackage με μη αυτόματο τρόπο (απλά: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), αλλά υπάρχει ένας πιο βολικός τρόπος.

Για να αποκτήσετε το απαραίτητο hashpackage, υπάρχει ένα στάδιο ευρετηρίαση (εκτελείται αυτόματα με την εντολή --pack) Και ευρετικές. Κατά την ευρετηρίαση, το hashget «τροφοδοτεί» κάθε αρχείο που βρίσκεται σε όλα τα διαθέσιμα ευρετικά που ενδιαφέρονται για αυτό. Στη συνέχεια, τα Heuristics μπορούν να ευρετηριάσουν οποιοδήποτε Πακέτο για να δημιουργήσουν ένα HashPackage.

Για παράδειγμα, το ευρετικό Debian λατρεύει το αρχείο /var/lib/dpkg/status και εντοπίζει εγκατεστημένα πακέτα debian, και αν δεν είναι ευρετηριασμένα (δεν έχει δημιουργηθεί κανένα HashPackage για αυτά), τα κατεβάζει και τα ευρετηριάζει. Το αποτέλεσμα είναι ένα πολύ ωραίο εφέ - το hashget θα αφαιρεί πάντα αποτελεσματικά τα Debian OS, ακόμα κι αν έχουν τα πιο πρόσφατα πακέτα.

Αρχεία συμβουλών

Εάν το δίκτυό σας χρησιμοποιεί ορισμένα από τα ιδιόκτητα πακέτα σας ή ένα δημόσιο πακέτο που δεν περιλαμβάνεται στα ευρετικά 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 το ευρετηριάζει (αν δεν το έχει ήδη κάνει)

HashServer

Θα ήταν αρκετά απαιτητικό να πραγματοποιηθεί πλήρης ευρετηρίαση κατά τη δημιουργία αντιγράφων ασφαλείας. Για να το κάνετε αυτό, πρέπει να κάνετε λήψη κάθε πακέτου, να το αποσυσκευάσετε και να το καταχωρήσετε στο ευρετήριο. Επομένως, το hashget χρησιμοποιεί ένα σχήμα με HashServer. Όταν ανιχνεύεται ένα εγκατεστημένο πακέτο Debian, εάν δεν βρεθεί στο τοπικό HashPackage, επιχειρείται πρώτα να γίνει απλώς λήψη του HashPackage από τον διακομιστή κατακερματισμού. Και μόνο αν αυτό δεν λειτουργήσει, το ίδιο το hashget κατεβάζει και κατακερματίζει το πακέτο (και το ανεβάζει στον hashserver, ώστε ο hashserver να το παρέχει στο μέλλον).

Ο HashServer είναι ένα προαιρετικό στοιχείο του συστήματος, όχι κρίσιμο, χρησιμεύει αποκλειστικά για την επιτάχυνση και τη μείωση του φόρτου στα αποθετήρια. Απενεργοποιείται εύκολα (προαιρετικό --hashserver χωρίς παραμέτρους). Επιπλέον, μπορείτε εύκολα φτιάξτε το δικό σας hashserver.

Αύξηση και διαφορικά αντίγραφα ασφαλείας, προγραμματισμένη απαξίωση

hashget καθιστά πολύ εύκολη τη δημιουργία ενός διαγράμματος σταδιακά και διαφορικά αντίγραφα ασφαλείας. Γιατί δεν ευρετηριάζουμε το ίδιο το αντίγραφο ασφαλείας μας (με όλα τα μοναδικά αρχεία μας); Μια ομάδα --submit και τελείωσες! Το επόμενο αντίγραφο ασφαλείας που δημιουργεί το hashget δεν θα περιλαμβάνει αρχεία από αυτό το αρχείο.

Αλλά αυτή δεν είναι μια πολύ καλή προσέγγιση, επειδή μπορεί να αποδειχθεί ότι κατά την επαναφορά θα πρέπει να τραβήξουμε όλα τα αντίγραφα ασφαλείας hashget σε ολόκληρο το ιστορικό (αν το καθένα περιέχει τουλάχιστον ένα μοναδικό αρχείο). Υπάρχει ένας μηχανισμός για αυτό προγραμματισμένη απαξίωση των αντιγράφων ασφαλείας. Κατά τη δημιουργία ευρετηρίου, μπορείτε να καθορίσετε την ημερομηνία λήξης του HashPackage --expires 2019-06-01, και μετά την ημερομηνία αυτή (από τις 00:00), δεν θα χρησιμοποιηθεί. Το ίδιο το αρχείο δεν μπορεί να διαγραφεί μετά από αυτήν την ημερομηνία (Αν και το hashget μπορεί εύκολα να εμφανίσει τις διευθύνσεις URL όλων των αντιγράφων ασφαλείας που είναι/θα είναι σάπια αυτήν τη στιγμή ή σε οποιαδήποτε ημερομηνία).

Για παράδειγμα, αν κάνουμε ένα πλήρες αντίγραφο ασφαλείας την 1η και το κάνουμε ευρετήριο με μια διάρκεια ζωής μέχρι το τέλος του μήνα, θα λάβουμε ένα διαφορικό εφεδρικό σχήμα.

Εάν ευρετηριάζουμε νέα αντίγραφα ασφαλείας με τον ίδιο τρόπο, θα υπάρχει ένα σχήμα σταδιακών αντιγράφων ασφαλείας.

Σε αντίθεση με τα παραδοσιακά σχήματα, το hashget σάς επιτρέπει να χρησιμοποιείτε πολλαπλές υποκείμενες πηγές. Το αντίγραφο ασφαλείας θα μειωθεί τόσο με τη μείωση των αρχείων από προηγούμενα αντίγραφα ασφαλείας (εάν υπάρχουν) όσο και με τα δημόσια αρχεία (τι μπορεί να γίνει λήψη).

Εάν για κάποιο λόγο δεν εμπιστευόμαστε την αξιοπιστία των πόρων του Debian (https://snapshot.debian.org/) ή χρησιμοποιεί μια άλλη διανομή, μπορούμε απλά να δημιουργήσουμε ένα πλήρες αντίγραφο ασφαλείας μία φορά με όλα τα πακέτα και στη συνέχεια να βασιστούμε σε αυτό (με την απενεργοποίηση της ευρετικής). Τώρα, εάν όλοι οι διακομιστές των διανομών μας αποδειχθεί ότι δεν είναι διαθέσιμοι σε εμάς (στο Διαδίκτυο με σουβενίρ ή κατά τη διάρκεια μιας αποκάλυψης ζόμπι), αλλά τα αντίγραφα ασφαλείας μας είναι σωστά, μπορούμε να ανακτήσουμε από οποιοδήποτε αντίγραφο ασφαλείας σύντομης διαφοράς που βασίζεται μόνο στα προηγούμενα αντίγραφα ασφαλείας μας .

Το Hashget βασίζεται μόνο σε αξιόπιστες πηγές ανάκτησης κατά την κρίση ΣΑΣ. Θα χρησιμοποιηθούν αυτά που θεωρείτε αξιόπιστα.

FilePool και Glacier

Μηχανισμός FilePool σας επιτρέπει να μην επικοινωνείτε συνεχώς με εξωτερικούς διακομιστές για τη λήψη πακέτων, αλλά να χρησιμοποιείτε πακέτα από έναν τοπικό κατάλογο ή έναν εταιρικό διακομιστή, για παράδειγμα:

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

ή

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

Για να δημιουργήσετε ένα pool σε έναν τοπικό κατάλογο, πρέπει απλώς να δημιουργήσετε έναν κατάλογο και να ρίξετε αρχεία σε αυτόν, το ίδιο το hashget θα βρει αυτό που χρειάζεται χρησιμοποιώντας τα hashes. Για να κάνετε την πισίνα προσβάσιμη μέσω HTTP, πρέπει να δημιουργήσετε συμβολικούς συνδέσμους με έναν ειδικό τρόπο, αυτό γίνεται με μία εντολή (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). Το ίδιο το HTTP FilePool είναι στατικά αρχεία, επομένως οποιοσδήποτε απλός διακομιστής ιστού μπορεί να το εξυπηρετήσει, το φόρτο στον διακομιστή είναι σχεδόν μηδενικό.

Χάρη στο FilePool, μπορείτε να χρησιμοποιήσετε όχι μόνο πόρους http(s) ως βασικούς πόρους, αλλά και για παράδειγμα,Παγετώνας της Αμαζόνας.

Αφού ανεβάσουμε το αντίγραφο ασφαλείας στον παγετώνα, παίρνουμε το αναγνωριστικό μεταφόρτωσης και το χρησιμοποιούμε ως URL. Για παράδειγμα:

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

Τώρα τα νέα (διαφορικά) αντίγραφα ασφαλείας θα βασίζονται σε αυτό το αντίγραφο ασφαλείας και θα είναι μικρότερα. Μετά την αποσυμπίεση του diffbackup, μπορούμε να δούμε σε ποιους πόρους βασίζεται:

hashget --info /tmp/unpacked/ list

και απλώς χρησιμοποιήστε ένα σενάριο κελύφους για να κατεβάσετε όλα αυτά τα αρχεία από το Glacier στην πισίνα και να εκτελέσετε τη συνήθη ανάκτηση: hashget -u /tmp/unpacked —pool /tmp/pool

Αξίζει το παιχνίδι το κερί;

Στην πιο απλή περίπτωση, απλά θα πληρώσετε λιγότερα για αντίγραφα ασφαλείας (αν τα αποθηκεύσετε κάπου στο cloud για χρήματα). Ίσως πολύ, πολύ λιγότερο.

Αλλά δεν είναι μόνο αυτό. Η ποσότητα μετατρέπεται σε ποιότητα. Μπορείτε να το χρησιμοποιήσετε για να λάβετε μια αναβάθμιση υψηλής ποιότητας στο εφεδρικό σχήμα σας. Για παράδειγμα, αφού τα αντίγραφα ασφαλείας μας είναι πλέον πιο σύντομα, μπορούμε να κάνουμε όχι μηνιαία, αλλά καθημερινά. Αποθηκεύστε τα όχι για έξι μήνες, όπως πριν, αλλά για 5 χρόνια. Προηγουμένως, το αποθηκεύατε σε αργή αλλά φθηνή «ψυχρή» αποθήκευση (Glacier), τώρα μπορείτε να το αποθηκεύσετε σε ζεστό χώρο αποθήκευσης, από όπου μπορείτε πάντα να κατεβάσετε γρήγορα ένα αντίγραφο ασφαλείας και να το επαναφέρετε σε λίγα λεπτά, όχι σε μια μέρα.

Μπορείτε να αυξήσετε την αξιοπιστία της αποθήκευσης αντιγράφων ασφαλείας. Εάν τα αποθηκεύουμε αυτήν τη στιγμή σε μία εγκατάσταση αποθήκευσης, τότε μειώνοντας τον όγκο των εφεδρικών αντιγράφων, θα μπορούμε να τα αποθηκεύσουμε σε 2-3 αποθηκευτικούς χώρους και να επιβιώσουμε ανώδυνα εάν ένα από αυτά καταστραφεί.

Πώς να δοκιμάσετε και να αρχίσετε να χρησιμοποιείτε;

Μεταβείτε στη σελίδα gitlab https://gitlab.com/yaroslaff/hashget, εγκατάσταση με μία εντολή (pip3 install hashget[plugins]) και απλώς διαβάστε και εκτελέστε τη γρήγορη εκκίνηση. Νομίζω ότι θα χρειαστούν 10-15 λεπτά για να γίνουν όλα τα απλά πράγματα. Στη συνέχεια, μπορείτε να προσπαθήσετε να συμπιέσετε τις εικονικές μηχανές σας, να δημιουργήσετε αρχεία υποδείξεων εάν είναι απαραίτητο για να ενισχύσετε τη συμπίεση, να παίξετε με pools, μια τοπική βάση δεδομένων κατακερματισμού και έναν διακομιστή κατακερματισμού, αν σας ενδιαφέρει και την επόμενη μέρα να δείτε ποιο είναι το μέγεθος του αυξητικού αντιγράφου ασφαλείας θα είναι πάνω από το χθεσινό.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο