%!TEX root = ../Thesis.tex
\section{Grundlagen}

In diesem Kapitel werden die Grundlagen von \gls{TSDB} und Time Series Data erklärt. 
\gls{TSDB} gehört zu den \gls{NoSQL} Datenbanken und ist besonders darauf optimiert, mit Time Series Data zu 
arbeiten. Dadurch können sie große Mengen an Time Series Data verarbeiten, durchsuchen und speichern.\footnote{\cite[vgl.][]{ComputerWeekly}} 

\subsection{Time Series Data}

Um \gls{TSDB} zu verstehen, muss als erstes geklärt werden, was Time Series Data überhaupt sind und wie sie sich von anderen Daten unterscheiden.
Wie der Name schon impliziert, sind Time Series Data eine Reihe von Daten, die über einen Zeitraum gesammelt worden sind. Es wird also nicht nur der Endwert aufgezeichnet,
sonder die Veränderung über einen Zeitraum. Diese Daten können z.B. Servermetriken, %Anwendungs Leistungsüberwachung, finde ich kein besseres Wort für weglassen
Netzwerkdaten, \gls{IOT}, Sensordaten, Ereignisse, Klicks, Marktgeschäfte und viele andere Arten von Daten sein.
Time Series Data können gut daran erkannt werden, dass die Zeit eine wichtige Achse bei der Darstellung der Werte ist.\footnote{\cite[vgl.][1\psqq]{PaulDix}}

Manchmal ist es nicht notwendig, alle Daten zu erfassen. Zum Beispiel wird in vielen Anwendungen nur der letzte Login gespeichert. 
Mehr ist auch für die Funktion nicht notwendig. Allerdings können zusätzliche Informationen gewonnen werden, wenn nicht 
nur der letzte Datenpunkt, sondern die Veränderung über einen Zeitraum aufgezeichnet wird. 
So kann zum Beispiel festgestellt werden, wie oft und wann sich der Kunde einloggt hat und ob es dabei ein Muster gibt. Anhand dieser Daten können Kunden 
dann kategorisiert werden.\footnote{\cite[vgl.][]{DataScienceTeam2020}}

Eine weitere Besonderheit von Time Series Data ist, dass sie sich nicht verändern. Wenn die Daten einmal erfasst wurden, wird an ihnen nichts mehr verändert.
Es werden nur neue Daten hinzugefügt.\footnote{\cite[vgl.][]{SamFangman2019}} 

\subsection{{Aufbau von Time Series Datenbanken}}

\gls{TSDB} ist darauf ausgelegt, Key Value Paare zu speichern. Der Key in einem Key Value Datensatz ist ein
Wert, über den die Value referenziert wird. Im Value Teil werden die Daten zum dazugehörigen Key gespeichert.
Der Wert des Value kann ein primitiver Datentyp sein oder auch ein Objekt, das in einen primitiven Datentyp 
umgewandelt worden ist. 
\footnote{\cite[vgl.][]{Key-Value}} 

Ein Datenpunkt in einer Time Series Database besteht aus mehreren Key Value Paaren. Einige dieser Key Value Paare sind sogenannte Tags.
Diese Tags sind Werte, die sich zwischen den Datenpunkten nicht ändern, wie zum Beispiel die Position eines Sensors oder die Kundenummer
eines Kunden, der sich gerade eingeloggt hat. Anhand dieser Tags können die Datenpunkte durchsucht werden. Die eigentlichen Messwerte 
des Sensors oder andere Daten, die erfasst werden sollen, werden auch als Key Value Paar gespeichert. Zum Beispiel wird als Name 
\glqq Temperatur\grqq{} und als Wert \glqq 25,2\grqq{} angeben. Ein Datenpunkt kann mehrere Messwerte haben. Außerdem wird jeder Datenpunkt mit einem Timestamp
versehen, nach welchem er indexiert wird.\footnote{\cite[vgl.][]{hazelcast}} Eine gute Veranschaulichung, wie die Daten in einer \gls{TSDB} aufgebaut sind, zeigt das InfluxDB
Line Protokoll in \cref{list:lineproto}.
%https://hazelcast.com/glossary/time-series-database/

\subsection{{Unterschiede zwischen Time Series und relationalen Datenbanken}}

Um Time Series Data zu speichern, ist es nicht unbedingt erforderlich, eine \gls{TSDB} zu nutzen. Auch relationale Datenbanken können Time Series
Data speichern. Einer der wichtigsten Unterschiede zwischen einer \gls{TSDB} im Gegensatz zu einem \gls{RDBMS} ist es, dass kein Datenbank Schema benötigt wird. 
Wenn Time Series Daten in eine %eine oder einer?
relationale Datenbank geschrieben werden sollen, müssen erst entsprechende Tabellen angelegt werden, in denen die Daten immer im 
gleichen Format abgelegt werden müssen. Im Gegensatz dazu können in einer \gls{TSDB} die Daten einfach schemafrei in die Datenbank geschrieben werden. Ein 
weiterer Vorteil ist, dass \gls{TSDB} im Gegensatz zu relationalen Datenbanken besser und einfacher skaliert werden 
können.\footnote{\cite[vgl.][]{InfluxDataSQL}} 

\gls{TSDB} haben jedoch nicht nur Vorteile. Wie in \cref{fig:db-ranking} zu sehen, sind sie viel weniger verbreitet, als nicht zeit basierte Datenbank Systeme. Dadurch gibt 
es viel weniger Entwickler, die Erfahrungen mit \gls{TSDB} haben. Auch das Ökosystem um die Datenbank ist deutlich kleiner. Außerdem sind \gls{RDBMS} 
dadurch, dass es sie viel länger gibt, sehr stabil und sehr gut unterstützt.\footnote{\cite[vgl.][]{InfluxDataSQL}}

\gls{RDBMS} arbeiten nach dem \gls{CRUD} Prinzip, welches für Time Series Data nicht optimal ist. Auf Time Series Data werden keine Update Befehle durchgeführt, da 
neue Daten immer nur angehängt werden. Auch das Löschen von Daten wird nicht sehr häufig durchgeführt und im Gegensatz zu \gls{RDBMS}
meistens gleichzeitig auf einer großen Menge an Datensätzen. \gls{TSDB} sind auf diese Besonderheiten optimiert und daher besser dafür geeignet, mit Time Series Data zu arbeiten und weisen auch eine 
höhere Performance auf.\footnote{\cite[vgl.][]{InfluxDataSQL}}

\subsection{Verbreitete DBMS}

Aktuell gibt es wie in \cref{fig:db-ranking} zu sehen, einige beliebte Mulit-Model Datenbanken, die als \gls{TSDB} genutzt werden können. 
So können Datenbanken wie MongoDB, Redis, Teradata und Couchbase mit Time Series Daten arbeiten. Die erste reine \gls{TSDB} im Ranking ist InfluxDB
auf Platz 29.\footnote{\cite[vgl.][]{dbranking}}

Allerdings haben Datenbanken, die nur auf das Verarbeiten von Time Series Data ausgelegt sind, deutliche Performance Vorteile
gegenüber Multi Model Datenbanken. In einem Vergleich von InfluxDB und MongoDB, hat InfluxDB eine 2,4 mal bessere 
Schreibperformance als MongoDB und ist beim Lesen sogar 5,7 mal schneller. InfluxDB benötigt außerdem 20 mal weniger 
Speicherplatz auf der Festplatte, um die gleiche Menge an Daten zu speichern.\footnote{\cite[vgl.][]{InfluxDBvsMongo}}

% Der Teil kommt in die Arbeit wenn ich zu wenig Seiten habe
%Wie in \cref{fig:tsdb-ranking} zu sehen ist influxDB die mit Abstand belibteste \gls{TSDB}. Unter den gezeigten Datenbanken ist Prometheus eine 
%besonderheit denn dieses Datenbanksystem ist d

%\begin{figure}[hbt]
%\centering
%\begin{minipage}[t]{0.9\textwidth} % Breite, z.B. 1\textwidth		
%\caption{TSDB Ranking} % Überschrift
%\includegraphics[width=1\textwidth]{img/TSDB-Engines-Ranking}\\ % Pfad
%\source{https://db-engines.com/de/ranking/time+series+dbms} % Quelle
%\label{fig:tsdb-ranking}
%\end{minipage}
%\end{figure}

\subsection{{Entwicklungsumgebung}}

Um mit InfluxDB zu arbeiten, wird eine Umgebung zum Ausführen von Docker Containern benötigt, in welchen InfluxDB und Jupyter Notebooks betrieben werden können. 
Der eigentliche Code wird dann in Jupyter Notebooks mit Python entwickelt. Die Grundlagen über die eingesetzten Tools und Techniken werden in diesem Kapitel grob
erläutert.

\subsubsection{{Docker und Docker Compose}}
%Docker
Docker ist eine Software für das Erstellen und Verwalten von Containern. Mit Docker ist es möglich, Anwendungen samt ihrer Umgebung in einer Einheit 
zusammenzufassen, sodass diese einfach auf anderen Systemen ausgeführt werden können. Dabei hat jeder Container ein eigenes Dateisystem und ein eigenes 
Betriebssystem. Allerdings teilen sich Container und Hostsystem den Kernel des Hostsystems. Dadurch hat diese Art der Virtualisierung deutlich 
weniger Overhead als andere Virtualisierungstechniken. Zusätzlich wird das Betriebssystem innerhalb des Containers maximal reduziert, sodass nur 
noch benötigte Komponenten vorhanden sind. Es ist wichtig, dass immer nur möglichst eine Anwendung in einem Container ausgeführt wird.
Durch die Virtualisierung sind die einzelnen Container voneinander getrennt.\footnote{\cite[vgl.][54\psqq]{DanielStender2020}}

%Docker Compose
Allerdings bestehen einige Anwendungen aus mehreren Komponenten. Diese können durch mehrere Docker Container abgebildet werden. Um die Verwaltung von
mehreren Containern zu erleichtern, kann Docker Compose eingesetzt werden. Mithilfe von Docker Compose können größere Umgebungen in einem Compose File 
verwaltet werden. Hier werden die Umgebungsvariablen, Container-Images oder Dockerfiles, Ports, Storage und weiteres in einer Datei definiert. 
Mithilfe dieser Definition kann Docker Compose eine komplexe Umgebung mit nur einem Befehl initialisieren.\footnote{\cite[vgl.][151\psqq]{DanielStender2020}}

\subsubsection{{Python und Jupyter Notebooks}}
%Python
Python ist eine universelle, prozedurale und imperative Programmiersprache, die 1994 in der ersten Version veröffentlicht wurde. Der Name ist eine Huldigung an Monty Python und 
wurde nicht nach einer Schlange benannt, auch wenn das Logo eine Schlange ist. Python ist unter der freien PFS Lizenz lizensiert, wodurch es auch in 
kommerziellen Anwendungen genutzt werden kann. Python ist eine interpretierte Sprache. Das heißt, dass sie nicht zu einer ausführbaren Datei kompiliert wird,
sondern von einem Interpreter interpretiert wird. Außerdem ist Python eine unter Programmieranfängern sehr beliebte Sprache, die auch sehr viel in den
Bereichen Data-Science, Deep-Learning, Naturwissenschaften und Linux Systemprogrammierung eingesetzt wird.\footnote{\cite[vgl.][66\psqq]{DanielStender2020}}

% Jupyter Notebooks
Jupyter Notebooks ist eine webbasierte Open-Source Anwendung mit dem Ziel, Code in den Sprachen Python, R, und Julia einfach schreiben, bearbeiten,
auszuführen und teilen zu können. Ein Notebook besteht immer aus Zellen. Eine Zelle kann Code oder Markdown formatierten Text anzeigen. Jede Zelle
kann einzeln ausgeführt werden. Dadurch kann ein Programm sehr einfach und verständlich dargestellt und erklärt werden. Es ist auch möglich, neue Notebooks
und Dateien im Webinterface von Jupyter Notebooks selbst anzulegen.\footnote{\cite[vgl.][91\psqq]{NikitaSilaparasetty2020}}