constantine_karamichalis
5 years ago
5 changed files with 1400 additions and 0 deletions
@ -0,0 +1,122 @@ |
|||
= Εργασία Εξαμήνου |
|||
Καραμιχάλης Κωνσταντίνος , Κυριακάκος Παναγιώτης, Ιωαννίδου Βασιλική |
|||
:nofooter: |
|||
:toc: right |
|||
:toc-title: Πίνακας περιεχομένων |
|||
:toclevels: 4 |
|||
:sectnums: |
|||
:data-uri: |
|||
:icons: font |
|||
:ext-relative: .adoc |
|||
|
|||
{empty} + |
|||
|
|||
toc::[] |
|||
== Σκοπός εργασίας |
|||
[.text-justify] |
|||
Η εργασία που επιλέχθηκε να πργματοποιηθεί στα πλαίσια του εργαστήρίου του μαθήματος Υ.Ν.Υ, ήταν η δημιουργία και η ανάπτυξη μία βάσης δεδομένων τύπου NoSQL, και |
|||
συγκεκριμένα η MongoDB με χρήση των εργαλέιων της πλατφόρμας link:docker{ext-relative}[Docker]. |
|||
|
|||
=== Αρχικοί στόχοι |
|||
[.text-justify] |
|||
Στο ξεκίνημα της ανάλυσης και ανάπτυξης της εργασίας μας θέσαμε αρχικούς στόχους : |
|||
[square] |
|||
* Σχετική εκμάθηση λειτουργίας της link:mongodb{ext-relative}[MongoDB.] |
|||
* Δημιουργία Repica set. |
|||
* Δημιουργία και ανάπτυξη εφαρμογής Minio. |
|||
* Σύνδεση των παραπάνω ώς μία εικονικά ενιαία εφαρμογή για τον τελικό χρήστη. |
|||
|
|||
[.text-center] |
|||
image::./doc_images/mongo_dbs.bmp[950,950] |
|||
|
|||
== Δημιουργία του Docker-compose.yaml |
|||
=== Δημιουργία Δικτύων |
|||
Ξεκινήσαμε με την δημιουργία κατάλληλων δικτυώσεων. |
|||
[square] |
|||
* Ένα δίκτυο για κάθε replica set (1 primary 2 secondary). |
|||
* Ένα δίκτυο που θα βρίσκονται όλα τα primary μαζί. |
|||
|
|||
=== Δημιουργία Container |
|||
[.text-justify] |
|||
Δημιουργήθηκαν 12 container και ποιο συγκεκριμένα 4 Replica Set των 3 container έκαστος. + |
|||
Για κάθε μέλος του Replica Set δόθηκαν οι κατάλλήλες ρυθμίσεις για την προετοιμασία ένταξης του στην ομάδα του. |
|||
|
|||
|
|||
[NOTE] |
|||
[.text-justify] |
|||
*_Το επιθυμητό αποτέλεσμα ήταν να δημιουργηθεί μιά δυναμική εφαρμογή κατα την οποία ο διαχειριστής |
|||
απλά θα επιλέγει τον αριθμό των replica set και όχι το στατικό αποτέλεσμα που καταλήξαμε._* |
|||
|
|||
==== Ονοματοδοσία |
|||
Σε κάθε container δόθηκε ένα μοναδικό όνομα κατάλληλο για την δική μας διευκόλυνση και ευκολία. + |
|||
[square] |
|||
* Primary1 |
|||
* secondary1_1 |
|||
* secondary1_2 |
|||
* Primary2 |
|||
* κοκ. |
|||
|
|||
==== Image |
|||
Ως docker image του κάθε container επιλέχθηκε το official MongoDB image που υπήρχε στο Docker Hub. + |
|||
mongo: |
|||
|
|||
==== Ports |
|||
[.text-justify] |
|||
Σε κάθε container αντιστοιχήθηκε η port 27017 με μία port του εκάστοτε host που έτρεχε και για δική μας ευκολία έγινε πάλι ομαδοποίηση ανά replica set. |
|||
[square] |
|||
* Primary1 = 10001 |
|||
* secondary1_1 = 10002 |
|||
* secondary1_2 = 10003 |
|||
* Primary2 = 20001 |
|||
* κοκ. |
|||
|
|||
==== Volumes |
|||
[.text-justify] |
|||
Δημιουργήθηκε σε όλο το σμήνος που είχαμε ένας φάκελος με τα απαράιτητα αρχεία και έγινε mount σε κάθε container + |
|||
[.text-left] |
|||
./sys_files:/sys_files |
|||
|
|||
==== Networks |
|||
[.text-justify] |
|||
Δόθηκαν οι κατάλληλες ρυθμίσεις για την ένταξη του στο ανάλογο δίκτυο. Έτσι το κάθε primary που γίνεται deploy |
|||
ανήκει σε 2 δίκτυα ( το δίκτυο των Primary και το δίκτυο του Replica set) ενώ τα secondary μόνο στο δίκτυο της Replica που ακήκουν. |
|||
|
|||
primary_network: |
|||
replica_setΧ_network: |
|||
|
|||
==== Παράμετροι Deploy |
|||
Στις παραμέτρους του Deploy χρησιμοποιήσαμε την πολιτική Restart με καθυστέρηση 10 δευτερολέπτων, μέγιστο αριθμό επαναλήψεων 10 και με κενό μεταξύ τους 60 δευτερόλεπτα. + |
|||
|
|||
restart_policy: |
|||
delay: 10s |
|||
max_attempts: 10 |
|||
window: 60s |
|||
|
|||
==== Εντολή έναρξης |
|||
[.text-justify] |
|||
Για εντολή έναρξης της βάσης δοκιμάστην διάφορες επιλογές όπως command, |
|||
Entrypoint, αλλά ενώ κάποιες επιλογές εξυπηρετούσαν τον σκοπό τους ταυτόχρονα δημιουργούσαν πρόβλημα σε κάποιες άλλες. Έτσι καταλληξαμε στην χρήση την εντολής command |
|||
με χρήση ορισμάτων μόνος ως προς την ονοματοδοδία και την ενεργοποίησει του Replica Set |
|||
|
|||
command: ["mongod", "--replSet", "rep-setX"] |
|||
|
|||
== Σύνδεση και ενεργοποίηση Replica Set |
|||
[.text-justify] |
|||
Για την σύνδεση και την ενεργοποίηση των replica set δημιουργήθηκε ένα script το οποίο ελέγχει ένα προς ένα όλα τα container είναι ενεργοποιημένα, |
|||
στην συνέχεια αφού ολοκληρώσει τον πρώτο έλεγχο συνεχίζει ελέγχοντας εάν ήταν επιτυχές το ανέβασμα της διεργασίας Mongod σε κάθε container και τέλος |
|||
εάν δεν συναντήσει κάποιο πρόβλημα στα παραπάνω προχωράει στην σύνδεση των κατάλληλων container για την δημιουργία των Replica set. |
|||
|
|||
[TIP] |
|||
Τα ονόματα των μελών του swarm και οι διευθύνσεις IP που έχουν, τα ονόματα των container, καθώς και μία οπτική αναπαράσταση των δικτύων μπορεί να βρεθεί στον παρακάτω συνδεσμο: + |
|||
[.text-center] |
|||
http://83.212.77.43:5555/[Project Dashboard] |
|||
|
|||
== Μελλοντικοί στόχοι |
|||
[.text-justify] |
|||
Τέλος θα θέλαμε να συμπληρώσουμε ότι λόγο της πίεσης που δημιουργήθηκε απο τις τελευταίες εξελίξεις ως προς την έκβαση αυτού του εξαμήνου δεν ήταν δυνάτο |
|||
να γίνει μία ποιο δομημένη και εμπεριστατωμένη ανάτπυξη της εργάσιας πάρα το μεγάλο ενδιαφέρον που μας προξένησε. |
|||
Θα γίνει προσπάθεια συνέχισης του αλλά και ολοκλήρωσης του ανεξάρτητα του μαθήματος, αλλά και ανεξάρτητα απο το εάν |
|||
θα συνέχιστει η παροχή των υπολογιστικών πόρων απο τον Ωκεανό. |
|||
|
|||
|
|||
|
@ -0,0 +1,44 @@ |
|||
:nofooter: |
|||
:toc: right |
|||
:toc-title: Πίνακας περιεχομένων |
|||
:toclevels: 4 |
|||
:sectnums: |
|||
:data-uri: |
|||
:icons: font |
|||
|
|||
{empty} + |
|||
|
|||
toc::[] |
|||
== Docker Engine ή Docker |
|||
=== Τι είναι το Docker + |
|||
[.text-justify] |
|||
|
|||
To Docker είναι μια πλατφόρμα λογισμικού ανοιχτού κώδικα που υλοποιεί εικονικοποίηση (virtualization) σε επίπεδο λειτουργικού Συστήματος. |
|||
Ουσιαστικά το Docker προσφέρει την δυνατότητα της άμεσης ανάπτυξης εφαρμογών στα Container του χωρίς την ανάγκη εγκατάστασης αυτών στον υπολογιστή μας. Το Docker χρησιμοποιεί στοιχεία από το λειτουργικό σύστημα που είναι εγκατεστημένο. Λειτουργεί ως μία υπηρεσία στον υπολογιστή μας που χρησιμοποιεί πόρους μόνο όταν τους χρειάζεται αρκεί να τρέχει σε λειτουργικό σύστημα Linux. |
|||
Αυτή είναι και μία από τις μεγαλύτερες διαφορές του με μία εικονική μηχανή (virtual machine) που δεσμεύει μόνιμα πόρους ανεξάρτητα από το ποσοστό λειτουργίας της (εικόνα 1). |
|||
Προσφέρει και αυτό πλήρη απομόνωση μεταξύ των εφαρμογών που υπάρχουν στα Container εξασφαλίζοντας έτσι ασφάλεια παρόμοια με αυτή των συμβατικών εικονικών μηχανών. |
|||
|
|||
|
|||
[.text-center] |
|||
image::./doc_images/os-diff.png[374,450] |
|||
|
|||
=== Container |
|||
[.text-justify] |
|||
Το Container είναι είναι ένα πακέτο λογισμικού που προέρχονται από Docker images και σε συνδυασμό με ρυθμίσεις που κάνει ο προγραμματιστής δημιουργείται ένα Container. |
|||
|
|||
=== Docker Images |
|||
[.text-justify] |
|||
Τα Docker images είναι έτοιμα Container ή βάσεις για να δημιουργήσουμε τα δικά μας containers και υπάρχει μεγάλη ποικιλία τους στο διαδίκτυο. Ο επίσημος χώρος αποθήκευσης των Docker images είναι το Docker Hub αλλά υπάρχουν και πολλά άλλα ανεπίσημα, αυτοί οι χώροι αποθήκευσης των images ονομάζονται Docker registries. + |
|||
Όταν ο προγραμματιστής εκτελέσει την εντολή δημιουργίας Container, το Docker θα αναζητήσει το image πρώτα τοπικά στον υπολογιστή που εκτελείται εάν υπάρχει, εάν δεν το βρει θα το αναζητήσει στο registry που έχουμε δηλώσει, το Docker Hub είναι το προκαθορισμένο registry του Docker κατά την εγκατάσταση του. Τέλος αφού βρεθεί με επιτυχία το image που αναζητήθηκε θα το κατεβάσει από το registry στον υπολογιστή μας και θα δημιουργήσει το Container (εικόνα 2). |
|||
|
|||
[.text-center] |
|||
image::./doc_images/small_container_creation2.png[] |
|||
|
|||
Το Docker δίνει την δυνατότητα να κατεβούν από το registry τοπικά στον υπολογιστή images χωρίς την δημιουργία Container (Docker pull), αλλά και να ανεβούν στο registry τροποποιημένα από προγραμματιστές images (Docker push). |
|||
|
|||
{empty} + |
|||
{empty} + |
|||
{empty} + |
|||
|
|||
[.text-center] |
|||
[big]*To be finished ....* + |
File diff suppressed because one or more lines are too long
@ -0,0 +1,103 @@ |
|||
= 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 ....* + |
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue