= 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*.
