Seite wählen

NETWAYS Blog

InfluxDB Time Series Database

In diesem Beitrag geht es um Zeitreihen-Daten (time series data) und InfluxDB (time series databases).

 

Time Series Data

Was sind eigentlich die time series data? Es gibt Programme oder Tools, die eine große Menge an Rohdaten sammeln. Diese Daten haben ein wichtiges Merkmal: Wenn die Daten produziert werden, haben diese einen Zeitstempel. Jene Daten spiegeln die Veränderungen wider, die im Laufe der Zeit passiert ist. Daher können wir diese Werte als zeitabhängigen Vektor betrachten.

Die Daten haben manchmal die Eigenschaft der Kontinuität, beispielsweise können die Temperatur einer Umgebung oder die check-Ergebnisse von einem Überwachungssystem wie Icinga über die Zeit kontinuierlich gespeichert werden.

Diese Daten haben drei wichtige Merkmale:

  • Die Daten erreichen uns nahezu zeitgleich mit der Erfassung.
  • Die Daten kommen normalerweise geordnet bei uns an.
  • Die Registrierungszeit ist einer der wichtigsten Eigenschafen.

Mit anderen Worten: Die einzige Operation besteht darin, neue Daten zu den vorherigen Daten hinzuzufügen.

 

Time Series Database

Zeitreihendatenbanken (time series database) sind Datenbanken, die speziell zum Speichern und Untersuchen von Zeitreihendaten entwickelt wurden. Diese Daten werden im Allgemeinen in Wert-Zeit Paaren gespeichert. Zeitreihendatenbanken sind für die Arbeit mit Wert-Zeit Paaren optimiert – sie verwenden beispielsweise Komprimierungsalgorithmen, um Daten effizienter zu verwalten.

Einige dieser Datenbanken ermöglichen es auch, Änderungen in Daten zu prüfen und diese in Diagramme umzuwandeln. Zu den wichtigsten Zeitreihendatenbanken gehören:

  • Riak
  • kdb+
  • IMB Informix
  • InfluxDB
  • Prometheus
  • eXtremeDB
  • IBM Informix on Cloud
  • Azure Time Series Insights
  • TimescaleDB
  • Druid
  • OpenTSDB
  • Gtaphite

InfluxDB

InfluxDB ist eine Open Source Zeitreihendatenbank, die vom InfluxData-Team entwickelt wurde. InfluxDB wurde mit der Go-Sprache entwickelt und ist einfach zum Installieren und Bedienen. Die Menge der Daten, die man sammeln kann, ist unbegrenzt, und es spielt keine Rolle, wie oder in welchem ​​Format die Daten an InfluxDB übermittelt werden. Es gibt außerdem die Möglichkeit, anhand der Daten im InfluxDB-Webinterface Graphen darzustellen – diese können z.B. in Überwachungssystemen wie Icinga nützlich sein.
InfluxDB ist stärker gewachsen, als andere Zeitreihendatenbanken. Und dadurch, dass es ein Open Source Programm ist, ist der Quellcode einfach zu verwenden!

 

InfluxDB Funktionen

Es gibt einige Faktoren, die InfluxDB von anderen Datenbanken unterscheidet.
Gute Leistung ist eines der Hauptmerkmale von InfluxDB. Diese ermöglicht es, die Daten mit guter Geschwindigkeit und guter Qualität zu verwenden, selbst bei hoher Datenlast. Zu diesem Zweck verwendet InfluxDB Komprimierung zum Verwalten von Daten und kann 1 Million Daten pro Sekunde sammeln und verwalten.

Wenn Du mit der SQL-Syntax vertraut bist, wirst Du  auch mit der InfluxDB-Abfrage vertraut sein. InfluxDB verwendet eine eigene Syntax namens InfluxQL. Angenommen, Du sammelst Daten aus dem Speicher eines Computers, und möchtest diese Daten anzeigen. Dann musst Du nur eine SQL-Abfrage schreiben – diese nimmt die Daten der letzten 3 Monate und gruppiert sie in 10-Tage-Pakete.

Beim Umgang mit großen Datenmengen wird es schwierig sein, sie zu speichern und zu pflegen, und mit der Zeit werden diese Daten immer komplexer. InfluxDB kann diese Daten in kleineren Größen und genauer über lange Zeiträume speichern.
Mithilfe der Datenspeicherungsrichtlinien, auf die Du in InfluxDB Zugriff hast, kannst Du Deine Einstellungen so anpassen, dass Deine Daten bis zu 30 Tage lang genau verfügbar sind. Danach kannst Du sie bis zu 6 Monate oder länger speichern oder für immer aufbewahren. Mit dieser Funktion kannst Du Daten speichern und gleichzeitig Festplattenspeicher sparen.

Saeid Hassan-Abadi
Saeid Hassan-Abadi
Systems Engineer

Saeid hat im Juli 2022 seine Ausbildung als Fachinformatiker für Systemintegration bei uns abgeschloßen, und arbeitet nun in Operation-Team. Der gebürtige Perser hat in seinem Heimatland Iran Wirtschaftsindustrie-Ingenieurwesen studiert. Er arbeitet leidenschaftlich gerne am Computer und eignet sich gerne neues Wissen an. Seine Hobbys sind Musik hören, Sport treiben und mit seinen Freunden Zeit verbringen.

Encoding „leicht gemacht“ mit PostgreSQL

In der Urzeit der Computerei passierte das alles in den USA. Und die Vereinigten Amerikaner haben seinerzeit wie üblich nicht über den Tellerrand geschaut, sondern ihren Zeichensatz an ihre Sprache angepasst (ASCII). Irgendwann „durften“ dann auch die Alliierten ran, und die Probleme kamen auf… dieser Zeit verdanken wir ISO-8859-1, WIN-1252 und wie sie alle heißen. Mittlerweile gibt es aber ja seit 30 Jahren Unicode, die Probleme sind also doch Schnee von gestern. Richtig?

PostgreSQL ist – aus guten Gründen – ein beliebtes Ziel für Migrationen. Und PostgreSQL ist von vorne bis hinten auf UTF-8 aufgestellt. Leider hat man es aber oft mit Altsystemen, Altdaten und Gammelcode zu tun, die irgendwie übernommen werden müssen.

So bestehen unfassbare Mengen an altem Perl-, Python-, PHP-, VBA-, … Code, der für frühe Access-, MySQL-, MS-SQL-, Oracle-, Sybase oder was auch immer für Datenbanken geschrieben wurde und mit Unicode nichts am Hut hat. (Einige dieser Systeme sind bis heute nicht wirklich gut darin…)

Gerne sind wir auch gezwungen, „Pseudo-CSV“ aus M$ Excel zu importieren (warum ist es „normal“, comma separated values mit Semikolon zu separieren?!?), und Microsoft tut sich bis heute immer noch schwer mit UTF-8.


~$ file importtest.win-1252.csv
importtest.win-1252.csv: ISO-8859 text, with CRLF line terminators

Betreiber solcher Software haben sich üblicherweise aus der Affäre gezogen, indem sie die Datenbank, auch bei Updates, immer wieder im alten, überholten Encoding betrieben haben. Jetzt steht also die Umstellung auf PostgreSQL an, und beim ersten Testimport von Altdaten kommt diese Meldung:


blog=# \COPY csvimport FROM importtest.win-1252.csv WITH (DELIMITER ';', FORMAT CSV);
ERROR: invalid byte sequence for encoding "UTF8": 0xfc
CONTEXT: COPY csvimport, line 1
blog=#

Viele Entwickler*innen werden jetzt reflexhaft ihre bewährte Methode benutzen wollen, und ja, ich kann, auch wenn mein DB-Cluster anders initialisiert wurde, genau das auch tun:


blog=# \h CREATE DATABASE
Command: CREATE DATABASE
Description: create a new database
Syntax:
CREATE DATABASE name
[ [ WITH ] [ OWNER [=] user_name ]
[ TEMPLATE [=] template ]
[ ENCODING [=] encoding ]
[ LOCALE [=] locale ]
[ LC_COLLATE [=] lc_collate ]
[ LC_CTYPE [=] lc_ctype ]
[ TABLESPACE [=] tablespace_name ]
[ ALLOW_CONNECTIONS [=] allowconn ]
[ CONNECTION LIMIT [=] connlimit ]
[ IS_TEMPLATE [=] istemplate ] ]

siehe auch hier.

Ah, da ist es ja, [ ENCODING [=] encoding ] als „Weg des geringsten Widerstands“. Dann ist das doch normal, oder nicht?! Ja, kann man so machen, ist dann nur kacke und man hat eine Top-Gelegenheit verpasst! Besser ist es, die Gelegenheit zu nutzen und hier und jetzt den Weg auf UTF-8 einzuleiten. Dafür reicht es, das client_encoding für den Import anzupassen:


blog=# SHOW client_encoding ;
client_encoding
-----------------
UTF8
(1 row)
blog=# SET client_encoding TO 'win-1252';
blog=# \COPY csvimport FROM importtest.win-1252.csv WITH (DELIMITER ';', FORMAT CSV);
blog=#

Gut! Das hat schonmal geklappt. Dann schauen wir doch mal, wie das in der Tabelle aussieht:


blog=# SELECT * FROM csvimport ;
id | spalte1 | spalte2
----+-----------------------------+----------------------------
1 | Dies ist eine ▒bliche Datei | [NULL]
2 | mit M▒ll von M$ Excel | [NULL]
3 | [NULL] | und leeren Spalten (w▒rg).
(3 rows)

Pfui bah! Genau das wollten wir doch vermeiden!!!

Alles ist gut, unser client_encoding ist ja noch kaputt:


blog=# RESET client_encoding;
blog=# SELECT * FROM csvimport ;
id | spalte1 | spalte2
----+-----------------------------+----------------------------
1 | Dies ist eine übliche Datei | [NULL]
2 | mit Müll von M$ Excel | [NULL]
3 | [NULL] | und leeren Spalten (würg).
(3 rows)

Und wenn das Refakturieren aller beteiligten Komponenten gerade nicht opportun ist, kann das client_encoding z.B. per Rolle (User) gesetzt werden:


blog=# CREATE ROLE legacy_import LOGIN;
blog=# ALTER ROLE legacy_import SET client_encoding TO 'win-1252';

Alles, was von dieser Rolle nun geschrieben wird, verarbeitet PostgreSQL nun intern zu UTF-8. Alles, was die Rolle liest, wird in WIN-1252 umgewandelt. Alle modernen Clients können aber mit Unicode arbeiten, so dass einer Transition statt einer reinen Migration jetzt „nur noch“ Code im Wege steht, keine Daten mehr.

P.S.: Es gibt natürlich noch weitere Möglichkeiten, das Encoding pro Client festzulegen, z.B. die Umgebungsvariable PGCLIENTENCODING.

 

Über den Autor:

Gunnar “Nick” Bluth hat seine Liebe zu relationalen Datenbanken Ende des letzten Jahrtausends entdeckt. Über MS Access und MySQL 3.x landete er sehr schnell bei PostgreSQL und hat nie zurückgeschaut, zumindest nie ohne Schmerzen. Er verdient seine Brötchen seit beinahe 20 Jahren mit FOSS (Administration, Schulungen, Linux, PostgreSQL). Gelegentlich taucht er auch tiefer in die Programmierung ein, so als SQL-Programmierer bei der Commerzbank oder in App-Nebenprojekten.
Lennart Betz
Lennart Betz
Senior Consultant

Der diplomierte Mathematiker arbeitet bei NETWAYS im Bereich Consulting und bereichert seine Kunden mit seinem Wissen zu Icinga, Nagios und anderen Open Source Administrationstools. Im Büro erleuchtet Lennart seine Kollegen mit fundierten geschichtlichen Vorträgen die seinesgleichen suchen.

MySQL Cheat-Sheet

Da ich euch nicht mit Dingen wie SELECT, INSERT oder UPDATE nerven möchte, aber es auch immer wieder Dinge gibt die ich regelmäßig nachschlagen muss, hier mein persönliches MySQL-Cheat-Sheet in der Hoffnung das es euch auch helfen möge 😉
Mitschneiden der MySQL-Session, z. B. für Doku’s:
[user@host ~]$ mysql -u root -p --tee=/tmp/what_i_have_done.log
Logging to file '/tmp/what_i_have_done.log'
Enter password:

Anzeigen aller DB’s mit der jeweiligen Größe in MB:
SELECT table_schema "Data Base Name",
sum( data_length + index_length ) / 1024 /
1024 "Data Base Size in MB",
sum( data_free )/ 1024 / 1024 "Free Space in MB"
FROM information_schema.TABLES
GROUP BY table_schema ;

Auflisten aller Benutzer und deren Datenbankberechtigungen:
SELECT grantee, table_schema, privilege_type FROM information_schema.schema_privileges;

Klonen von Tablellen (keys und index werden nicht automatisch übernommen!):
CREATE TABLE AS SELECT * FROM ;

Erstellen / Wiederherstellen einer Replikation:
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO MASTER_HOST='myotherdbms', MASTER_USER='replication_user', MASTER_PASSWORD='nsa_will_never_guess', MASTER_LOG_FILE='mysql-bin.00000', MASTER_LOG_POS=414138;
START SLAVE;

Bei Fehlern in der Replikation auch gerne gesehen… Ignoriere eine Anzahl N an Fehlern:
SET GLOBAL sql_slave_skip_counter = N;

Sollte ich noch mehr coole Sachen finden, werde ich diese Liste selbstverständlich erweitern 🙂

Tobias Redel
Tobias Redel
Head of Professional Services

Tobias hat nach seiner Ausbildung als Fachinformatiker bei der Deutschen Telekom bei T-Systems gearbeitet. Seit August 2008 ist er bei NETWAYS, wo er in der Consulting-Truppe unsere Kunden in Sachen Open Source, Monitoring und Systems Management unterstützt. Insgeheim führt er jedoch ein Doppelleben als Travel-Hacker und renoviert, baut und bastelt als Heimwerker an allem was er finden kann.

MSSQL Überwachung

In heterogenen IT-Umgebungen kann man auf vieles treffen. Heute geht es um die Überwachung von MSSQL. Hier gibt es verschiedene Kanäle die man nutzen kann.
Zum einen ist da das Betriebssystem, das einem in Eventlog und WMI viele Infos bereitstellt. Hierzu benötigt man z.B. den NSClient, zu dem es in diesem Blog eine komplette Serie gibt. Über diesen kommt man an beides ran.
Des weiteren gibt es von Gerhard Lauser das Plugin check_mssql_health mit Hilfe dessen man z.B. an Werte wie connection-time, connected-users, lock-waits oder deadlocks bekommt. Informationen und eine genaue Anleitung gibt’s hier.
Was man allerdings über diese Mittel nicht überwachen kann sind die konkreten Jobs die auf dem DBMS laufen.
Hierzu bietet MSSQL eine stored Procedure name sp_help_job. Um diese benutzen zu können und die Jobs aller User zu sehen muss der Monitoring User die Rolle  SQLAgentReaderRole oder SQLAgentOperatorRole einnehmen.
Ruft man sp_help_job ohne alles auf, bekommt man eine Tabelle alles eingerichteten Jobs. Die sollte man prinzipiell mit ‚@enabled = 1‘ einschränken um nur aktive Jobs zu bekommen.
Reichen einem diese Informationen noch nicht, sollte man noch einen Blick auf die TARGETS Tabelle werfen. Hier befinden sich Informationen zu dem letzten Lauf wie die last_run_duration, last_run_outcome oder last_run_date. Aber Obacht: Die Formatierung des Datums und der Zeit ist sehr gewöhnungsbedürftig. Die Zahl 113300 bedeutet z.B. 11:33 Uhr. Führende Nullen werden weggelassen.
Der Aufruf in Transact SQL lautet: sp_help_job @job_name = ‚<jobname>‘, @job_aspect = ‚TARGETS‘
Möchte man das ganze jetzt automatisieren stehen einem auch wieder mehrere Wege offen. Hat man Perl in sein NSClient integriert kann man dieses benutzen. Dank DBD:Sybase kann man einfach auf alle Daten von MSSQL zugreifen.
Denkbar wäre aber auch ein Powershellscript oder eine beliebige andere Sprache die auf Windows ausführbar ist.

Christoph Niemann
Christoph Niemann
Senior Consultant

Christoph hat bei uns im Bereich Managed Service begonnen und sich dort intensiv mit dem internen Monitoring auseinandergesetzt. Seit 2011 ist er nun im Consulting aktiv und unterstützt unsere Kunden vor Ort bei größeren Monitoring-Projekten und PERL-Developer-Hells.

Gesunde Datenbanküberwachung mit Nagios

Gesundheit Nordhessen Logo
In vielen öffentlichen Einrichtungen wird die kostengünstige Monitoring Lösung Nagios geschätzt. So auch bei unserem Kunden der Gesundheit Nordhessen Holding AG. Besonders positiv fällt immer wieder die Möglichkeit ins Gewicht eigene Erweiterungen oder Anpassungen vorzunehmen und so auch auf spezielle Anforderungen einzugehen. In diesem Fall ging es besonders um einige Eigenheiten bei der Überwachung von verschiedenen Datenbanksystemen (MySQL, Oracle und MSSQL).
Wir haben in Kassel schon im letzten Jahr geholfen, und möchten uns hier noch ein mal für die gute Zusammenarbeit bedanken.