Η Cosmos DB είναι ένα high-scalable, reliable και secure infrastructure που μπορεί να χρησιμοποιηθεί για την υλοποίηση των περισσότερων γνωστών και κοινών NoSQL database.
Για να δούμε ποια είναι αυτά:
Key-Value stores
Είναι η απλούστερη μορφή αποθήκευσης δεδομένων καθώς είναι ένας πίνακας δύο διαστάσεων που η μία περιέχει το κλειδί (key) και το οποίο πρέπει να είναι μοναδικό και παρέχει το μόνο τρόπο για να διαβάσουμε τα δεδομένα και η άλλη τις τιμές (values) που έχει ένα κλειδί.
Αρκετές φορές αναφερόμαστε σε αυτόν το key-values store είτε σαν dictionary είτε σαν hash.
Η μορφή που ένα Key-Value store έχει είναι η παρακάτω
Key | Value |
Key1 | Value1 |
Key2 | Value1,Value2 |
Key3 | Value2,Value3 |
... | ... |
Το γεγονός ότι μπορούμε να αποθηκεύσουμε ότι μορφή δεδομένων θέλουμε στα values για κάθε ξεχωριστό key καθιστά το key-value store αρκετά ευέλικτο σε κάποιες περιπτώσεις αλλά και αναποτελεσματικό σε άλλες καθώς χαρακτηριστικά όπως relations, stored procedures, secondary indexes, foreign key που συναντούμε σε relational databases δεν υπάρχουν σε αυτό.
Στα πλεονεκτήματα τους θα καταγράψουμε ότι
- Είναι εύκολο στην κλιμάκωση καθώς είτε έχω λίγες είτε πολλές εγγραφές που θέλω να κάνω insert θα πάρει ακριβώς τον ίδιο χρόνο καθώς δεν περιέχει locks και δεν έχει check constraints.
- Είναι ιδανικό για distributed systems
- Μπορώ να αποθηκεύσω ταυτόχρονα unstructured και structured data.
- Είναι γρήγορα στο read αλλά μόνο στην περίπτωση που γνωρίζω το key αλλιώς γίνεται table scan.
Στα μειονεκτήματα τους θα καταγράψουμε ότι:
- Η έννοια του transaction consistency μεταξύ πολλών entities (rows) δεν παρέχεται.
- Έννοιες όπως relationship για να υλοποιηθούν πρέπει να δημιουργηθούν άλλες δομές.
- Δεν μπορείς εύκολα να κάνεις filtering ή sorting στo values store καιαν θέλεις να κάνεις κάτι τέτοιο τότε είναι σίγουρο το table scan.
- Υπάρχει μόνο ένας index και αυτός είναι το key και αν χρειαστεί να έχουμε και άλλον θα πρέπει να κάνουμε duplicate τα δεδομένα σε άλλη αντίστοιχη δομή.
Azure Table Storage
Η Microsoft στο Microsoft Azure παρέχει το Azure Table storage το οποίο υποστηρίζει την δομή αυτή αλλά με μια διαφορά σε σχέση με τους άλλους vendors καθώς έχουν υλοποιήσει την ιδέα του partitioning και με αυτό κάθε key στο key store γίνεται από ένα partition key και ένα row key και με το συνδυασμό αυτό έχω clustered index στο πίνακα. Επίσης για να ανταποκριθεί στο transaction consistency μεταξύ πολλών entities η Microsoft παρέχει το Entity Group Transactions (EGT) αλλά και αυτό έχει ένα περιορισμό και αυτός είναι ότι δουλεύει μόνο για entities που είναι στο ίδιο partition.
Document databases
Οι Document databases σκοπό έχουν την αποθήκευση δεδομένων με ένα self-describing structure το οποίο μπορεί να περιέχει sub-documents και collections από άλλα documents και συνήθως η μορφή τους είναι σε JSON ή XML.
Στα πλεονεκτήματα τους θα καταγράψουμε ότι:
- Μπορούμε να εκτελέσουμε queries και να έχουμε indexes στο περιεχόμενο των δεδομένων.
- Τα σχετιζόμενα δεδομένα αποθηκεύονται σειριακά τόσο στο δίσκο όσο και στην μνήμη και αυτό δίνει καλύτερη απόδοση.
- Οι εφαρμογές αποθηκεύουν τα αντικείμενα απευθείας στα documents και αυτό σημαίνει ότι δεν χρειάζεται να υπάρχει το παραμικρό ίχνος για mapping που να οδηγεί σε σχέσεις που είναι στο ίδιο partition.
- Υπάρχει η δυνατότητα τόσο για scaling-up όσο και για scaling-down σε πολλαπλούς servers αλλά και devices με χαμηλότερη δυναμικότητα πχ tablets, smartphones.
- Τέλος θα πρέπει να αναφερθεί ότι οι document databases είναι schema-less που σημαίνει ότι δεν χρειάζεται να έχω το οποίο κόστος που έχω στις παραδοσιακές databases σε αλλαγές σχήματος.
Στα μειονεκτήματα τους θα καταγράψουμε ότι:
- Δεν παρέχουν ACID transactions και αυτό σημαίνει πολλά ιδιαίτερα αν έχετε οικονομικής φύσεως εφαρμογές πχ τράπεζες.
- Όταν έχετε δεδομένα που είναι structured οι παραδοσιακές databases είναι ασυζητητί καλύτερες σε απόδοση.
- Σε ΒΙ & Analytics σενάρια θα πρέπει να καταλάβουμε ότι αυτά εκτελούν ad-hoc aggregated queries που διαβάζουν μεγάλο όγκο δεδομένων και είναι αρκετά δύσκολο τέτοιου είδους queries να εκτελεστούν σε document databases.
Columnar databases
Οι columnar databases έχουν το βασικό χαρακτηριστικό που ονομάζετε column family και το οποίο είναι και αυτό που τις διαφοροποιεί από τις άλλες NoSQL databases.
Ένα column family είναι ένα collection από columns που είναι στην ουσία τα δεδομένα κάθε entity(row). Μπορείτε να το παρομοιάσετε με ένα πίνακα σε μια relational databases αλλά με μια βασική διαφορά και αυτή είναι ότι κάθε entity(row) δεν είναι απαραίτητο να έχει τον ίδιο αριθμό από columns. Στην πραγματικότητα ένα column family είναι ένα name/value pair map.
Στα πλεονεκτήματα τους θα καταγράψουμε ότι:
- Δεν καταναλώνουν χώρο για τα δεδομένα που δεν χρειάζονται σε μια γραμμή όπως δηλαδή γίνεται όταν έχουμε ένα πεδίο σε ένα πίνακα και του έχουμε ορίσει να δέχεται null.
- Στις περισσότερες υλοποιήσεις κάθε column family είναι και διαφορετικό αρχείο και σε κάποιες είναι και σε διαφορετικό δίσκο ή και server. Αυτό έχει σαν αποτέλεσμα καλύτερο performance
Στα μειονεκτήματα τους θα καταγράψουμε ότι:
- Όλες οι columnar databases σχεδιάζονται με βάση τα queries που θα γίνουν και για αυτό θα πρέπει να έχουμε μια ιδέα για αυτά καθώς δεν είναι ότι καλύτερο για ad-hoc reporting queries.
Graph databases
Η κεντρική ιδέα πίσω αυτές είναι ότι τα data έχουν relations με άλλα data που έχουμε στα RDBMS αλλά όχι μόνο με το γνωστό PK-FK constraint αλλά με ένα πολλαπλό τρόπο που φυσικά είναι οριζόμενος με metadata και που μπορεί να συνδέσεις διαφόρους τύπους δεδομένων σε ένα πιο ελαστικό referential integrity καθώς από την μία έχω τα vertices που είναι τα objects πχ person, product και από την άλλη έχω τα edges που είναι η σύνδεση μεταξύ των vertices.
Εξαιτίας αυτή της ευελιξίας καθώς προσφέρουν την δυνατότητα να έχεις queries με λιγότερα joins και φυσικά σε πολλές περιπτώσεις καλύτερο performance έτυχαν ευρείας αποδοχής από τις social media platforms
Στα πλεονεκτήματα τους θα καταγράψουμε ότι:
- Βασικός τους σκοπός είναι να ικανοποιήσουν σχέσεις Μ:Ν και το κάνουν πολύ καλά
Στα μειονεκτήματα τους θα καταγράψουμε ότι:
- Είναι φτωχές σε aggregated queries και για αυτό το λόγο είναι παντελώς άχρηστες σε BI projects.
- Είναι αρκετά περίπλοκο στο να έχεις versioning & auditing στα δεδομένα σου σε αυτές.
Cosmos DB
Έχοντας όλα αυτά σαν βάση και χρησιμοποιώντας όλα όσα έμαθε από την δημιουργία της Document DB η Microsoft υλοποίησε την Cosmos DB, μια multi-model global distributed No-SQL-bases database.
Βασικό της χαρακτηριστικό είναι ότι είναι global distributed παρόλα αυτά όμως έχει χαρακτηριστικά που δεν έχουν οι άλλοι vendors όπως το ότι κάνει αυτόματα indexes για όλα τα δεδομένα στα αποθηκευμένα documents.
Consistency Levels
Εκτός όμως από αυτά έχει δυνατότητες οριζόντιας κλιμάκωσης και το σημαντικότερο είναι ότι παρέχει consistency σε πολλαπλά επίπεδα με τις εξής επιλογές:
- Strong - Όλα τα writes εμφανίζονται στους clients μόνο εφόσον έχει επιβεβαιωθεί ότι έχουν γραφτεί με επιτυχία σε όλες τις replicas, αν και θα πρέπει να επισημάνω ότι αυτό δεν είναι διαθέσιμο ακόμα για multiple global regions.
- Bounded Staleness - Με αυτό ορίζουμε χρονική διάρκεια ή αριθμό από προηγούμενες εκδόσεις στα δεδομένα που θεωρούνται μην consistent.
- Session - Είναι το default option και με αυτό το client session είναι το consistency scope που σημαίνει ότι τα writes που έγιναν από ένα client διαβάζονται από αυτόν.
- Consistent Prefix - Με αυτό τα δεδομένα επιστρέφονται στους clients πάντα με την σειρά που έχουν γίνει οι ενέργειες αλλά σε μην ορισμένο ρητά χρόνο σε όλες τις replicas.
- Eventual - Εδώ έχουμε το χαμηλότερο latency σε read/writes αλλά με κόστος ότι δεν υπάρχει εγγύηση για το consistency.
Cosmos DB APIs
H Microsoft προσφέρει αρκετά APIs που στην ουσία κρύβουν το όποιο data structure χρησιμοποιούμε καθώς για να υλοποιήσουμε key-value store μας δίνει το Azure Table storage API, για Document database την MongoDB ή το δικό της που είχε στην DocumentDB, για graph database δίνει το Apache Gremlin API και για columnar database χρησιμοποιεί το Cassandra API.
Πίσω από την σκηνή η Cosmos DB χρησιμοποιεί το ίδιο storage engine για κάθε API και αυτό σημαίνει πολλά για όλους μας καθώς οι αλλαγές (στην πλειονότητα των περιπτώσεων) που θα χρειαστεί να κάνουμε σε ήδη υπάρχουσες εφαρμογές που χρησιμοποιούν αυτά είναι να αλλάξουμε το connection string και δείχνει στην Cosmos DB.
HTTP Web Service
Αρκετά σημαντικό και πρέπει να αναφερθεί είναι ότι η Cosmos DB είναι ένα web service και αυτό σημαίνει ότι μπορούμε να συνδεθούμε απευθείας στο server κάνοντας HTTP REST requests.
Cosmos DB Hierarchy
H Cosmos DB χρησιμοποιεί ένα σταθερό ιεραρχικό μοντέλο για την αποθήκευση και την επεξεργασία των δεδομένων.
Στο υψηλότερο επίπεδο υπάρχει το Azure Cosmos DB account στο οποίο ο χρήστης μπορεί να προσθέσει databases. Κάθε database μπορεί να έχει πολλούς χρήστες και διαβάθμιση δικαιωμάτων.
Και κάθε database μπορεί να περιέχει συνδυασμούς από collections, documents και attachments.
Κάθε collection μπορεί να έχει stored procedures, triggers, UDFs και κάθε ένα από αυτά έχουμε απευθείας πρόσβαση μέσα από ένα λογικό και σταθερό URΙ και αυτό είναι διαθέσιμο μέσα από ένα high available και efficient TCP protocol.
Κάθε database resources κατηγοριοποιείται σε system ή user-defined. Τα system resources έχουν fixed schema όπως για παράδειγμα τα database accounts, databases, collections, users, permissions. Τα user-defined είναι τα docs και attachments που μπαίνουν στην databases τα οποία δεν έχουν περιορισμούς για το schema τους. Και οι δύο αυτές κατηγορίες resources ορίζονται και διαχειρίζονται μέσα από ένα JSON standard.
Επίσης όλες έχουν ένα αριθμό από κοινά properties και αυτά είναι τα παρακάτω:
- _rid: unique hierarchical identifier generated by the system.
- _etag: generated by the system to enable optimistic concurrency control.
- _ts: last updated timestamp maintained by the system.
- _self: unique addressable URI generated by the system.
- Id: user or system specified unique name for a resource.
//antonch