Προγραμματισμός

Αναθεώρηση YugaByte: Cassandra και Redis σε κλίμακα πλανήτη

Κατά τη διάρκεια των δεκαετιών μου ως προγραμματιστής εφαρμογών βάσεων δεδομένων, δεν φαντάστηκα ποτέ στα πιο τρελά μου όνειρα ότι θα έχω πρόσβαση σε μια συναλλαγή, κατανεμημένης βάσης δεδομένων σε πλανήτη, πολύ λιγότερο που θα συγκρίναμε πολλά από αυτά. Αλλά με τα Google Cloud Spanner, CockroachDB, Azure Cosmos DB, Neo4j Enterprise και πιο πρόσφατα το YugaByte DB όλα διαθέσιμα στην παραγωγή, αυτό το μοναδικό όνειρο σωλήνων είναι τώρα αρκετά πραγματικό.

Σε γενικές γραμμές, το Google Cloud Spanner προσφέρει μια επεκτάσιμη, κατανεμημένη, πολύ σταθερή βάση δεδομένων SQL ως υπηρεσία που μπορεί να χειριστεί περίπου 2.000 εγγραφές ανά δευτερόλεπτο και 10.000 αναγνώσεις ανά δευτερόλεπτο, ανά κόμβο, με διάμεσο λανθάνοντα χρόνο περίπου πέντε χιλιοστά του δευτερολέπτου. Για να επιταχύνετε τις αναγνώσεις που δεν χρειάζονται απολύτως ενημερωμένα δεδομένα, μπορείτε να ζητήσετε από το Spanner τις παλιές αναγνώσεις, καθώς υποστηρίζει ερωτήματα ταξιδιού χρόνου. Το Spanner χρησιμοποιεί μια διάλεκτο SQL της Google και εκτελείται μόνο στο Google Cloud Platform.

Το CockroachDB είναι μια βάση δεδομένων SQL ανοιχτού κώδικα τύπου Spanner που υποστηρίζει το πρωτόκολλο PostgreSQL και τη διάλεκτο PostgreSQL SQL. Το CockroachDB είναι χτισμένο πάνω από το RocksDB, ένα κατάστημα συναλλαγών ανοιχτού κώδικα και σταθερού κλειδιού-τιμής. Όπως το Spanner, υποστηρίζει ερωτήματα ταξιδιού στο χρόνο. Το CockroachDB μπορεί να εκτελεστεί σε οποιοδήποτε cloud, σε κοντέινερ Docker με ή χωρίς ενορχήστρωση, ή σε διακομιστές Linux ή VM. Η εταιρική έκδοση του CockroachDB προσθέτει γεω-διαχωρισμό, έλεγχο πρόσβασης βάσει ρόλου και υποστήριξη.

Το Azure Cosmos DB είναι μια παγκόσμια κατανεμημένη, οριζόντια διαμερισμένη, πολυδιάστατη βάση δεδομένων ως υπηρεσία. Προσφέρει τέσσερα μοντέλα δεδομένων (τιμή-κλειδί, οικογένεια στηλών, έγγραφο και γράφημα) και πέντε ρυθμιζόμενα επίπεδα συνέπειας (ισχυρή, οριοθετημένη στασιμότητα, περίοδος σύνδεσης, συνεπές πρόθεμα και τελικά). Προσφέρει πέντε σύνολα API: SQL (διάλεκτο), συμβατό με MongoDB, συμβατό με Azure Table, γράφημα (Gremlin) και συμβατό με Apache Cassandra. Τρέχει μόνο στο σύννεφο Microsoft Azure.

Το Neo4j είναι μια επεκτάσιμη και διατηρήσιμη βάση δεδομένων γραφημάτων που χρησιμοποιεί τη γλώσσα ερωτήματος Cypher. Μπορείτε να εγκαταστήσετε την έκδοση ανοιχτού κώδικα, χωρίς σύμπλεγμα σε Windows, MacOS και Linux, σε κοντέινερ Docker και σε VM. Το Neo4j Enterprise υποστηρίζει υψηλής διαθεσιμότητας και αιτιώδεις ομάδες. Οι αιτιώδεις συστάδες επιτρέπουν ασύγχρονα ενημερωμένα σύμπλεγμα αντιγράφων ανάγνωσης, επιτρέποντας υψηλή απόδοση για γεωγραφικά κατανεμημένες αναπτύξεις.

Εισαγάγετε το Yugabyte DB

Το YugaByte DB, το αντικείμενο αυτής της κριτικής, είναι μια βάση δεδομένων ανοιχτής πηγής, συναλλαγών, υψηλής απόδοσης για εφαρμογές πλανητικής κλίμακας που υποστηρίζει τρία σύνολα API: YCQL, συμβατή με το Apache Cassandra Query Language (CQL). YEDIS, συμβατό με το Redis. και PostgreSQL (επί του παρόντος ελλιπής και σε beta). Το YugaWare είναι το επίπεδο ενορχήστρωσης για το YugaByte DB Enterprise Edition. Το YugaWare κάνει γρήγορη δουλειά για την περιστροφή και καταστροφή των κατανεμημένων συμπλεγμάτων στις Υπηρεσίες Ιστού Amazon, το Google Cloud Platform και το Microsoft Azure (το τέταρτο τρίμηνο του 2018). Το YugaByte DB εφαρμόζει έλεγχο ταυτόχρονων πολλαπλών εκδόσεων (MVCC), αλλά δεν υποστηρίζει ακόμη ερωτήματα ταξιδιού χρόνου.

Το YugaByte DB είναι χτισμένο πάνω από ένα βελτιωμένο πιρούνι του χώρου αποθήκευσης κλειδιών-τιμών RocksDB. Το YugaByte DB 1.0 στάλθηκε τον Μάιο του 2018.

Δύο από τις βασικές τεχνολογίες που χρησιμοποιούνται για να καταστήσουν συνεπείς και γρήγορες τις κατανεμημένες βάσεις δεδομένων συναλλαγών είναι οι αλγόριθμοι συναίνεσης συμπλέγματος και ο συγχρονισμός ρολογιών κόμβων. Το Google Cloud Spanner και το Azure Cosmos DB χρησιμοποιούν και τα δύο τον αλγόριθμο συναίνεσης Paxos που προτείνει η Leslie Lamport. Οι CockroachDB και YugaByte DB χρησιμοποιούν τον αλγόριθμο συναίνεσης Raft που πρότειναν οι Diego Ongaro και John Ousterhout.

Το Google Cloud Spanner χρησιμοποιεί το ιδιόκτητο API TrueTime της Google, βασισμένο σε GPS και ατομικά ρολόγια. Οι Azure Cosmos DB, CockroachDB και YugaByte DB χρησιμοποιούν χρονικές σημάνσεις υβριδικού λογικού ρολογιού (HLC) και συγχρονισμό ρολογιού πρωτοκόλλου ώρας δικτύου (NTP).

Στόχοι σχεδιασμού YugaByte

Οι ιδρυτές των YugaByte - Kannan Muthukkaruppan, Karthik Ranganathan και Mikhail Bautin - ήταν οι Committers Apache HBase, πρώτοι μηχανικοί στο Apache Cassandra και οι κατασκευαστές της πλατφόρμας NoSQL του Facebook (που τροφοδοτείται από το Apache HBase). Ο στόχος τους για το YugaByte DB ήταν ένας διακομιστής κατανεμημένης βάσης δεδομένων φιλοσοφικά ανάμεσα στο Azure Cosmos DB και το Google Cloud Spanner. Δηλαδή, ήθελαν να συνδυάσουν τα χαρακτηριστικά πολλαπλών μοντέλων και υψηλής απόδοσης του Cosmos DB με τις συναλλαγές ACID και την παγκόσμια συνέπεια του Spanner. Ένας άλλος τρόπος για να περιγράψουν τον στόχο τους είναι ότι ήθελαν το YugaByte DB να είναι συναλλαγή, υψηλή απόδοση και πλανητική κλίμακα, ταυτόχρονα.

Έσπασαν τη διαδικασία σε πέντε βήματα, καθένα από τα οποία χρειάστηκε περίπου έξι μήνες για να κατασκευαστεί. Το πρώτο βήμα ήταν να δημιουργήσετε μια έντονα συνεπή έκδοση του RocksDB, ενός καταστήματος υψηλής απόδοσης κλειδιού-τιμής γραμμένο στο C ++, προσθέτοντας το πρωτόκολλο συναίνεσης Raft, sharding και load balancing και αφαιρώντας την καταγραφή συναλλαγών, τα backup-point-in-time, και ανάκτηση, η οποία έπρεπε να εφαρμοστεί σε υψηλότερο επίπεδο.

Το επόμενο βήμα ήταν να δημιουργήσετε μια μηχανή αποθήκευσης log-δομημένη, κλειδί-προς-έγγραφο, προσθέτοντας μη πρωτόγονους και ένθετους τύπους, όπως σειρές, χάρτες, συλλογές και JSON. Στη συνέχεια, πρόσθεσαν ένα στρώμα API που μπορεί να συνδεθεί, όπως το Azure Cosmos DB, εφαρμόζοντας συμβατά με Cassandra και Redis API και αναβάλλοντας ένα PostgreSQL συμβατό με SQL API σε μεταγενέστερο στάδιο. Στη συνέχεια ήρθαν εκτεταμένες γλώσσες ερωτημάτων.

Το YugaByte Cloud Query Language (YCQL) επεκτείνει το Cassandra API με υποστήριξη για κατανεμημένες συναλλαγές, έντονα συνεπή δευτερεύοντα ευρετήρια και JSON. Η υπηρεσία λεξικών YugaByte (YEDIS) είναι ένα API συμβατό με Redis με προσθήκες ενσωματωμένης ανθεκτικότητας, αυτόματης θραύσης και γραμμικής επεκτασιμότητας. Το YEDIS προαιρετικά επιτρέπει την ανάγνωση χρονοδιάγραμμα, χαμηλής καθυστέρησης από το πλησιέστερο κέντρο δεδομένων, ενώ οι ισχυρές λειτουργίες εγγραφής διατηρούν την παγκόσμια συνέπεια. Το YEDIS περιλαμβάνει επίσης έναν νέο τύπο δεδομένων χρονοσειρών.

Τέλος, με την έκδοση 1.0, το YugaByte DB Enterprise προσθέτει ένα επίπεδο στην ενορχήστρωση, την ασφάλεια και την παρακολούθηση ανάπτυξης ποιότητας σε πολλές περιοχές και πολλαπλά σύννεφα και αποθηκεύει κατανεμημένα αντίγραφα ασφαλείας σε ένα ρυθμιζόμενο τελικό σημείο όπως το Amazon S3. Η υποστήριξη PostgreSQL παραμένει ελλιπής και σε επίπεδο δοκιμής beta.

Κατανεμημένες συναλλαγές ACID

Με τον κίνδυνο της υπερβολικής απλοποίησης της διαδικασίας, επιτρέψτε μου να συνοψίσω τον τρόπο με τον οποίο η YugaByte εκτελεί κατανεμημένες συναλλαγές ACID. Το ACID (που σημαίνει ατομικότητα, συνέπεια, απομόνωση και ανθεκτικότητα) θεωρείται ως ιδιότητα που περιορίζεται σε βάσεις δεδομένων SQL.

Ας υποθέσουμε ότι υποβάλλετε ένα ερώτημα YCQL που περιέχει ενημερώσεις μέσα σε μια συναλλαγή, για παράδειγμα μια ζεύγη χρεωστικής και πίστωσης που και οι δύο πρέπει να ακυρωθούν εάν κάποιος αποτύχει προκειμένου να διατηρήσει τη συνέπεια μιας οικονομικής βάσης δεδομένων. Το YugaByte DB δέχεται τη συναλλαγή σε έναν διαχειριστή συναλλαγών χωρίς κατάσταση, ένας από τους οποίους εκτελείται σε κάθε κόμβο του συμπλέγματος. Στη συνέχεια, ο διαχειριστής συναλλαγών προσπαθεί να προγραμματίσει τη συναλλαγή στον διακομιστή tablet που κατέχει τα περισσότερα από τα δεδομένα στα οποία έχει πρόσβαση η συναλλαγή, για λόγους απόδοσης.

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

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

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

YCQL, YEDIS και PostgreSQL

Το YugaByte περιλαμβάνει σχεδόν ολοκληρωμένη εφαρμογή του CQL, καθώς και ορισμένες επεκτάσεις. Μία τεράστια βελτίωση σε σχέση με την Κασσάνδρα είναι ότι η YugaByte είναι έντονα συνεπής, ενώ η Κασσάνδρα τελικά είναι συνεπής. Οι άλλες βελτιώσεις είναι για κατανεμημένες συναλλαγές, έντονα συνεπή δευτερεύοντα ευρετήρια και JSON. Το YugaByte ξεπερνά την Cassandra για κάθε λειτουργία εκτός από τις σαρώσεις μικρής εμβέλειας, τουλάχιστον εν μέρει λόγω της ισχυρής συνοχής της, η οποία επιτρέπει μια μόνο ανάγνωση αντί για την απαρτία που απαιτείται στην Κασσάνδρα.

Η Cassandra υποστηρίζει τέσσερις πρωτόγονους τύπους δεδομένων που δεν υποστηρίζονται ακόμη στο YugaByte: ημερομηνία, ώρα, πλειάδα και varint. Το YugaByte έχει επίσης ορισμένους περιορισμούς στις εκφράσεις.

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

Η εφαρμογή PostgreSQL του YugaByte δεν είναι πολύ μακριά. Αυτή τη στιγμή δεν διαθέτει δηλώσεις, εκφράσεις ΕΝΗΜΕΡΩΣΗ και ΔΙΑΓΡΑΦΗ, και η πρόταση SELECT στερείται ρήτρας σύνδεσης.

Εγκατάσταση και δοκιμή YugaByte

Μπορείτε να εγκαταστήσετε το YugaByte DB ανοιχτού κώδικα από τον πηγαίο κώδικα, από tarballs σε MacOS, Centos 7 και Ubuntu 16.04 ή μεταγενέστερη έκδοση και από εικόνες Docker στο Docker ή στο Kubernetes. Στη συνέχεια, μπορείτε να δημιουργήσετε συμπλέγματα και να δοκιμάσετε τα τρία API ερωτημάτων και ορισμένα δείγματα δημιουργών φόρτου εργασίας.

Επέλεξα να εγκαταστήσω το YugaByte DB Enterprise στο Google Cloud Platform. Ενώ υπήρχαν περισσότερα χειροκίνητα βήματα από ό, τι θα ήθελα, μπόρεσα να περάσω από την εγκατάσταση και τις δοκιμές μου σε ένα απόγευμα αφού είχα το κλειδί άδειας χρήσης της Enterprise Edition.

Μόλις η παρουσία YugaWare εκτελούσε μια παρουσία τεσσάρων CPU στο Google Cloud, διαμόρφωσα το Google Cloud Platform ως πάροχο cloud για το σύμπλεγμα βάσης δεδομένων μου.

Στη συνέχεια, δημιούργησα ένα σύμπλεγμα τριών κόμβων με οκτώ CPU παρουσίες στην περιοχή ΗΠΑ-Ανατολική.

Έτρεξα δοκιμές φόρτωσης χρησιμοποιώντας τα API CQL και Redis.

Ήμουν σε θέση να ρωτήσω τα δεδομένα CQL και Redis από τη γραμμή εντολών.

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

YugaByte κόστος

Η τιμή μιας άδειας YugaByte DB Enterprise Edition τριών κόμβων ξεκινά από $ 40K ετησίως. Εκτός από αυτό, πρέπει να λάβετε υπόψη το κόστος των διακομιστών. Για ένα σύμπλεγμα τριών κόμβων στο Google Cloud Platform που χρησιμοποιεί παρουσίες VM οκτώ CPU, το κόστος κυμαίνεται από 800 έως 900 $ το μήνα συν την κυκλοφορία δικτύου, ίσως 11K $ το χρόνο.

Τα δικά μου έξοδα για ένα απόγευμα δοκιμών ήταν 0,38 $ για τις περιπτώσεις και 0,01 $ για έξοδο μεταξύ ζωνών. Η διαγραφή συμπλεγμάτων βάσεων δεδομένων από τη διεπαφή YugaByte DB Enterprise ήταν εύκολη και όταν σταμάτησα την παρουσία VM να εκτελεί τη διεπαφή διαχείρισης και ενορχήστρωσης, δεν συγκέντρωσε πλέον σημαντικές χρεώσεις.

Ταχύτερη, καλύτερη, κατανεμημένη

Συνολικά, το YugaByte DB αποδόθηκε όπως διαφημίστηκε. Σε αυτό το σημείο στην ανάπτυξή του είναι χρήσιμο ως ταχύτερος, καλύτερος, κατανεμημένος Redis και Cassandra. Θα πρέπει τελικά να είναι επίσης μια καλύτερη PostgreSQL, αν και κατά την εμπειρία μου χρειάζεται πολύς χρόνος (χρόνια και όχι μήνες), ειδικά όταν φτάσετε στο σημείο να προσπαθήσετε να συντονίσετε τις σχετικές συνδέσεις.

Το YugaByte DB δεν ανταγωνίζεται ακόμα το Google Cloud Spanner, το CockroachDB ή τη διασύνδεση SQL με το Azure Cosmos DB λόγω έλλειψης διεπαφής SQL. Δεν ανταγωνίζεται ακόμη με το Neo4j ή τη διεπαφή γραφήματος με το Cosmos DB λόγω έλλειψης υποστήριξης βάσης δεδομένων γραφημάτων. Ανταγωνίζεται με το Redis, το Cassandra και το Cassandra συμβατό περιβάλλον εργασίας με το Cosmos DB.

Πρέπει να δοκιμάσετε μόνοι σας το YugaByte DB; Εάν χρειάζεστε μια κατανεμημένη έκδοση του Redis ή της Κασσάνδρας ή εάν πρέπει να αντικαταστήσετε το MongoDB για ένα παγκόσμιο κατανεμημένο σενάριο, τότε ναι. Το YugaByte DB θα μπορούσε επίσης να χρησιμοποιηθεί για την τυποποίηση σε μία μόνο βάση δεδομένων για πολλούς σκοπούς, όπως ο συνδυασμός μιας βάσης δεδομένων Cassandra με το Redis caching, όπως έχει κάνει ο πελάτης της YugaByte Narvar. Το YugaByte DB προσθέτει επίσης δευτερεύοντα ευρετήρια υψηλής απόδοσης και έναν τύπο JSON στην Cassandra, αυξάνοντας τη χρησιμότητά του ως βάση δεδομένων συναλλαγών.

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