You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Panagiotis_Klironomos
ab63eaa28c
|
3 years ago | |
---|---|---|
Configs | 3 years ago | |
Fluentd | 3 years ago | |
README.adoc | 3 years ago |
README.adoc
= 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*.