Ιωάννης Κωνσταντίνου
Φτιάχτηκε στο Facebook Αποθήκευε το Inbox μέχρι το 2010 (μετά γυρίσανε σε Hbase) Ο κώδικας ανοίχτηκε το 2008 Java Top Level Apache Project Συγγραφείς: Avinash Lakshman, Prashant Malik Lakshman → Επιρροές από Dynamo
Row store Απόλυτα κατανεμημένο Μοντέλο δεδομένων: παρόμοιο με ΒΔ Όχι όμως πλήρες σχεσιακό μοντέλο Υψηλή αντοχή σε αποτυχίες Μεγάλη κλιμακωσιμότητα (δεδομένων, όχι κόμβων)
Symmetric ◦ No single point of failure ◦ Linearly scalable ◦ Ease of administration Flexible partitioning, replica placement Automated provisioning High availability (eventual consistency) 4
BigTable ◦ Strong consistency ◦ Sparse map data model ◦ GFS, Chubby, et al Dynamo ◦ O(1) distributed hash table (DHT) ◦ BASE (aka eventual consistency) ◦ Client tunable consistency/availability 5
Consistent Hashing ◦ Routing, Load balancing, Replica placement Vector Clocks ◦ Concurrent updates Gossip Protocol Hinted Handoffs ◦ Failure detection/recovery 6
7
Οργάνωση δεδομένων σε κελιά/στήλες και API για ανάγνωση/εγγραφή 8
Όπως του BigTable Μονάδα δεδομένων: στήλη (Column) Περιέχονται σε Οικογένεις στηλών (Column Families) – αντίστοιχο των πινάκων των ΣΒΔ Μπορούν να είναι και Υπερ-στήλες (περιέχουν άλλες στήλες μέσα) namevaluetimestamp
Οικογένειες στηλών: Περιέχουν στήλες Δυναμικές – δεν έχουν προκαθορισμένες στήλες Αραιές – αποθηκεύονται μόνο όσες στήλες υπάρχουν σε κάθε σειρά Ταξινόμηση στηλών: ως αριθμοί, ως αλφαριθμητικά κ.ο.κ. «Περιέχονται» μέσα στο πεδίο κλειδιών (keyspace)
Πεδίο κλειδιών – αντίστοιχο της ΒΔ, περιέχει ΟΣ (πίνακες), που περιέχουν Στήλες (τιμές) Κάθε κλειδί → μια σειρά από Στήλες σε διάφορες ΟΣ key CF1 column CF2
tom People CF “name”:“Tom”“job”:“serf”“height”:“average” “name”:“Dick”“breed”:“poodle” Dogs CFkey dick“name”:“Dick”“job”:“IT”“weight”:“heavy” harry“name”:“Harry”“job”:“OBG”“pay”:“2000” rex “name”:“Rex” “breed”:“German shepherd”
Απλό API, που θυμίζει DHT: insert (keyspace, key, rowMutation) εισαγωγή τιμής get (keyspace, key, columnName) ανάκτηση τιμής delete (keyspace, key, columnName) διαγραφή τιμής Αιτήσεις γίνονται σε οποιοδήποτε κόμβο (που ονομάζεται συντονιστής) Μαζεύει τα αποτελέσματα και τα στέλνει στον πελάτη
Η υλοποίηση της Cassandra έχει προσθέσει λειτουργίες Range queries – και σε επίπεδο κλειδιών και σε επίπεδο στηλών list get_range_slices(column_parent, predicate, range, consistency_level) Multiget – λήψη δεδομένων από πολλές σειρές, όχι συνεχόμενες Ευρετήρια και select list get_indexed_slices(column_parent, index_clause, predicate, consistency_level) Προσθήκη/αφαίρεση ΟΣ
get(): retrieve by column name multiget(): by column name for a set of keys get slice(): by column name, or a range of names ◦ returning columns ◦ returning super columns multiget slice(): a subset of columns for a set of keys get count: number of columns or sub-columns get range slice(): subset of columns for a range of keys 15
Consistent hashing, distributed hash table – like routing and replication and load balancing 16
17
Χωρισμός του πεδίου κλειδιών σε κόμβους Κάθε κόμβος: αναγνωριστικό Υπεύθυνος: ο διάδοχος ενός κλειδιού Δύο επιλογές: RandomPartitioner OrderPreservingPartitioner
RandomPartitioner Αναγνωριστικό από Consistent Hash Function Ισοκατανομή φόρτου OrderPreservingPartitioner Αναγνωριστικό: string Εξυπηρέτηση ερωτημάτων διαστήματος Ωστόσο, κακή κατανομή φόρτου Λύνεται με διάφορους τρόπους: Επιλογή σημείου εισαγωγής Χειροκίνητα Διαχωρισμό δεδομένων που χρειάζονται OP
20
21
22
23
Distributed Hash Table (Peer to Peer) Routing tables Getting B with 3 hops
25
26
insert(): add/update column (by key) batch insert(): add/update multiple columns (by key) remove(): remove a column batch mutate(): like batch insert() but can also delete (new for 0.6, deprecates batch insert()) Remove key range RSN 27
tomΣτήλες… dick Στήλες … harry Στήλες … rex Στήλες … ID κόμβου: “door” ID κόμβου: “wide” People CFkeyDogs CF Κάθε κόμβος αποθηκεύει όλες τις Στήλες που σχετίζονται με μια σειρά από κλειδιά sid Στήλες … Μια νέα σειρά θα αποθηκευθεί στον κατάλληλο κόμβο
Όλα γράφονται αρχικά στη μνήμη, ως ένα κατώφλι Όταν ξεπεραστεί, dump στο δίσκο σε μορφή SSTable Για κάθε Οικογένεια στηλών: Bloom Filter Index Data Ταξινομημένα κατά κλειδί Όταν τα SSTables ξεπεράσουν ένα πλήθος, συγχωνεύονται Όλα γράφονται πρώτα σε ένα commit log
Διατηρούνται Ν αντίγραφα Διάφορες στρατηγικές τοποθέτησης: SimpleSnitch Default N-1 successive nodes RackInferringSnitch Infers DC/rack from IP PropertyFileSnitch Configured w/ a properties file Την αντιγραφή αναλαμβάνει ο συντονιστής Κάθε κόμβος ξέρει την τοποθεσία των αντιγράφων οποιωνδήποτε δεδομένων
Rack unaware: απλή επιλογή των N-1 διαδόχων Rack/DC aware: Τοποθέτηση του πρώτου αντιγράφου σε άλλο Rack/DataCenter Άλλο ένα στο δικό μας DataCenter σε άλλο Rack Είναι επεκτάσιμη – οποιαδήποτε υλοποίηση (υπάρχει και μία με ορισμό τοπολογίας σε αρχείο)
Vector clocks και ρυθμιζόμενο επίπεδο συνέπειας 32
Εγγραφή: Αίτηση σε οποιοδήποτε κόμβο (coordinator) Γράφει το νέο δεδομένο στο commit log Ο Διαμοιραστής (Partitioner) καθορίζει σε ποιον κόμβο θα πάει το αντικείμενο και τα αντίγραφά του Οι κόμβοι το λαμβάνουν, το γράφουν σε MemTable (πίνακας στη μνήμη) Εάν χρειαστεί, κάνουν εξαγωγή σε SSTable (πίνακας στο δίσκο) Εάν κόμβος πεσμένος, Hinted Handoff
Ανάγνωση: Αίτηση σε οποιονδήποτε κόμβο (coordinator) Ο Διαμοιραστής επιστρέφει τους κόμβους όπου υπάρχει το αντικείμενο ή αντίγραφό του Αιτήσεις για αριθμό αντιγράφων ανάλογα με το Consistency level (βλ. παρακάτω) Read repair: εάν λήφθηκαν «μπαγιάτικες» (stale) απαντήσεις, ο κόμβος τους στέλνει την τελευταία έκδοση του δεδομένου
LevelBehavior ANYWritten to at least 1 node(including HH) ONE1 replica’s commit log and memory table QUORUMN/2+1 replicas LOCAL_QUORUMN/2+1 replicas within local D.C.(only with cross D.C. strategy) EACH_QUORUMN/2+1 replicas each D.C.(only with cross D.C. strategy) ALLWritten to all replicas
LevelBehavior ANYNot supported ONEReturns record returned by first replica to respond QUORUMReturns record with most recent timestamp once at least N/2+1 replicas reported. LOCAL_QUORUMReturns record with most recent timestamp once at least N/2+1 replicas reported within local D.C. EACH_QUORUMReturns record with most recent timestamp once at least N/2+1 replicas reported within each D.C. ALLReturns record with most recent timestamp once all replicas have responded.
Lamport clocks με παραπάνω counters Initially all clocks are zero. Each time a process experiences an internal event, it increments its own logical clock in the vector by one. Each time a process prepares to send a message, it increments its own logical clock in the vector by one and then sends its entire vector along with the message being sent. Each time a process receives a message, it increments its own logical clock in the vector by one and updates each element in its vector by taking the maximum of the value in its own vector clock and the value in the vector in the received message (for every element). 38
39
40
Vector Clocks ◦ Lamport clocks με παραπάνω counters 41
42
dra dra Lakshman, A. and Malik, P. Cassandra - A Decentralized Structured Storage System. in ACM SIGOPS Operating Systems Review 2010 rs/lakshman-ladis2009.pdf rs/lakshman-ladis2009.pdf
tem) tem) Giuseppe de Candia et al. Dynamo: amazon’s highly available key-value store. In SIGOPS, pp 205–220. ACM, dynamo-sosp2007.pdf dynamo-sosp2007.pdf Distributed Hash Tables και Consistent hashing Balakrishnan, H. and Kaashoek, M.F. and Karger, D. and Morris, R. and Stoica, I. Looking up data in P2P systems in Communications of the ACM, 2003 balakrishnan.pdf balakrishnan.pdf Vector Clocks