From 190d3e8f62a1ba0c3e16b407d7eb50433270a4d5 Mon Sep 17 00:00:00 2001 From: Panagiotis_Klironomos Date: Tue, 15 Jun 2021 17:42:16 +0000 Subject: [PATCH] Upload files to '' --- README.adoc | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 README.adoc diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..5b9232a --- /dev/null +++ b/README.adoc @@ -0,0 +1,105 @@ += Data Collector Service - README +Skouris cs161064@uniwa.gr +Klironomos cs151128@uniwa.gr +// Metadata: +:description: Dockerfile instructions +:keywords: Dockerfile +ifndef::env-browser[] +:data-uri: +endif::[] +:toc: right +:toc-title: Table of contents +:toclevels: 4 +:source-highlighter: highlight +:no-header-footer: +:nofooter: +:last-update-label!: +:icons: font +:sectnums: +:url_mongodb: https://en.wikipedia.org/wiki/MongoDB + + + +.Πλέγμα Δικτύου μεταξύ 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 + +**** + + +== Πρώτη Ενότητα + +=== Δημιουργία Δικτύου: + +Για να μπορέσουμε να θέσουμε σε *λειτουργία* τις εικονικές μηχανές αλλά και να τις *διαμορφώσουμε κατάλληλα* έτσι ώστε να *συλλέγουν* και να *μεταφέρουν δεδομένα*, θα χρειαστεί να δημιουργήσουμε ένα *δίκτυο*, πάνω στο οποίο θα γίνουν οι επιθυμητές ενέργειες. + +=== Αυτόματη Εγκατάσταση Προγράμματος Σύλλογης Δεδομένων: + +Για να μπορέσουμε να συλλέξουμε δεδομένα από ένα σύνολο εικονικών μηχανών και να τα στείλουμε σε διάφορα σημεία, θα πρέπει οι εικονικές μηχανές να έχουν *εγκαταστήσει ορισμένα πακέτα* που θα περιέχουν *ειδικά εργαλεία* για την κάθε διαδικασία που επιθυμούμε να εκτελέσουν. + +Χρησιμοποιούμε το *Ansible*, με το οποίο δίνουμε τις διευθύνσεις των εικονικών μηχανών που επιθυμούμε να κάνουν τις απαραίτητες *εγκαταστάσεις πακέτων*, σε ένα αρχείο *Inventory*, καθώς και σε ένα άλλο αρχείο *fluentd.conf.yml* δίνουμε ορισμένα πακέτα που θέλουμε να εγκατασταθούν στις εικονικές μηχανές. + +Για την *συλλογή δεδομένων* θα χρησιμοποιήσουμε ένα *ειδικό εργαλείο*, το οποίο έχει την δυνατότητα να συλλέγει δεδομένα από διάφορες πηγές (π.χ. *system logs*, *apache logs*, *web app / mobile logs*, *IoT Sensors logs* κλπ.) και να τα στέλνει σε διάφορα σημεία που επιθυμούμε (π.χ. *AWS*, *Hadoop*, *Βάσεις Δεδοένων*). + +Το εργαλείο που θα χρησιμοποιήσουμε ονομάζεται *Fluentd* και θα επιχειρήσουμε την συλλογή δεδομένων από αρχεία *logs* αναφορικά με διάφορα *στατιστικά* της εφαρμογής μας, καθώς και από αρχεία που έχουμε *γράψει* μέσα σε αυτά. + +Η αποστολή και αποθήκευση της παραπάνω *συλλογής δεδομένων*, όπως θα δούμε και παρακάτω, θα γίνεται *αρχικά*, σε ένα *αρχείο* μέσα από το οποίο θα μπορούμε να δούμε τι πληροφορίες έχουν συλλεχθεί. Έπειτα, με το κατάλληλο *configuration*, η αποθήκευση των δεδομένων που συλλέχθηκαν θα γίνεται σε ένα *κεντρικό σημείο* και πιο συγκεκριμένα σε μια *Βάση Δεδομένων*. +Για τους σκοπούς του εργαστηρίου, θα χρησιμοποιήσουμε την *MongoDB replica*. + +Στην *Ενότητα 2*, θα γίνει λεπτομερής περιγραφή της αποθήκευσης δεδομένων στην *Βάση Δεδομένων*. + +=== onEvent - Τοπική / Προσωρινή Αποθήκευση Δεδομένων: + +Όπως αναφέρθηκε στην προηγούμενη υποενότητα, με τη βοήθεια του *εργαλέιου Fluentd* θα ορίσουμε *ποιες* εικονκές μηχανές θα συλλέξουν δεδομένα και από *ποια* αρχεία εισόδου για διάβασμα. + +Σε αυτό το σημείο του project, θα ορίσουμε το αρχείο εξόδου στο οποίο θα αποθηκεύονται όλα τα *συμβάντα* σε περίπτωση που υπάρξουν στα αρχεία εισόδου. + + +== Δεύτερη Ενότητα + +=== Δημιουργία Βάσης Δεδομένων: + +Για να μπορέσουμε να στέλνουμε δεδομένα σε μια *Βάση Δεδομένων*, θα χρειαστεί να την δημιουργήσουμε πρώτα. + +Χρησιμοποιώντας το εργαλείο *Mongo* μπορούμε να σηκώσουμε μια *replicated* Βάση Δεδομένων, να ορίσουμε το *username* και το *password* για την πρόσβασή μας σε αυτήν, καθώς και τις πόρτες για την μελλοντική σύνδεση της Βάσης με ένα Websocket, το οποίο θα καλυφθεί στην *Ενότητα 3*. + +=== onEvent - Αποθήκευση Δεδομένων στην Βάση: + +Αφότου δοκιμάσουμε την αποθήκευση των δεδομένων σε ένα αρχείο εξόδου, μπορούμε έπειτα με την κατάλληλη *διαμόρφωση* στα *configuration* αρχεία του εργαλείου *Fluentd*, να ορίσουμε πλεόν ως έξοδο για αποθήκευση δεδομένων την Βάση Δεδομένων, την οποία δημιουργήσαμε μόλις. + +== Τρίτη Ενότητα + +=== Δημιουργία Websocket: + +Για να μπορέσουμε να έχουμε*άμεση* μεταφορά των δεδομένων, θα χρειαστεί να ενεργοποιήσουμε *Server*, καθώς και την Τεχνολογία των *Sockets*, έτσι ώστε να έχουμε την δυνατότητα να ζητάμε κάποια δεδομένα από τον Server (ως Clients) και να παίρνουμε το αποτέλεσμα. + +Αυτό επιτυγχάνεται με την δημιουργία ενός *Websocket*, το οποίο το θέτουμε σε λειτουργία μέσω *Web Browser* αφότου το προγραμματίσουμε κατάλληλα για την *πόρτα* στην οποία θα "ακούει" η σύνδεση. + +Για τους σκοπούς του project, θα χρησιμοποιηθεί η Υπηρεσία *RESTful API* μέσω του Πρωτοκόλλου *REST*, για την επιχείρηση σύνδεσης ενός (ή περισσότερων) Client με έναν Server σε μια συγκεκριμένη *διεύθυνση* και σε μια συγκεκριμένη *πόρτα*. + +=== Σύνδεση Websocket και Βασικών Υπηρεσιών: + +Για να μπορέσουμε να μεταφέρουμε δεδομένα μέσω ενός Websocket, η μια λύση είναι να επιχειρήσουμε την σύνδεση του Websocket που δημιουργήσαμε προηγουμένως, με τις *βασικές υπηρεσίες* που δημιουργήσαμε στην *Ενότητα 1*, μέσω ορίσματος κατάλληλων *ports*. + +=== Σύνδεση Websocket και Βάσης Δεδομένων: + +Μια άλλη λύση για την μεταφορά δεδομένων μέσω ενός Websocket, είναι να επιχειρήσουμε την σύνδεση του Websocket που δημιουργήσαμε προηγουμένως, με την *Βάση Δεδομένων* που δημιουργήσαμε στην *Ενότητα 2*, μέσω ορίσματος κατάλληλων *ports*.