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

Αναθεώρηση CockroachDB: Μια βάση δεδομένων SQL με κλίμακα που δημιουργήθηκε για επιβίωση

Μέχρι πολύ πρόσφατα, όταν αγοράσατε μια βάση δεδομένων έπρεπε να επιλέξετε: Επεκτασιμότητα ή συνέπεια; Οι βάσεις δεδομένων SQL όπως η MySQL εγγυώνται ισχυρή συνοχή, αλλά δεν κλιμακώνονται καλά οριζόντια. (Η χειροκίνητη θραύση για επεκτασιμότητα δεν είναι ιδέα διασκέδασης κανενός.) Οι βάσεις δεδομένων NoSQL όπως η κλίμακα MongoDB όμορφα, αλλά προσφέρουν μόνο τελική συνέπεια. ("Περιμένετε αρκετά και μπορείτε να διαβάσετε τη σωστή απάντηση" - που δεν είναι τρόπος να κάνετε οικονομικές συναλλαγές.)

Το Google Cloud Spanner, μια πλήρως διαχειριζόμενη υπηρεσία σχεσιακών βάσεων δεδομένων που εκτελείται στο Google Compute Engine (GCE) που κυκλοφόρησε τον Φεβρουάριο του 2017, έχει την επεκτασιμότητα των βάσεων δεδομένων NoSQL διατηρώντας παράλληλα τη συμβατότητα SQL, τα σχεσιακά σχήματα, τις συναλλαγές ACID και την ισχυρή εξωτερική συνέπεια. Το Spanner είναι μια θραυσμένη, παγκοσμίως κατανεμημένη και αναπαράσταση σχεσιακή βάση δεδομένων που χρησιμοποιεί έναν αλγόριθμο Paxos για την επίτευξη συναίνεσης μεταξύ των κόμβων του.

Μία εναλλακτική λύση για το Spanner, και το αντικείμενο αυτής της αναθεώρησης, είναι το CockroachDB, μια ανοιχτή πηγή, οριζόντια επεκτάσιμη κατανεμημένη βάση δεδομένων SQL που αναπτύχθηκε από πρώην Googlers που γνώριζαν το Spanner. Η CockroachDB δανείζεται από το Spanner της Google για το σχεδιασμό του συστήματος αποθήκευσης δεδομένων της και χρησιμοποιεί έναν αλγόριθμο Raft για την επίτευξη συναίνεσης μεταξύ των κόμβων του.

Όπως το Cloud Spanner, το CockroachDB είναι μια κατανεμημένη βάση δεδομένων SQL που έχει δημιουργηθεί πάνω από ένα κατάστημα συναλλαγών και κλειδιών-τιμών, στην περίπτωση της CockroachDB στο RocksDB. Οι βασικοί στόχοι σχεδιασμού της CockroachDB είναι η υποστήριξη για συναλλαγές ACID, οριζόντια επεκτασιμότητα και (κυρίως) επιβίωση, εξ ου και το όνομα.

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

Σε αντίθεση με το Cloud Spanner, το οποίο χρησιμοποιεί το TrueTime API που είναι διαθέσιμο για συγχρονισμό χρόνου στα κέντρα δεδομένων Google, το CockroachDB δεν μπορεί να βασίζεται στην παρουσία ατομικών ρολογιών και δορυφορικών ρολογιών GPS για συγχρονισμό του χρόνου με ακρίβεια σε κόμβους και κέντρα δεδομένων. Αυτό έχει πολλές επιπτώσεις. Κατ 'αρχάς, το Google TrueTime δίνει ένα ανώτερο όριο για αντισταθμίσεις ρολογιού μεταξύ κόμβων σε ένα σύμπλεγμα επτά χιλιοστών του δευτερολέπτου. Αυτό είναι αρκετά μικρό που ένας κόμβος Spanner περιμένει μόλις επτά χιλιοστά του δευτερολέπτου μετά από μια εγγραφή πριν αναφέρει ότι μια συναλλαγή έχει δεσμευτεί, για να εξασφαλιστεί εξωτερική συνέπεια.

Χωρίς TrueTime ή παρόμοια εγκατάσταση, το CockroachDB πρέπει να επιστρέψει στο NTP, το οποίο δίνει ανώτατα όρια στο συγχρονισμό του ρολογιού μεταξύ 100 χιλιοστών του δευτερολέπτου και 250 χιλιοστών του δευτερολέπτου. Δεδομένου ότι το μεγαλύτερο χρονικό παράθυρο, το CockroachDB δεν περιμένει μετά την εγγραφή. Αντ 'αυτού ωρες ωρες περιμένει πριν από την ανάγνωση, βασικά επανεκκίνηση μιας συναλλαγής εάν διαβάζει μια τιμή με χρονική σήμανση μεγαλύτερη από την αρχή της συναλλαγής, και πάλι για να εγγυηθεί τη συνέπεια.

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

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

Κάθε κόμβος CockroachDB αποτελείται από πέντε επίπεδα:

  • SQL, που μεταφράζει ερωτήματα SQL πελάτη σε λειτουργίες κλειδιού-τιμής
  • Συναλλαγή, η οποία επιτρέπει ατομικές αλλαγές σε πολλαπλές καταχωρήσεις κλειδιού-τιμής
  • Διανομή, η οποία παρουσιάζει επαναλαμβανόμενα εύρη τιμών-κλειδιών ως μία οντότητα
  • Αναπαραγωγή, η οποία αναπαράγει με συνέπεια και συγχρόνως εύρος τιμών-κλειδιών σε πολλούς κόμβους και επιτρέπει συνεπείς αναγνώσεις μέσω μισθώσεων
  • Αποθήκευση, η οποία γράφει και διαβάζει δεδομένα κλειδιού-τιμής στο δίσκο

Το επίπεδο SQL αναλύει τα ερωτήματα σε ένα αρχείο Yacc και τα μετατρέπει σε μια αφηρημένη σύνταξη. Από το αφηρημένο συντακτικό δέντρο, το CockroachDB δημιουργεί ένα δέντρο από κόμβους σχεδίου, οι οποίοι περιέχουν κώδικα κλειδιού-τιμής. Στη συνέχεια εκτελούνται οι κόμβοι σχεδίου, επικοινωνώντας με το επίπεδο συναλλαγών.

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

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

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

Το επίπεδο αποθήκευσης αποθηκεύει δεδομένα ως ζεύγη τιμών-κλειδιών στο δίσκο χρησιμοποιώντας το RocksDB. Το CockroachDB βασίζεται σε μεγάλο βαθμό στον έλεγχο ταυτόχρονων πολλαπλών εκδόσεων (MVCC) για την επεξεργασία ταυτόχρονων αιτημάτων και την εγγύηση της συνέπειας. Μεγάλο μέρος αυτής της εργασίας γίνεται χρησιμοποιώντας χρονικές σημάνσεις υβριδικού λογικού ρολογιού (HLC).

Όπως το Spanner, το CockroachDB υποστηρίζει ερωτήματα ταξιδιού στο χρόνο (ενεργοποιείται από το MVCC). Αυτά μπορούν να επιστρέψουν στην πιο πρόσφατη συλλογή απορριμμάτων βάσης δεδομένων, που γίνεται από προεπιλογή σε καθημερινή βάση.

Εγκατάσταση και χρήση του CockroachDB

Το CockroachDB εκτελείται σε λειτουργικά συστήματα Mac, Linux και Windows, τουλάχιστον για ανάπτυξη και δοκιμή. Οι βάσεις δεδομένων παραγωγής Cockroach συνήθως εκτελούνται σε Linux VMs ή σε ενορχηστρωμένα κοντέινερ, που φιλοξενούνται συχνά σε δημόσια σύννεφα σε πολλά κέντρα δεδομένων. Το δυαδικό σύστημα Windows του CockroachDB βρίσκεται ακόμη σε φάση beta και δεν συνιστάται για παραγωγή και η Apple δεν κατασκευάζει πλέον υλικό διακομιστή.

Εργαστήρια κατσαρίδων

Όπως μπορείτε να δείτε στο παραπάνω στιγμιότυπο οθόνης, υπάρχουν τέσσερις επιλογές για την εγκατάσταση του CockroachDB σε Mac. Επέλεξα το Homebrew ως το πιο εύκολο από τα τέσσερα.

Παρεμπιπτόντως, το Cockroach Labs δημοσιεύει μια προειδοποίηση στον ιστότοπο που αναφέρει ότι η εκτέλεση μιας ευγενικής εφαρμογής όπως το CockroachDB στο Docker είναι δύσκολη, δεν συνιστάται για ανάπτυξη παραγωγής και για να χρησιμοποιήσετε ένα εργαλείο ενορχήστρωσης όπως το Kubernetes ή το Docker Swarm για να εκτελέσετε ένα σύμπλεγμα. Θα συζητήσω τις επιλογές ενορχήστρωσης κοντέινερ στην επόμενη ενότητα.

Η εγκατάσταση σε Mac είναι τόσο εύκολη όσο ετοιμάζω κατσαρίδα όπως φαίνεται παραπάνω. Στην περίπτωσή μου, η αυτόματη ενημέρωση του Homebrew χρειάστηκε πολύ περισσότερο χρόνο (αρκετός χρόνος για παρασκευή τσαγιού) από την πραγματική εγκατάσταση CockroachDB, η οποία χρειάστηκε μόνο λίγα δευτερόλεπτα.

Μόλις εγκαταστήσετε το CockroachDB, είναι αρκετά εύκολο να δημιουργήσετε ένα τοπικό σύμπλεγμα, αν και υπάρχει το επιπλέον βήμα δημιουργίας πιστοποιητικών ασφαλείας με το πιστοποιητικό κατσαρίδας εντολή εάν θέλετε το σύμπλεγμα να είναι ασφαλές. Μόλις εκτελέσετε ένα σύμπλεγμα (χρησιμοποιώντας το έναρξη κατσαρίδας εντολή μία φορά για κάθε κόμβο, με τους επόμενους κόμβους να είναι συνδεδεμένοι στο σύμπλεγμα του πρώτου κόμβου), μπορείτε να συνδεθείτε στη σελίδα διαχείρισης ιστού σε οποιονδήποτε κόμβο με πρόγραμμα περιήγησης και να χρησιμοποιήσετε το ενσωματωμένο κατσαρίδα sql πελάτη να στείλει ερωτήματα SQL σε οποιονδήποτε κόμβο. Τα περισσότερα προγράμματα περιήγησης θα παραπονεθούν για ιστότοπους με πιστοποιητικά που δημιουργούνται από το CockroachDB, αλλά θα πρέπει να μπορείτε να κάνετε κλικ σε αυτήν την τρομερή προειδοποίηση και να συνεχίσετε στον ιστότοπο.

Οι προτεινόμενες ρυθμίσεις παραγωγής CockroachDB διαφέρουν από τις προεπιλογές, οι οποίες ρυθμίστηκαν για την ανάπτυξη και τις δοκιμαστικές παρουσίες. Μπορείτε να αναπτύξετε ένα σύμπλεγμα ενός κόμβου, εάν το επιθυμείτε. Για παραγωγή, θα πρέπει να έχετε τουλάχιστον τρεις κόμβους, να εκτελέσετε κάθε κόμβο σε ξεχωριστό μηχάνημα, VM ή κοντέινερ και να δώσετε σε κάθε περίπτωση επιπλέον μνήμη cache και SQL. Οι προεπιλεγμένες ρυθμίσεις είναι 128 MB η καθεμία για μνήμη cache και SQL. οι συνιστώμενες ρυθμίσεις παραγωγής είναι να παρέχουν σε κάθε 25 τοις εκατό μνήμης RAM:

έναρξη κατσαρίδας - προσωρινή μνήμη = 25% --max-sql-memory = 25%

Όσο περισσότεροι κόμβοι εκτελείτε, τόσο καλύτερη θα είναι η ανθεκτικότητα. Όσο μεγαλύτεροι και ταχύτεροι είναι οι κόμβοι, τόσο καλύτερη είναι η απόδοση. Αν θέλετε να έχετε κόμβους με απόδοση περίπου συγκρίσιμη με τους κόμβους Google Cloud Spanner, οι οποίοι παρέχουν 2.000 εγγραφές ανά δευτερόλεπτο και 10.000 αναγνώσεις ανά δευτερόλεπτο, τότε θα θέλατε κάτι σαν τις παρουσίες N1-highcpu-8 του GCE, οι οποίες έχουν οκτώ CPU και 8 GB RAM , με τοπικούς δίσκους SSD (αντί για περιστροφή δίσκων).

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

Η Cockroach Labs παρέχει λεπτομερείς οδηγίες για ανάπτυξη σε AWS, Digital Ocean, GCE και Azure. Οι προτεινόμενες διαμορφώσεις χρησιμοποιούν εξισορροπητές φόρτωσης, είτε τις εγγενείς διαχειριζόμενες υπηρεσίες εξισορρόπησης φορτίου είτε εξισορροπητές φορτίου ανοιχτού κώδικα, όπως το HAProxy.

Η ενορχήστρωση μπορεί να μειώσει τη λειτουργική επιβάρυνση ενός συμπλέγματος CockroachDB σε σχεδόν τίποτα. Το Cockroach Labs τεκμηριώνει πώς να το κάνει αυτό για παραγωγή με τους Kubernetes και Docker Swarm. Το αποθετήριο CockroachDB-CloudFormation στο GitHub δείχνει τον τρόπο χρήσης των AWS CloudFormation και Kubernetes σε μία ζώνη διαθεσιμότητας για ανάπτυξη και δοκιμή. Η προσαρμογή αυτού για παραγωγή θα απαιτούσε τροποποίηση του προτύπου CloudFormation για χρήση πολλαπλών ζωνών διαθεσιμότητας.

Προγραμματισμός και δοκιμές CockroachDB

Το CockroachDB υποστηρίζει το σύρμα καλωδίων PostgreSQL, οπότε γράφετε τον κωδικό σας σαν να προγραμματίζετε ενάντια σε Postgres ή τουλάχιστον ένα υποσύνολο Postgres. Σε αυτήν τη σελίδα παρατίθενται τα δοκιμασμένα προγράμματα οδήγησης για διάφορες δεσμεύσεις γλώσσας προγραμματισμού, συμπεριλαμβανομένων των πιο δημοφιλών γλωσσών από τον διακομιστή. Αυτή η σελίδα παραθέτει δείγματα σε 10 γλώσσες προγραμματισμού και πέντε ORM. Δεν αντιμετώπισα μεγάλες εκπλήξεις όταν διάβασα τον κώδικα, αν και εντόπισα μερικά πιθανά μικρά σφάλματα στις λίστες της τεκμηρίωσης. Μπορείτε επίσης να εκτελέσετε το SQL χρησιμοποιώντας το διαδραστικό πρόγραμμα-πελάτη ενσωματωμένο στο κατσαρίδα εκτελέσιμο.

Παρόλο που υπάρχει ένα repo αφιερωμένο στις γεννήτριες φορτίων CockroachDB και ένα άλλο για δοκιμές απόδοσης, η συγκριτική αξιολόγηση των συμπλεγμάτων CockroachDB δεν είναι εύκολη, ειδικά εάν προσπαθείτε να συγκρίνετε το CockroachDB με άλλες βάσεις δεδομένων με ουσιαστικό τρόπο. Ένα ζήτημα είναι ότι το δίκτυο μεταξύ των κόμβων μπορεί να είναι το βήμα περιορισμού του ρυθμού στα συμπλέγματα CockroachDB.

Ένα άλλο γεγονός που πρέπει να ληφθεί υπόψη είναι ότι οι περισσότερες συμβατικές βάσεις δεδομένων SQL δεν εκτελούνται από τη λειτουργία απομόνωσης SERIALIZABLE από προεπιλογή. Αντ 'αυτού χρησιμοποιούν μια λιγότερο αυστηρή λειτουργία με καλύτερη απόδοση. Από προεπιλογή, το CockroachDB χρησιμοποιεί σειριακή δυνατότητα απομόνωσης. Επιπλέον, θα ήταν λίγο άδικο να δοκιμάσετε την απόδοση SQL του CockroachDB, η οποία είναι ακόμα έργο σε εξέλιξη, με τη σουίτα TPC-C.

Ωστόσο, μπορείτε εύκολα να δείτε τη λειτουργική ισχύ του CockroachDB. Για παράδειγμα, πολλές βάσεις δεδομένων πρέπει να σταματήσουν και να επανεκκινήσουν για να τις αναβαθμίσουν. Η προσθήκη κόμβων υπό φόρτωση στο CockroachDB είναι πολύ εύκολο, ειδικά αν χρησιμοποιείτε ένα εργαλείο ενορχήστρωσης. Για παράδειγμα, το παραπάνω στιγμιότυπο οθόνης δείχνει τις εντολές για αλλαγή και εμφάνιση των κόμβων σε ένα σύμπλεγμα Kubernetes και το παρακάτω στιγμιότυπο οθόνης δείχνει το σύμπλεγμα που παρακολουθείται καθώς προστίθενται οι κόμβοι. Ένα εργαλείο δημιουργίας φορτίου εκτελείται συνεχώς καθ 'όλη τη διάρκεια της διαδικασίας.

Μια ακόμη πιο εντυπωσιακή επίδειξη δείχνει την αυτόματη μετανάστευση cross-cloud σε ένα σύμπλεγμα CockroachDB. Χρειάζεται πραγματικά βίντεο για να το κάνει δικαιοσύνη. το βίντεο φιλοξενείται στη συνδεδεμένη ανάρτηση ιστολογίου.

CockroachDB SQL

Το SQL στο CockroachDB είναι περισσότερο ή λιγότερο τυπικό, σε αντίθεση με το SQL στο Cloud Spanner, το οποίο χρησιμοποιεί μη τυπική σύνταξη για χειρισμό δεδομένων. Ωστόσο, το CockroachDB SQL λείπει από πολλές δυνατότητες.

Για παράδειγμα, το V1.1 δεν διαθέτει υποστήριξη JSON, η οποία έχει προγραμματιστεί για το V1.2. Δεν διαθέτει επίσης ανάλυση XML, η οποία δεν βρίσκεται στον χάρτη πορείας. Δεν διαθέτει καταρράκτες επιπέδου σειράς, προγραμματισμένος για το V1.2, και δεν διαθέτει δρομείς και σκανδάλη, οι οποίοι δεν βρίσκονται στον χάρτη πορείας. Τα γεωχωρικά ευρετήρια είναι «πιθανές» προσθήκες που μπορεί να καταστούν στο χάρτη πορείας στο μέλλον.

Πιο συγκεκριμένα, η αρχική εφαρμογή του SQL στο CockroachDB το 2016 ήταν σκόπιμα απλοϊκή και παρουσίασε τετραγωνική κλίμακα, καθιστώντας το άχρηστο για την αναζήτηση μεγάλων συνόλων δεδομένων. Η έκδοση στο V1.0, που έγινε από έναν συνεργάτη μαθητή, εφάρμοσε κατακερματισμούς, κάνοντας πολλές λειτουργίες κλίμακας γραμμικής γραμμής. που πήρε το CockroachDB στο επίπεδο του SQLite. Κάποια στιγμή το 2018, δεδομένου ενός πρόσφατου γύρου χρηματοδότησης, το CockroachDB θα έπρεπε να έχει συμμετάσχει σε απόδοση που κλιμακώνεται περισσότερο όπως οι PostgreSQL συμμετέχουν, καθώς και η SQL join processing που διανέμεται μέσω του συμπλέγματος.