Συμπίεση δεδομένων στο Apache Ignite. Η εμπειρία του Sber

Συμπίεση δεδομένων στο Apache Ignite. Η εμπειρία του SberΌταν εργάζεστε με μεγάλους όγκους δεδομένων, μερικές φορές μπορεί να προκύψει το πρόβλημα της έλλειψης χώρου στο δίσκο. Ένας τρόπος επίλυσης αυτού του προβλήματος είναι η συμπίεση, χάρη στην οποία, στον ίδιο εξοπλισμό, μπορείτε να αντέξετε οικονομικά να αυξήσετε τους όγκους αποθήκευσης. Σε αυτό το άρθρο, θα δούμε πώς λειτουργεί η συμπίεση δεδομένων στο Apache Ignite. Αυτό το άρθρο θα περιγράψει μόνο τις μεθόδους συμπίεσης δίσκου που εφαρμόζονται στο προϊόν. Άλλες μέθοδοι συμπίεσης δεδομένων (μέσα από το δίκτυο, στη μνήμη), είτε εφαρμόζονται είτε όχι, θα παραμείνουν εκτός του πεδίου εφαρμογής.

Έτσι, με ενεργοποιημένη τη λειτουργία επιμονής, ως αποτέλεσμα αλλαγών στα δεδομένα στις κρυφές μνήμες, το Ignite αρχίζει να γράφει στο δίσκο:

  1. Περιεχόμενα κρυφής μνήμης
  2. Εγγραφή προκαταβολικού αρχείου (εφεξής απλώς WAL)

Υπάρχει ένας μηχανισμός συμπίεσης WAL εδώ και αρκετό καιρό, που ονομάζεται συμπίεση WAL. Το Apache Ignite 2.8 που κυκλοφόρησε πρόσφατα εισήγαγε δύο ακόμη μηχανισμούς που σας επιτρέπουν να συμπιέσετε δεδομένα στο δίσκο: τη συμπίεση σελίδας δίσκου για τη συμπίεση των περιεχομένων της κρυφής μνήμης και τη συμπίεση στιγμιότυπου σελίδας WAL για τη συμπίεση ορισμένων καταχωρήσεων WAL. Περισσότερες λεπτομέρειες για και τους τρεις από αυτούς τους μηχανισμούς παρακάτω.

Συμπίεση σελίδας δίσκου

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

Αρχικά, ας ρίξουμε μια πολύ σύντομη ματιά στον τρόπο με τον οποίο το Ignite αποθηκεύει δεδομένα. Η μνήμη σελίδας χρησιμοποιείται για αποθήκευση. Το μέγεθος σελίδας ορίζεται στην αρχή του κόμβου και δεν μπορεί να αλλάξει σε μεταγενέστερα στάδια· επίσης, το μέγεθος της σελίδας πρέπει να είναι ισχύς δύο και πολλαπλάσιο του μεγέθους του μπλοκ συστήματος αρχείων. Οι σελίδες φορτώνονται στη μνήμη RAM από το δίσκο ανάλογα με τις ανάγκες· το μέγεθος των δεδομένων στο δίσκο μπορεί να υπερβαίνει την ποσότητα της εκχωρημένης μνήμης RAM. Εάν δεν υπάρχει αρκετός χώρος στη μνήμη RAM για τη φόρτωση μιας σελίδας από το δίσκο, οι παλιές σελίδες που δεν χρησιμοποιούνται πλέον θα αφαιρεθούν από τη μνήμη RAM.

Τα δεδομένα αποθηκεύονται στο δίσκο με την ακόλουθη μορφή: δημιουργείται ένα ξεχωριστό αρχείο για κάθε διαμέρισμα κάθε ομάδας κρυφής μνήμης· σε αυτό το αρχείο, οι σελίδες εμφανίζονται η μία μετά την άλλη με αύξουσα σειρά ευρετηρίου. Το αναγνωριστικό πλήρους σελίδας περιέχει το αναγνωριστικό ομάδας κρυφής μνήμης, τον αριθμό διαμερίσματος και το ευρετήριο σελίδας στο αρχείο. Έτσι, χρησιμοποιώντας το αναγνωριστικό πλήρους σελίδας, μπορούμε να προσδιορίσουμε μοναδικά το αρχείο και τη μετατόπιση στο αρχείο για κάθε σελίδα. Μπορείτε να διαβάσετε περισσότερα σχετικά με τη μνήμη σελιδοποίησης στο άρθρο του Apache Ignite Wiki: Ignite Persistent Store - κάτω από την κουκούλα.

Ο μηχανισμός συμπίεσης σελίδας δίσκου, όπως μπορείτε να μαντέψετε από το όνομα, λειτουργεί σε επίπεδο σελίδας. Όταν αυτός ο μηχανισμός είναι ενεργοποιημένος, τα δεδομένα στη μνήμη RAM επεξεργάζονται ως έχουν, χωρίς καμία συμπίεση, αλλά όταν οι σελίδες αποθηκεύονται από τη μνήμη RAM στο δίσκο, συμπιέζονται.

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

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

Για να αποφευχθεί η επίλυση αυτών των προβλημάτων στο δικό της επίπεδο, η συμπίεση σελίδας δίσκου στο Apache Ignite χρησιμοποιεί έναν μηχανισμό συστήματος αρχείων που ονομάζεται αραιά αρχεία. Ένα αραιό αρχείο είναι αυτό στο οποίο ορισμένες μηδενικές περιοχές μπορούν να επισημανθούν ως "τρύπες". Σε αυτήν την περίπτωση, δεν θα εκχωρηθούν μπλοκ συστήματος αρχείων για την αποθήκευση αυτών των οπών, με αποτέλεσμα την εξοικονόμηση χώρου στο δίσκο.

Είναι λογικό ότι για να ελευθερωθεί ένα μπλοκ συστήματος αρχείων, το μέγεθος της οπής πρέπει να είναι μεγαλύτερο ή ίσο με το μπλοκ συστήματος αρχείων, γεγονός που επιβάλλει έναν πρόσθετο περιορισμό στο μέγεθος της σελίδας και στο Apache Ignite: για να έχει οποιοδήποτε αποτέλεσμα η συμπίεση, το μέγεθος της σελίδας πρέπει να είναι αυστηρά μεγαλύτερο από το μέγεθος του μπλοκ συστήματος αρχείων. Εάν το μέγεθος της σελίδας είναι ίσο με το μέγεθος του μπλοκ, τότε δεν θα μπορέσουμε ποτέ να ελευθερώσουμε ένα μόνο μπλοκ, αφού για να ελευθερωθεί ένα μόνο μπλοκ, η συμπιεσμένη σελίδα πρέπει να καταλαμβάνει 0 byte. Εάν το μέγεθος της σελίδας είναι ίσο με το μέγεθος 2 ή 4 μπλοκ, θα μπορούμε ήδη να ελευθερώσουμε τουλάχιστον ένα μπλοκ εάν η σελίδα μας συμπιεστεί σε τουλάχιστον 50% ή 75%, αντίστοιχα.

Έτσι, η τελική περιγραφή του τρόπου λειτουργίας του μηχανισμού: Όταν γράφετε μια σελίδα σε δίσκο, γίνεται προσπάθεια συμπίεσης της σελίδας. Εάν το μέγεθος της συμπιεσμένης σελίδας επιτρέπει την απελευθέρωση ενός ή περισσότερων μπλοκ συστήματος αρχείων, τότε η σελίδα γράφεται σε συμπιεσμένη μορφή και δημιουργείται μια "τρύπα" στη θέση των ελευθερωμένων μπλοκ (εκτελείται μια κλήση συστήματος fallocate() με τη σημαία διάτρησης). Εάν το μέγεθος της συμπιεσμένης σελίδας δεν επιτρέπει την απελευθέρωση των μπλοκ, η σελίδα αποθηκεύεται ως έχει, ασυμπίεστη. Όλες οι μετατοπίσεις σελίδας υπολογίζονται με τον ίδιο τρόπο όπως χωρίς συμπίεση, πολλαπλασιάζοντας το ευρετήριο σελίδας με το μέγεθος της σελίδας. Δεν απαιτείται μετεγκατάσταση σελίδων μόνοι σας. Οι μετατοπίσεις σελίδων, όπως και χωρίς συμπίεση, πέφτουν στα όρια των μπλοκ συστήματος αρχείων.

Συμπίεση δεδομένων στο Apache Ignite. Η εμπειρία του Sber

Στην τρέχουσα υλοποίηση, το Ignite μπορεί να λειτουργήσει μόνο με αραιά αρχεία στο λειτουργικό σύστημα Linux. Συνεπώς, η συμπίεση σελίδας δίσκου μπορεί να ενεργοποιηθεί μόνο όταν χρησιμοποιείται το Ignite σε αυτό το λειτουργικό σύστημα.

Αλγόριθμοι συμπίεσης που μπορούν να χρησιμοποιηθούν για τη συμπίεση σελίδων δίσκου: ZSTD, LZ4, Snappy. Επιπλέον, υπάρχει ένας τρόπος λειτουργίας (SKIP_GARBAGE), στον οποίο μόνο ο αχρησιμοποίητος χώρος στη σελίδα απορρίπτεται χωρίς να εφαρμόζεται συμπίεση στα υπόλοιπα δεδομένα, γεγονός που μειώνει το φορτίο στη CPU σε σύγκριση με τους αλγόριθμους που αναφέρονται προηγουμένως.

Επίδραση απόδοσης

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

Για να γίνει αυτό, πρέπει να θυμόμαστε πώς διαβάζονται και γράφονται οι σελίδες κατά την πρόσβαση:

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

Έτσι, ο αντίκτυπος στις λειτουργίες ανάγνωσης είναι:

  • Θετικό (Disk IO), λόγω μείωσης του αριθμού των μπλοκ συστήματος αρχείων ανάγνωσης.
  • Αρνητικό (CPU), λόγω του πρόσθετου φορτίου που απαιτείται από το λειτουργικό σύστημα για να λειτουργήσει με αραιά αρχεία. Είναι επίσης πιθανό ότι οι πρόσθετες λειτουργίες IO θα εμφανιστούν σιωπηρά εδώ για να αποθηκεύσετε μια πιο περίπλοκη δομή αραιού αρχείων (δυστυχώς, δεν είμαι εξοικειωμένος με όλες τις λεπτομέρειες του τρόπου λειτουργίας των αραιών αρχείων).
  • Αρνητικό (CPU), λόγω της ανάγκης αποσυμπίεσης σελίδων.
  • Δεν υπάρχει καμία επίδραση στις λειτουργίες εγγραφής.
  • Επίδραση στη διαδικασία του σημείου ελέγχου (όλα εδώ είναι παρόμοια με τις λειτουργίες ανάγνωσης):
  • Θετικό (Disk IO), λόγω μείωσης του αριθμού των γραπτών μπλοκ συστήματος αρχείων.
  • Αρνητικό (CPU, πιθανώς IO δίσκου), λόγω εργασίας με αραιά αρχεία.
  • Αρνητικό (CPU), λόγω της ανάγκης για συμπίεση σελίδας.

Ποια πλευρά της ζυγαριάς θα γείρει τη ζυγαριά; Όλα αυτά εξαρτώνται σε μεγάλο βαθμό από το περιβάλλον, αλλά τείνω να πιστεύω ότι η συμπίεση σελίδας δίσκου πιθανότατα θα οδηγήσει σε υποβάθμιση της απόδοσης στα περισσότερα συστήματα. Επιπλέον, οι δοκιμές σε άλλα DBMS που χρησιμοποιούν παρόμοια προσέγγιση με αραιά αρχεία δείχνουν πτώση της απόδοσης όταν είναι ενεργοποιημένη η συμπίεση.

Πώς να ενεργοποιήσετε και να ρυθμίσετε

Όπως αναφέρθηκε παραπάνω, η ελάχιστη έκδοση του Apache Ignite που υποστηρίζει τη συμπίεση σελίδων δίσκου είναι 2.8 και υποστηρίζεται μόνο το λειτουργικό σύστημα Linux. Ενεργοποιήστε και ρυθμίστε τις παραμέτρους ως εξής:

  • Πρέπει να υπάρχει μια μονάδα συμπίεσης ανάφλεξης στη διαδρομή τάξης. Από προεπιλογή, βρίσκεται στη διανομή Apache Ignite στον κατάλογο libs/optional και δεν περιλαμβάνεται στη διαδρομή κλάσης. Μπορείτε απλώς να μετακινήσετε τον κατάλογο ένα επίπεδο προς τα πάνω στα libs και, στη συνέχεια, όταν τον εκτελέσετε μέσω του ignite.sh θα ενεργοποιηθεί αυτόματα.
  • Η επιμονή πρέπει να είναι ενεργοποιημένη (Ενεργοποιήθηκε μέσω DataRegionConfiguration.setPersistenceEnabled(true)).
  • Το μέγεθος της σελίδας πρέπει να είναι μεγαλύτερο από το μέγεθος του μπλοκ συστήματος αρχείων (μπορείτε να το ορίσετε χρησιμοποιώντας DataStorageConfiguration.setPageSize() ).
  • Για κάθε προσωρινή μνήμη της οποίας τα δεδομένα πρέπει να συμπιεστούν, πρέπει να διαμορφώσετε τη μέθοδο συμπίεσης και (προαιρετικά) το επίπεδο συμπίεσης (μέθοδοι CacheConfiguration.setDiskPageCompression() , CacheConfiguration.setDiskPageCompressionLevel()).

Συμπύκνωση WAL

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

Τι είναι το WAL και γιατί χρειάζεται; Πολύ σύντομα: αυτό είναι ένα αρχείο καταγραφής που περιέχει όλα τα συμβάντα που τελικά αλλάζουν τον χώρο αποθήκευσης της σελίδας. Χρειάζεται πρωτίστως για να μπορέσει να αναρρώσει σε περίπτωση πτώσης. Οποιαδήποτε λειτουργία, πριν δώσει τον έλεγχο στον χρήστη, πρέπει πρώτα να καταγράψει ένα συμβάν στο WAL, έτσι ώστε σε περίπτωση αποτυχίας, να μπορεί να αναπαραχθεί στο αρχείο καταγραφής και να αποκατασταθούν όλες οι λειτουργίες για τις οποίες ο χρήστης έλαβε επιτυχή απάντηση, ακόμη και αν αυτές οι λειτουργίες δεν είχε χρόνο να αντικατοπτριστεί στην αποθήκευση σελίδων στο δίσκο (ήδη παραπάνω Έχει περιγραφεί ότι η πραγματική εγγραφή στο χώρο αποθήκευσης σελίδων γίνεται με μια διαδικασία που ονομάζεται "σημείο ελέγχου" με κάποια καθυστέρηση από ξεχωριστά νήματα).

Οι εγγραφές στο WAL χωρίζονται σε λογικές και φυσικές. Τα Boolean είναι τα ίδια τα κλειδιά και οι αξίες. Φυσική - αντικατοπτρίζει τις αλλαγές σε σελίδες στο κατάστημα σελίδων. Ενώ οι λογικές εγγραφές μπορούν να είναι χρήσιμες για ορισμένες άλλες περιπτώσεις, οι φυσικές εγγραφές χρειάζονται μόνο για ανάκτηση σε περίπτωση συντριβής και οι εγγραφές χρειάζονται μόνο από το τελευταίο επιτυχημένο σημείο ελέγχου. Εδώ δεν θα μπούμε σε λεπτομέρειες και θα εξηγήσουμε γιατί λειτουργεί με αυτόν τον τρόπο, αλλά οι ενδιαφερόμενοι μπορούν να ανατρέξουν στο ήδη αναφερόμενο άρθρο στο Apache Ignite Wiki: Ignite Persistent Store - κάτω από την κουκούλα.

Υπάρχουν συχνά πολλές φυσικές εγγραφές ανά λογική εγγραφή. Δηλαδή, για παράδειγμα, μια λειτουργία τοποθέτησης στην κρυφή μνήμη επηρεάζει πολλές σελίδες στη μνήμη σελίδων (μια σελίδα με τα ίδια τα δεδομένα, σελίδες με ευρετήρια, σελίδες με ελεύθερες λίστες). Σε ορισμένες συνθετικές δοκιμές, διαπίστωσα ότι οι φυσικές εγγραφές καταλάμβαναν έως και το 90% του αρχείου WAL. Ωστόσο, χρειάζονται για πολύ μικρό χρονικό διάστημα (από προεπιλογή, το διάστημα μεταξύ των σημείων ελέγχου είναι 3 λεπτά). Θα ήταν λογικό να απαλλαγούμε από αυτά τα δεδομένα αφού χάσουν τη συνάφειά τους. Αυτό ακριβώς κάνει ο μηχανισμός συμπίεσης WAL: απαλλάσσει τις φυσικές εγγραφές και συμπιέζει τις υπόλοιπες λογικές εγγραφές χρησιμοποιώντας zip, ενώ το μέγεθος του αρχείου μειώνεται πολύ σημαντικά (μερικές φορές κατά δεκάδες φορές).

Φυσικά, το WAL αποτελείται από πολλά τμήματα (10 από προεπιλογή) σταθερού μεγέθους (64 MB από προεπιλογή), τα οποία αντικαθίστανται με κυκλικό τρόπο. Μόλις συμπληρωθεί το τρέχον τμήμα, το επόμενο τμήμα εκχωρείται ως τρέχον και το γεμάτο τμήμα αντιγράφεται στο αρχείο από ένα ξεχωριστό νήμα. Η συμπίεση WAL λειτουργεί ήδη με τμήματα αρχειοθέτησης. Επίσης, ως ξεχωριστό νήμα, παρακολουθεί την εκτέλεση του σημείου ελέγχου και ξεκινά τη συμπίεση σε τμήματα αρχειοθέτησης για τα οποία δεν χρειάζονται πλέον φυσικές εγγραφές.

Συμπίεση δεδομένων στο Apache Ignite. Η εμπειρία του Sber

Επίδραση απόδοσης

Εφόσον η συμπίεση WAL εκτελείται ως ξεχωριστό νήμα, δεν θα πρέπει να υπάρχει άμεσος αντίκτυπος στις λειτουργίες που εκτελούνται. Ωστόσο, εξακολουθεί να βάζει επιπλέον φορτίο φόντου στη CPU (συμπίεση) και στο δίσκο (διαβάζοντας κάθε τμήμα WAL από το αρχείο και γράφοντας τα συμπιεσμένα τμήματα), επομένως εάν το σύστημα λειτουργεί στη μέγιστη χωρητικότητά του, θα οδηγήσει επίσης σε υποβάθμιση της απόδοσης.

Πώς να ενεργοποιήσετε και να ρυθμίσετε

Μπορείτε να ενεργοποιήσετε τη συμπίεση WAL χρησιμοποιώντας την ιδιότητα WalCompactionEnabled в DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)). Επίσης, χρησιμοποιώντας τη μέθοδο DataStorageConfiguration.setWalCompactionLevel(), μπορείτε να ορίσετε το επίπεδο συμπίεσης εάν δεν είστε ικανοποιημένοι με την προεπιλεγμένη τιμή (BEST_SPEED).

Συμπίεση στιγμιότυπου σελίδας WAL

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

Έχουμε ήδη ανακαλύψει ότι στο WAL οι εγγραφές χωρίζονται σε λογικές και φυσικές. Για κάθε αλλαγή σε κάθε σελίδα, δημιουργείται μια φυσική εγγραφή WAL στη μνήμη σελίδας. Οι φυσικές εγγραφές, με τη σειρά τους, χωρίζονται επίσης σε 2 υποτύπους: εγγραφή στιγμιότυπου σελίδας και εγγραφή δέλτα. Κάθε φορά που αλλάζουμε κάτι σε μια σελίδα και το μεταφέρουμε από μια καθαρή κατάσταση σε μια βρώμικη κατάσταση, ένα πλήρες αντίγραφο αυτής της σελίδας αποθηκεύεται στο WAL (εγγραφή στιγμιότυπου σελίδας). Ακόμα κι αν αλλάξαμε μόνο ένα byte στο WAL, η εγγραφή θα είναι ελαφρώς μεγαλύτερη από το μέγεθος της σελίδας. Αν αλλάξουμε κάτι σε μια ήδη βρώμικη σελίδα, σχηματίζεται μια εγγραφή δέλτα στο WAL, η οποία αντικατοπτρίζει μόνο τις αλλαγές σε σύγκριση με την προηγούμενη κατάσταση της σελίδας, αλλά όχι ολόκληρη τη σελίδα. Εφόσον η επαναφορά της κατάστασης των σελίδων από βρώμικες σε καθαρές πραγματοποιείται κατά τη διαδικασία του σημείου ελέγχου, αμέσως μετά την έναρξη του σημείου ελέγχου, σχεδόν όλες οι φυσικές εγγραφές θα αποτελούνται μόνο από στιγμιότυπα σελίδων (καθώς όλες οι σελίδες αμέσως μετά την έναρξη του σημείου ελέγχου είναι καθαρές) , τότε καθώς πλησιάζουμε στο επόμενο σημείο ελέγχου, το κλάσμα εγγραφής δέλτα αρχίζει να μεγαλώνει και να μηδενίζεται ξανά στην αρχή του επόμενου σημείου ελέγχου. Οι μετρήσεις σε ορισμένα συνθετικά τεστ έδειξαν ότι το μερίδιο των στιγμιότυπων σελίδων στον συνολικό όγκο των φυσικών εγγραφών φτάνει το 90%.

Η ιδέα της συμπίεσης στιγμιότυπων σελίδων WAL είναι να συμπιέσετε στιγμιότυπα σελίδας χρησιμοποιώντας ένα έτοιμο εργαλείο συμπίεσης σελίδας (δείτε συμπίεση σελίδας δίσκου). Ταυτόχρονα, στο WAL, οι εγγραφές αποθηκεύονται διαδοχικά σε λειτουργία μόνο προσάρτησης και δεν χρειάζεται να δεσμεύονται εγγραφές στα όρια των μπλοκ συστήματος αρχείων, επομένως εδώ, σε αντίθεση με τον μηχανισμό συμπίεσης σελίδας δίσκου, δεν χρειαζόμαστε αραιά αρχεία στο όλα· κατά συνέπεια, αυτός ο μηχανισμός θα λειτουργεί όχι μόνο στο λειτουργικό σύστημα Linux. Επιπλέον, δεν μας ενδιαφέρει πλέον πόσο μπορέσαμε να συμπιέσουμε τη σελίδα. Ακόμα κι αν ελευθερώσαμε 1 byte, αυτό είναι ήδη ένα θετικό αποτέλεσμα και μπορούμε να αποθηκεύσουμε συμπιεσμένα δεδομένα στο WAL, σε αντίθεση με τη συμπίεση σελίδας δίσκου, όπου αποθηκεύουμε τη συμπιεσμένη σελίδα μόνο εάν ελευθερώσαμε περισσότερα από 1 μπλοκ συστήματος αρχείων.

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

Όπως και με τη συμπίεση σελίδας δίσκου, η συμπίεση στιγμιότυπου σελίδας WAL μπορεί να χρησιμοποιήσει τους αλγόριθμους συμπίεσης ZSTD, LZ4, Snappy, καθώς και τη λειτουργία SKIP_GARBAGE.

Επίδραση απόδοσης

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

Αυτό επηρεάζει τα νήματα που αλλάζουν δεδομένα με τον ακόλουθο τρόπο: παίρνουμε ένα αρνητικό αποτέλεσμα (CPU) λόγω της ανάγκης συμπίεσης της σελίδας κάθε φορά πριν από την εγγραφή στο δίσκο και ένα θετικό αποτέλεσμα (δισκέτα IO) λόγω μείωσης του ποσού γραμμένα δεδομένα. Αντίστοιχα, όλα είναι απλά εδώ: εάν η απόδοση του συστήματος περιορίζεται από την CPU, έχουμε μια μικρή υποβάθμιση, εάν περιορίζεται από την είσοδο/έξοδο του δίσκου, έχουμε μια αύξηση.

Έμμεσα, η μείωση του μεγέθους WAL επηρεάζει επίσης (θετικά) τις ροές που απορρίπτουν τμήματα WAL στο αρχείο και στις ροές συμπίεσης WAL.

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

Πώς να ενεργοποιήσετε και να ρυθμίσετε

Ελάχιστη έκδοση Apache Ignite: 2.8. Ενεργοποιήστε και ρυθμίστε τις παραμέτρους ως εξής:

  • Πρέπει να υπάρχει μια μονάδα συμπίεσης ανάφλεξης στη διαδρομή τάξης. Από προεπιλογή, βρίσκεται στη διανομή Apache Ignite στον κατάλογο libs/optional και δεν περιλαμβάνεται στη διαδρομή κλάσης. Μπορείτε απλώς να μετακινήσετε τον κατάλογο ένα επίπεδο προς τα πάνω στα libs και, στη συνέχεια, όταν τον εκτελέσετε μέσω του ignite.sh θα ενεργοποιηθεί αυτόματα.
  • Η επιμονή πρέπει να είναι ενεργοποιημένη (Ενεργοποιήθηκε μέσω DataRegionConfiguration.setPersistenceEnabled(true)).
  • Η λειτουργία συμπίεσης πρέπει να ρυθμιστεί χρησιμοποιώντας τη μέθοδο DataStorageConfiguration.setWalPageCompression(), η συμπίεση είναι απενεργοποιημένη από προεπιλογή (λειτουργία ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ).
  • Προαιρετικά, μπορείτε να ορίσετε το επίπεδο συμπίεσης χρησιμοποιώντας τη μέθοδο DataStorageConfiguration.setWalPageCompression(), δείτε το javadoc για τη μέθοδο για έγκυρες τιμές για κάθε λειτουργία.

Συμπέρασμα

Οι εξεταζόμενοι μηχανισμοί συμπίεσης δεδομένων στο Apache Ignite μπορούν να χρησιμοποιηθούν ανεξάρτητα ο ένας από τον άλλο, αλλά οποιοσδήποτε συνδυασμός τους είναι επίσης αποδεκτός. Η κατανόηση του τρόπου λειτουργίας τους θα σας επιτρέψει να προσδιορίσετε πόσο κατάλληλα είναι για τις εργασίες σας στο περιβάλλον σας και τι θα πρέπει να θυσιάσετε όταν τα χρησιμοποιείτε. Η συμπίεση σελίδας δίσκου έχει σχεδιαστεί για να συμπιέζει τον κύριο χώρο αποθήκευσης και μπορεί να δώσει μια μέση αναλογία συμπίεσης. Η συμπίεση στιγμιότυπου σελίδας WAL θα δώσει έναν μέσο βαθμό συμπίεσης για τα αρχεία WAL και πιθανότατα θα βελτιώσει ακόμη και την απόδοση. Η συμπίεση WAL δεν θα έχει θετική επίδραση στην απόδοση, αλλά θα μειώσει το μέγεθος των αρχείων WAL όσο το δυνατόν περισσότερο, αφαιρώντας τις φυσικές εγγραφές.

Πηγή: www.habr.com

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