Πλέγμα Δικτύου μεταξύ Services και Microservices

Σκοπός του project, είναι να δημιουργήσουμε ένα "σμήνος" από εικονικές μηχανές (ή αλλιώς nodes ή containers), οι οποίες θα έχουν την δυνατότητα να επικοινωνούν μεταξύ τους με διάφορους τρόπους επικοινωνίας.

Note

Λειτουργικότητα Σμήνους

Σε ένα σμήνος εικονικών μηχανών, υπάρχουν μηχανές που συλλέγουν δεδομένα (συνήθως έχουν τον ρόλο των clients) και μηχανές που "αποκτούν" αυτά τα δεδομένα καθώς στη συνέχεια επικοινωνούν μεταξύ τους για διάφορους σκοπούς (συνήθως έχουν τον ρόλο των servers ή devices). To undertand this better lets look at the picture bellow and imagine that red dots are iot devices that can send and receive and black ones are clients that gather data.

Για το σκοπό του εργαστηρίου, θα χρησιμοποιηθούν τα παρακάτω εργαλεία:

  • Swarmlab

  • Ansible

  • Fluentd

  • MongoDB

  • NodeJS

1. Πρώτη Ενότητα

1.1. Δημιουργία Δικτύου:

Για να μπορέσουμε να θέσουμε σε λειτουργία τις εικονικές μηχανές αλλά και να τις διαμορφώσουμε κατάλληλα έτσι ώστε να συλλέγουν και να μεταφέρουν δεδομένα, θα χρειαστεί να δημιουργήσουμε ένα δίκτυο, πάνω στο οποίο θα γίνουν οι επιθυμητές ενέργειες.

1.2. Αυτόματη Εγκατάσταση Προγράμματος Σύλλογης Δεδομένων:

Για να μπορέσουμε να συλλέξουμε δεδομένα από ένα σύνολο εικονικών μηχανών και να τα στείλουμε σε διάφορα σημεία, θα πρέπει οι εικονικές μηχανές να έχουν εγκαταστήσει ορισμένα πακέτα που θα περιέχουν ειδικά εργαλεία για την κάθε διαδικασία που επιθυμούμε να εκτελέσουν.

Χρησιμοποιούμε το Ansible, με το οποίο δίνουμε τις διευθύνσεις των εικονικών μηχανών που επιθυμούμε να κάνουν τις απαραίτητες εγκαταστάσεις πακέτων, σε ένα αρχείο Inventory, καθώς και σε ένα άλλο αρχείο fluentd.conf.yml δίνουμε ορισμένα πακέτα που θέλουμε να εγκατασταθούν στις εικονικές μηχανές.

Για την συλλογή δεδομένων θα χρησιμοποιήσουμε ένα ειδικό εργαλείο, το οποίο έχει την δυνατότητα να συλλέγει δεδομένα από διάφορες πηγές (π.χ. system logs, apache logs, web app / mobile logs, IoT Sensors logs κλπ.) και να τα στέλνει σε διάφορα σημεία που επιθυμούμε (π.χ. AWS, Hadoop, Βάσεις Δεδοένων).

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

Η αποστολή και αποθήκευση της παραπάνω συλλογής δεδομένων, όπως θα δούμε και παρακάτω, θα γίνεται αρχικά, σε ένα αρχείο μέσα από το οποίο θα μπορούμε να δούμε τι πληροφορίες έχουν συλλεχθεί. Έπειτα, με το κατάλληλο configuration, η αποθήκευση των δεδομένων που συλλέχθηκαν θα γίνεται σε ένα κεντρικό σημείο και πιο συγκεκριμένα σε μια Βάση Δεδομένων. Για τους σκοπούς του εργαστηρίου, θα χρησιμοποιήσουμε την MongoDB replica.

Στην Ενότητα 2, θα γίνει λεπτομερής περιγραφή της αποθήκευσης δεδομένων στην Βάση Δεδομένων.

1.3. onEvent - Τοπική / Προσωρινή Αποθήκευση Δεδομένων:

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

Σε αυτό το σημείο του project, θα ορίσουμε το αρχείο εξόδου στο οποίο θα αποθηκεύονται όλα τα συμβάντα σε περίπτωση που υπάρξουν στα αρχεία εισόδου.

2. Δεύτερη Ενότητα

2.1. Δημιουργία Βάσης Δεδομένων:

Για να μπορέσουμε να στέλνουμε δεδομένα σε μια Βάση Δεδομένων, θα χρειαστεί να την δημιουργήσουμε πρώτα.

Χρησιμοποιώντας το εργαλείο Mongo μπορούμε να σηκώσουμε μια replicated Βάση Δεδομένων, να ορίσουμε το username και το password για την πρόσβασή μας σε αυτήν, καθώς και τις πόρτες για την μελλοντική σύνδεση της Βάσης με ένα Websocket, το οποίο θα καλυφθεί στην Ενότητα 3.

2.2. onEvent - Αποθήκευση Δεδομένων στην Βάση:

Αφότου δοκιμάσουμε την αποθήκευση των δεδομένων σε ένα αρχείο εξόδου, μπορούμε έπειτα με την κατάλληλη διαμόρφωση στα configuration αρχεία του εργαλείου Fluentd, να ορίσουμε πλεόν ως έξοδο για αποθήκευση δεδομένων την Βάση Δεδομένων, την οποία δημιουργήσαμε μόλις.

3. Τρίτη Ενότητα

3.1. Δημιουργία Websocket:

Για να μπορέσουμε να έχουμεάμεση μεταφορά των δεδομένων, θα χρειαστεί να ενεργοποιήσουμε Server, καθώς και την Τεχνολογία των Sockets, έτσι ώστε να έχουμε την δυνατότητα να ζητάμε κάποια δεδομένα από τον Server (ως Clients) και να παίρνουμε το αποτέλεσμα.

Αυτό επιτυγχάνεται με την δημιουργία ενός Websocket, το οποίο το θέτουμε σε λειτουργία μέσω Web Browser αφότου το προγραμματίσουμε κατάλληλα για την πόρτα στην οποία θα "ακούει" η σύνδεση.

Για τους σκοπούς του project, θα χρησιμοποιηθεί η Υπηρεσία RESTful API μέσω του Πρωτοκόλλου REST, για την επιχείρηση σύνδεσης ενός (ή περισσότερων) Client με έναν Server σε μια συγκεκριμένη διεύθυνση και σε μια συγκεκριμένη πόρτα.

3.2. Σύνδεση Websocket και Βασικών Υπηρεσιών:

Για να μπορέσουμε να μεταφέρουμε δεδομένα μέσω ενός Websocket, η μια λύση είναι να επιχειρήσουμε την σύνδεση του Websocket που δημιουργήσαμε προηγουμένως, με τις βασικές υπηρεσίες που δημιουργήσαμε στην Ενότητα 1, μέσω ορίσματος κατάλληλων ports.

3.3. Σύνδεση Websocket και Βάσης Δεδομένων:

Μια άλλη λύση για την μεταφορά δεδομένων μέσω ενός Websocket, είναι να επιχειρήσουμε την σύνδεση του Websocket που δημιουργήσαμε προηγουμένως, με την Βάση Δεδομένων που δημιουργήσαμε στην Ενότητα 2, μέσω ορίσματος κατάλληλων ports.