= MongoDB
:nofooter:
:toc: right
:toc-title: Πίνακας περιεχομένων
:toclevels: 5
:sectnums:
:data-uri:
:icons: font

{empty} +

toc::[]

[.text-center]
image:./doc_images/mongodb_logo.png[600,600]

{empty} +

== Τι είναι η MongoDB
[.text-justify]
Η MongoDB ή αλλιώς Humongous Database που είναι το πλήρες όνομα της, 
είναι μία  document-oriented (κειμενοστρεφής) βάση δεδομένων τύπου NoSQL που χρησιμοποιείται για αποθήκευση μεγάλου όγκου δεδομένων. 
Σε αντίθεση με τις κλασσικές σχεσιακές βάσης δεδομένων,
που χρησιμοποιούν Πίνακες (tables)  η MongoDB χρησιμοποιεί συλλογές (collections) και έγγραφα (documents). 
Τα έγγραφα αποτελούνται από ζευγάρια τιμών – κλειδιών (key-values) και αυτά συνθέτουν την βασική μονάδα δεδομένων στην MongoDB.
Οι συλλογές περιέχουν σύνολα εγγράφων και λειτουργιών και είναι η αντιστοίχηση των πινάκων με μία σχεσιακή βάση δεδομένων. 

=== Χαρακτηριστικά
Μερικά από τα κύρια χαρακτηριστικά της είναι τα εξής:
[square]
* Κάθε βάση περιέχει collections που με την σειρά τους περιέχουν documents. 
Τα documents στο ίδιο collection μπορούν να έχουν διαφορετικό αριθμό πεδίων, 
διαφορετικό μέγεθος αλλά και περιεχόμενο μεταξύ τους.
* Τα documents συντάσσονται με την χρήση .json αρχείων και δεν χρειάζεται να έχουν από την αρχή κάποιο καθορισμένο Schema, 
αλλά ο κάθε προγραμματιστής μπορεί να δημιουργήσει τα πεδία που θέλει όταν θα τα χρειαστεί.

== Γιατί MongoDB
Μερικοί από τους λόγους που κάποιος θα έπρεπε να αρχίσει να χρησιμοποιεί την MongoDB είναι οι παρακάτω:

[square]
*  Document-oriented - Αφού η MongoDB είναι μία βάση δεδομένων τύπου NoSQL, και τα δεδομένα δεν αποθηκεύονται 
με σχεσιακό τρόπο αλλά με την χρήση documents της προσφέρει ευελιξία και καλύτερη προσαρμοστικότητα.
* Ad hoc queries – Η MongoDB υποστηρίζει αναζητήσεις σύμφωνα με κάποιο πεδίο, με εύρος τιμών καθώς και με χρήση Regular expression. 
Όλα τα queries  (ερωτήματα) μπορούν να συνταχθούν έτσι ώστε να επιστρέφουν συγκεκριμένα μέσα από τα documents.
* Indexing – Προσφέρει δυνατότητα δημιουργίας ταξινόμησης από οποιοδήποτε πεδίο ενός document βελτιώνοντας σημαντικά την απόδοση 
στις αναζητήσεις.
* Load balancing – Η MongoDB χρησιμοποιεί την μέθοδο του Sharding (κατανομή των δεδομένων σε πολλαπλές μηχανές) για την οριζόντια κλιμάκωση της. 
Η MongoDB μπορεί να λειτουργεί σε πολλαπλά instances εξισορροπώντας το φορτίο και/ή αντιγράφοντας δεδομένα.
* Replication - Το replication είναι ένα απο τα ποιο σημαντικά στοιχεία και γι'αυτό αναλύεται περαιτέρω στην συνέχεια.

=== Replication
[.text-justify]
Η MongoDB σε αντίθεση με την MySQL προσφέρει την δυνατότητα, για αυτόματη ανάκαμψη για την περίπτωση που χαθεί η βάση,
 χωρίς όμως από την άλλη να χρειάζεται ιδιαίτερες γνώσεις για την εγκαθίδρυση του.

==== Mongo replicas
[.text-justify]
Η διαδικασία με την οποία η MongoDB πραγματοποιεί το replication είναι με την δημιουργία το λιγότερο 2 ακόμα MongoDB instances 
(είτε τοπικά είτε μέσω δικτύου),
 σύνδεση των instances μεταξύ τους και ορισμός Primary και Secondaries.
 
[.text-center]
image:./doc_images/Replica-Screenshot.png[375,450]

[.text-justify]
Η πραγματοποίηση αυτής της ομαδοποίησης ονομάζεται Replica set, παρέχει Database redundancy ανάλογο με τον αριθμό των secondary που έχουν προσαρτηθεί στο replica set +

[.text-center]
	total_instances – Primary – 1xSecondary=Number of failbacks can occured

[.text-justify]
==== Elections
Τα instances πραγματοποιούν ένα είδους επικοινωνίας μεταξύ τους, που ονομάζεται Heartbeat. Ένα instance στέλνει ανά δύο δευτερόλεπτα,
 ένα μήνυμα επιβεβαίωσης σε κάθε άλλο instance και εάν δεν πάρει απάντηση μέσα στα επόμενα 10 τότε μαρκάρει το  instance που δεν επέστρεψε
 την απάντηση ως μη διαθέσιμο. Εάν το instance που μαρκαρίστηκε ως μην διαθέσιμο ήταν το Primary τότε ξεκινάει η διαδικασία ανάδειξης
 καινούργιου Primary μέσα από το πλήθος των Secondary. Η διαδικασία ανάδειξης πραγματοποιείται με “εκλογές” μεταξύ των υπολοίπων.
 Τα instance που έχουν δικαίωμα συμμετοχής στις εκλογές είναι τα εξής:
[square]
* Primary
* Secondary
* Startup2
* Recovering
* Arbiter
* Rollback

[.text-center]
image:./doc_images/Election-Screenshot.png[375,450]

[.text-justify]
Κατά την δημιουργία του κάθε instance, έχει αυτομάτως δικαιώματα εκλογής εάν ανήκει σε μία από τις παραπάνω ομάδες.
 Για να είναι επιτυχής οι εκλογές πρέπει ο αριθμός  από τους συμμετέχοντες για είναι μονός για να μην υπάρχει η πιθανότητα ισοψηφίας,
σε διαφορετική περίπτωση είναι αναγκαία η δημιουργία ενός arbiter.
 Ο arbiter δεν αποθηκεύει δεδομένα ούτε δέχεται reads και writes,
 αλλά έχει ως μοναδική  λειτουργία την δυνατότητα ψήφου σε περίπτωση  μονού αριθμού υποψηφίων.
 Σε περίπτωση που υπάρχουν πάνω από 7 τέτοια μέλη τότε μόνο τα 7 με την μεγαλύτερη προτεραιότητα μπορούν να συμμετάσχουν. 


{empty} +
{empty} +
{empty} +

[.text-center]
[big]*To be continued ....* +