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.

248 lines
16 KiB

<!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>