<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]--> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="generator" content="Asciidoctor 1.5.4"> <meta name="description" content="Dockerfile instructions"> <meta name="keywords" content="Dockerfile"> <meta name="author" content="Skouris cs161064@uniwa.gr"> <title>Data Collector Service - README</title> <link rel="stylesheet" href="https://asciidoclive.com/assets/asciidoctor.js/css/asciidoctor.css"> </head> <body class="article toc2 toc-right"> <div id="header"> <h1>Data Collector Service - README</h1> <div class="details"> <span id="author" class="author">Skouris cs161064@uniwa.gr</span><br> <span id="revdate">Klironomos cs151128@uniwa.gr</span> </div> <div id="toc" class="toc2"> <div id="toctitle">Table of contents</div> <ul class="sectlevel1"> <li><a href="#__">1. Πρώτη Ενότητα</a> <ul class="sectlevel2"> <li><a href="#___2">1.1. Δημιουργία Δικτύου:</a></li> <li><a href="#___3">1.2. Αυτόματη Εγκατάσταση Προγράμματος Σύλλογης Δεδομένων:</a></li> <li><a href="#_onevent">1.3. onEvent - Τοπική / Προσωρινή Αποθήκευση Δεδομένων:</a></li> </ul> </li> <li><a href="#___4">2. Δεύτερη Ενότητα</a> <ul class="sectlevel2"> <li><a href="#___5">2.1. Δημιουργία Βάσης Δεδομένων:</a></li> <li><a href="#_onevent_2">2.2. onEvent - Αποθήκευση Δεδομένων στην Βάση:</a></li> </ul> </li> <li><a href="#___6">3. Τρίτη Ενότητα</a> <ul class="sectlevel2"> <li><a href="#__websocket">3.1. Δημιουργία Websocket:</a></li> <li><a href="#__websocket_2">3.2. Σύνδεση Websocket και Βασικών Υπηρεσιών:</a></li> <li><a href="#__websocket_3">3.3. Σύνδεση Websocket και Βάσης Δεδομένων:</a></li> </ul> </li> </ul> </div> </div> <div id="content"> <div id="preamble"> <div class="sectionbody"> <div class="sidebarblock"> <div class="content"> <div class="title">Πλέγμα Δικτύου μεταξύ Services και Microservices</div> <div class="paragraph"> <p>Σκοπός του project, είναι να δημιουργήσουμε ένα "σμήνος" από <strong>εικονικές μηχανές</strong> (ή αλλιώς <strong>nodes</strong> ή <strong>containers</strong>), οι οποίες θα έχουν την δυνατότητα να επικοινωνούν μεταξύ τους με διάφορους τρόπους επικοινωνίας.</p> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Note</div> </td> <td class="content"> <div class="paragraph"> <p>Λειτουργικότητα Σμήνους</p> </div> <div class="paragraph"> <p>Σε ένα <strong>σμήνος εικονικών μηχανών</strong>, υπάρχουν μηχανές που <strong>συλλέγουν δεδομένα</strong> (συνήθως έχουν τον ρόλο των <strong>clients</strong>) και μηχανές που "αποκτούν" αυτά τα δεδομένα καθώς στη συνέχεια <strong>επικοινωνούν μεταξύ τους</strong> για διάφορους σκοπούς (συνήθως έχουν τον ρόλο των <strong>servers ή devices</strong>). 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.</p> </div> </td> </tr> </table> </div> <div class="paragraph"> <p><strong>Για το σκοπό του εργαστηρίου, θα χρησιμοποιηθούν τα παρακάτω εργαλεία:</strong></p> </div> <div class="ulist"> <ul> <li> <p>Swarmlab</p> </li> <li> <p>Ansible</p> </li> <li> <p>Fluentd</p> </li> <li> <p>MongoDB</p> </li> <li> <p>NodeJS</p> </li> </ul> </div> </div> </div> </div> </div> <div class="sect1"> <h2 id="__">1. Πρώτη Ενότητα</h2> <div class="sectionbody"> <div class="sect2"> <h3 id="___2">1.1. Δημιουργία Δικτύου:</h3> <div class="paragraph"> <p>Για να μπορέσουμε να θέσουμε σε <strong>λειτουργία</strong> τις εικονικές μηχανές αλλά και να τις <strong>διαμορφώσουμε κατάλληλα</strong> έτσι ώστε να <strong>συλλέγουν</strong> και να <strong>μεταφέρουν δεδομένα</strong>, θα χρειαστεί να δημιουργήσουμε ένα <strong>δίκτυο</strong>, πάνω στο οποίο θα γίνουν οι επιθυμητές ενέργειες.</p> </div> </div> <div class="sect2"> <h3 id="___3">1.2. Αυτόματη Εγκατάσταση Προγράμματος Σύλλογης Δεδομένων:</h3> <div class="paragraph"> <p>Για να μπορέσουμε να συλλέξουμε δεδομένα από ένα σύνολο εικονικών μηχανών και να τα στείλουμε σε διάφορα σημεία, θα πρέπει οι εικονικές μηχανές να έχουν <strong>εγκαταστήσει ορισμένα πακέτα</strong> που θα περιέχουν <strong>ειδικά εργαλεία</strong> για την κάθε διαδικασία που επιθυμούμε να εκτελέσουν.</p> </div> <div class="paragraph"> <p>Χρησιμοποιούμε το <strong>Ansible</strong>, με το οποίο δίνουμε τις διευθύνσεις των εικονικών μηχανών που επιθυμούμε να κάνουν τις απαραίτητες <strong>εγκαταστάσεις πακέτων</strong>, σε ένα αρχείο <strong>Inventory</strong>, καθώς και σε ένα άλλο αρχείο <strong>fluentd.conf.yml</strong> δίνουμε ορισμένα πακέτα που θέλουμε να εγκατασταθούν στις εικονικές μηχανές.</p> </div> <div class="paragraph"> <p>Για την <strong>συλλογή δεδομένων</strong> θα χρησιμοποιήσουμε ένα <strong>ειδικό εργαλείο</strong>, το οποίο έχει την δυνατότητα να συλλέγει δεδομένα από διάφορες πηγές (π.χ. <strong>system logs</strong>, <strong>apache logs</strong>, <strong>web app / mobile logs</strong>, <strong>IoT Sensors logs</strong> κλπ.) και να τα στέλνει σε διάφορα σημεία που επιθυμούμε (π.χ. <strong>AWS</strong>, <strong>Hadoop</strong>, <strong>Βάσεις Δεδοένων</strong>).</p> </div> <div class="paragraph"> <p>Το εργαλείο που θα χρησιμοποιήσουμε ονομάζεται <strong>Fluentd</strong> και θα επιχειρήσουμε την συλλογή δεδομένων από αρχεία <strong>logs</strong> αναφορικά με διάφορα <strong>στατιστικά</strong> της εφαρμογής μας, καθώς και από αρχεία που έχουμε <strong>γράψει</strong> μέσα σε αυτά.</p> </div> <div class="paragraph"> <p>Η αποστολή και αποθήκευση της παραπάνω <strong>συλλογής δεδομένων</strong>, όπως θα δούμε και παρακάτω, θα γίνεται <strong>αρχικά</strong>, σε ένα <strong>αρχείο</strong> μέσα από το οποίο θα μπορούμε να δούμε τι πληροφορίες έχουν συλλεχθεί. Έπειτα, με το κατάλληλο <strong>configuration</strong>, η αποθήκευση των δεδομένων που συλλέχθηκαν θα γίνεται σε ένα <strong>κεντρικό σημείο</strong> και πιο συγκεκριμένα σε μια <strong>Βάση Δεδομένων</strong>. Για τους σκοπούς του εργαστηρίου, θα χρησιμοποιήσουμε την <strong>MongoDB replica</strong>.</p> </div> <div class="paragraph"> <p>Στην <strong>Ενότητα 2</strong>, θα γίνει λεπτομερής περιγραφή της αποθήκευσης δεδομένων στην <strong>Βάση Δεδομένων</strong>.</p> </div> </div> <div class="sect2"> <h3 id="_onevent">1.3. onEvent - Τοπική / Προσωρινή Αποθήκευση Δεδομένων:</h3> <div class="paragraph"> <p>Όπως αναφέρθηκε στην προηγούμενη υποενότητα, με τη βοήθεια του <strong>εργαλέιου Fluentd</strong> θα ορίσουμε <strong>ποιες</strong> εικονκές μηχανές θα συλλέξουν δεδομένα και από <strong>ποια</strong> αρχεία εισόδου για διάβασμα.</p> </div> <div class="paragraph"> <p>Σε αυτό το σημείο του project, θα ορίσουμε το αρχείο εξόδου στο οποίο θα αποθηκεύονται όλα τα <strong>συμβάντα</strong> σε περίπτωση που υπάρξουν στα αρχεία εισόδου.</p> </div> </div> </div> </div> <div class="sect1"> <h2 id="___4">2. Δεύτερη Ενότητα</h2> <div class="sectionbody"> <div class="sect2"> <h3 id="___5">2.1. Δημιουργία Βάσης Δεδομένων:</h3> <div class="paragraph"> <p>Για να μπορέσουμε να στέλνουμε δεδομένα σε μια <strong>Βάση Δεδομένων</strong>, θα χρειαστεί να την δημιουργήσουμε πρώτα.</p> </div> <div class="paragraph"> <p>Χρησιμοποιώντας το εργαλείο <strong>Mongo</strong> μπορούμε να σηκώσουμε μια <strong>replicated</strong> Βάση Δεδομένων, να ορίσουμε το <strong>username</strong> και το <strong>password</strong> για την πρόσβασή μας σε αυτήν, καθώς και τις πόρτες για την μελλοντική σύνδεση της Βάσης με ένα Websocket, το οποίο θα καλυφθεί στην <strong>Ενότητα 3</strong>.</p> </div> </div> <div class="sect2"> <h3 id="_onevent_2">2.2. onEvent - Αποθήκευση Δεδομένων στην Βάση:</h3> <div class="paragraph"> <p>Αφότου δοκιμάσουμε την αποθήκευση των δεδομένων σε ένα αρχείο εξόδου, μπορούμε έπειτα με την κατάλληλη <strong>διαμόρφωση</strong> στα <strong>configuration</strong> αρχεία του εργαλείου <strong>Fluentd</strong>, να ορίσουμε πλεόν ως έξοδο για αποθήκευση δεδομένων την Βάση Δεδομένων, την οποία δημιουργήσαμε μόλις.</p> </div> </div> </div> </div> <div class="sect1"> <h2 id="___6">3. Τρίτη Ενότητα</h2> <div class="sectionbody"> <div class="sect2"> <h3 id="__websocket">3.1. Δημιουργία Websocket:</h3> <div class="paragraph"> <p>Για να μπορέσουμε να έχουμε<strong>άμεση</strong> μεταφορά των δεδομένων, θα χρειαστεί να ενεργοποιήσουμε <strong>Server</strong>, καθώς και την Τεχνολογία των <strong>Sockets</strong>, έτσι ώστε να έχουμε την δυνατότητα να ζητάμε κάποια δεδομένα από τον Server (ως Clients) και να παίρνουμε το αποτέλεσμα.</p> </div> <div class="paragraph"> <p>Αυτό επιτυγχάνεται με την δημιουργία ενός <strong>Websocket</strong>, το οποίο το θέτουμε σε λειτουργία μέσω <strong>Web Browser</strong> αφότου το προγραμματίσουμε κατάλληλα για την <strong>πόρτα</strong> στην οποία θα "ακούει" η σύνδεση.</p> </div> <div class="paragraph"> <p>Για τους σκοπούς του project, θα χρησιμοποιηθεί η Υπηρεσία <strong>RESTful API</strong> μέσω του Πρωτοκόλλου <strong>REST</strong>, για την επιχείρηση σύνδεσης ενός (ή περισσότερων) Client με έναν Server σε μια συγκεκριμένη <strong>διεύθυνση</strong> και σε μια συγκεκριμένη <strong>πόρτα</strong>.</p> </div> </div> <div class="sect2"> <h3 id="__websocket_2">3.2. Σύνδεση Websocket και Βασικών Υπηρεσιών:</h3> <div class="paragraph"> <p>Για να μπορέσουμε να μεταφέρουμε δεδομένα μέσω ενός Websocket, η μια λύση είναι να επιχειρήσουμε την σύνδεση του Websocket που δημιουργήσαμε προηγουμένως, με τις <strong>βασικές υπηρεσίες</strong> που δημιουργήσαμε στην <strong>Ενότητα 1</strong>, μέσω ορίσματος κατάλληλων <strong>ports</strong>.</p> </div> </div> <div class="sect2"> <h3 id="__websocket_3">3.3. Σύνδεση Websocket και Βάσης Δεδομένων:</h3> <div class="paragraph"> <p>Μια άλλη λύση για την μεταφορά δεδομένων μέσω ενός Websocket, είναι να επιχειρήσουμε την σύνδεση του Websocket που δημιουργήσαμε προηγουμένως, με την <strong>Βάση Δεδομένων</strong> που δημιουργήσαμε στην <strong>Ενότητα 2</strong>, μέσω ορίσματος κατάλληλων <strong>ports</strong>.</p> </div> </div> </div> </div> </div> </body> </html>