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