Το έργο Dragonfly αναπτύσσει μια ταχύτερη αντικατάσταση των Redis και Memcached

Η πρώτη έκδοση του συστήματος προσωρινής αποθήκευσης σε μνήμη Dragonfly είναι διαθέσιμη, που παρέχει υποστήριξη για τα πρωτόκολλα Memcached και Redis, αλλά επιτρέπει την εκτέλεση ερωτημάτων με πολύ υψηλότερη απόδοση και λιγότερη κατανάλωση μνήμης. Το σύστημα χειρίζεται δεδομένα σε μορφή κλειδιού/τιμής και μπορεί να χρησιμοποιηθεί ως μια ελαφριά λύση για την επιτάχυνση της εργασίας ιστότοπων υψηλού φορτίου, αποθηκεύοντας αργά ερωτήματα στο DBMS και ενδιάμεσα δεδομένα στη μνήμη RAM. Ο κώδικας Dragonfly είναι γραμμένος σε C/C++ και διανέμεται υπό την άδεια BSL (Business Source License).

Η άδεια BSL προτάθηκε από τους συνιδρυτές της MySQL ως εναλλακτική λύση στο μοντέλο Open Core. Η ουσία του BSL είναι ότι ο κώδικας προηγμένης λειτουργικότητας είναι αρχικά διαθέσιμος για τροποποίηση, αλλά για κάποιο χρονικό διάστημα μπορεί να χρησιμοποιηθεί δωρεάν μόνο εάν πληρούνται πρόσθετες προϋποθέσεις, οι οποίες απαιτούν την αγορά μιας εμπορικής άδειας για παράκαμψη. Οι πρόσθετοι όροι άδειας του έργου Dragonfly απαιτούν τη μεταφορά του κωδικού στην άδεια Apache 2.0 μόνο την 1η Ιουνίου 2027. Μέχρι αυτή τη στιγμή, η άδεια επιτρέπει τη χρήση του κώδικα μόνο για τη διασφάλιση της λειτουργίας των υπηρεσιών και των προϊόντων της, αλλά απαγορεύει τη χρήση για τη δημιουργία πληρωμένων υπηρεσιών cloud που λειτουργούν ως πρόσθετο στο Dragonfly.

Σύμφωνα με τους προγραμματιστές και τις επιδεικνυόμενες δοκιμές, το Dragonfly ισχυρίζεται ότι είναι το ταχύτερο σύστημα αποθήκευσης μνήμης. Σε σύγκριση με το Redis, το Dragonfly πέτυχε 25πλάσια αύξηση στην απόδοση και τριπλάσια μείωση στην κατανάλωση μνήμης για τυπικούς φόρτους εργασίας. Ένας διακομιστής Dragonfly μπορεί να επεξεργαστεί εκατομμύρια αιτήματα ανά δευτερόλεπτο, για παράδειγμα, στο περιβάλλον Amazon EC2 c6gn.16xlarge ήταν δυνατό να επιτευχθεί απόδοση 3.8 εκατομμυρίων αιτημάτων ανά δευτερόλεπτο.

Το έργο Dragonfly αναπτύσσει μια ταχύτερη αντικατάσταση των Redis και Memcached

Σε δοκιμές για την αποθήκευση 5 GB δεδομένων, το Dragonfly απαιτούσε 30% λιγότερη μνήμη από το Redis. Κατά τη δημιουργία στιγμιότυπων με την εντολή "bgsave", η κατανάλωση μνήμης αυξάνεται, αλλά σε στιγμές αιχμής παραμένει σχεδόν τρεις φορές μικρότερη από ό,τι στο Redis και η ίδια η λειτουργία εγγραφής στιγμιότυπου είναι πολύ πιο γρήγορη (στη δοκιμή, ένα στιγμιότυπο στο Dragonfly γράφτηκε το 30 δευτερόλεπτα, ενώ ο Redis - σε 42 δευτερόλεπτα).

Το έργο Dragonfly αναπτύσσει μια ταχύτερη αντικατάσταση των Redis και Memcached

Η υψηλή απόδοση επιτυγχάνεται χάρη σε μια αρχιτεκτονική πολλαπλών νημάτων χωρίς κοινή χρήση πόρων (shared-nothing), που σημαίνει ότι σε κάθε νήμα εκχωρείται ένας ξεχωριστός ξεχωριστός επεξεργαστής με το δικό του τμήμα δεδομένων, που λειτουργεί χωρίς mutexes και spin locks. Για να διασφαλιστεί η ατομικότητα κατά την εργασία με πολλά κλειδιά, χρησιμοποιούνται ελαφριές κλειδαριές VLL. Για την αποτελεσματική αποθήκευση πληροφοριών στη μνήμη, χρησιμοποιείται η δομή με το dashtable, η οποία υλοποιεί έναν τύπο κατακερματισμένου πίνακα κατακερματισμού.

Μεταξύ των δυνατοτήτων που είναι διαθέσιμες στην πρώτη έκδοση, σημειώνεται η υποστήριξη για το πρωτόκολλο RESP2 και 130 εντολές Redis, που αντιστοιχεί περίπου στη λειτουργικότητα της έκδοσης Redis 2.8. Επιπλέον, το Dragonfly υποστηρίζει όλες τις εντολές memcached εκτός από το CAS (check-and-set), παρέχει υποστήριξη για ασύγχρονες λειτουργίες για τη δημιουργία στιγμιότυπων, παρέχει προβλέψιμη κατανάλωση μνήμης, παρέχει ενσωματωμένο διερμηνέα Lua 5.4 και υποστηρίζει σύνθετους τύπους δεδομένων, όπως κατακερματισμούς, σύνολα και λίστες (ZSET, HSET, LIST, SETS και STRING).

Μια λειτουργία προσωρινής αποθήκευσης είναι διαθέσιμη ξεχωριστά, η οποία αντικαθιστά αυτόματα τα παλιά δεδομένα με νέα δεδομένα μετά την εξάντληση της ελεύθερης μνήμης. Είναι δυνατό να επισυναφθεί μια διάρκεια ζωής στα δεδομένα κατά την οποία τα δεδομένα θεωρούνται σχετικά. Η κατάσταση αποθήκευσης μπορεί να ξεπλυθεί στο δίσκο στο παρασκήνιο για μελλοντική ανάκτηση μετά την επανεκκίνηση. Για τη διαχείριση του συστήματος, παρέχεται μια κονσόλα HTTP (δεσμεύεται στη θύρα TCP 6379) και ένα API για την επιστροφή μετρήσεων, συμβατό με το Prometheus. Σε μελλοντικές εκδόσεις, σκοπεύουμε να επεκτείνουμε την υποστήριξη για εντολές Redis και να εφαρμόσουμε τη δυνατότητα αναπαραγωγής αποθήκευσης για την παροχή ανοχής σφαλμάτων και εξισορρόπησης φορτίου.

Πηγή: opennet.ru

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