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
248 lines
16 KiB
3 years ago
|
<!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>
|