Das Internet of Things (IoT) produziert enorme Mengen an Daten, die – je nach Quelle – in unterschiedlichen Formaten vorliegen. Daten-Management-Systeme müssen dennoch in der Lage sein, diese Informationen nutzbar zu machen.

Fortgeschrittene IoT-Lösungen beruhen auf der Erfassung und Verarbeitung großer Datenmengen sowie auf Techniken der künstlichen Intelligenz (KI) für deren Analyse, um die Funktion von Connected Devices zu überwachen, zu steuern oder um ihr Verhalten vorherzusagen. Die Herausforderung für Entwickler liegt allerdings darin, das massive Datenaufkommen in unterschiedlichsten Formaten zu bändigen. Entsprechende Daten-Management-Systeme müssen in der Lage sein, ohne Limits zu skalieren, und die notwendige Echtzeit-Performance mitbringen, um in kritischen IoT-Umgebungen einsetzbar zu sein. Ein Open-Source-Stack bestehend aus Apache Kafka, Flink und CrateDB erfüllt diese Voraussetzungen.

IoT-Lösungen in der Fertigung müssen zum Beispiel nicht selten Millionen von Ereignissen bewältigen, die Sensoren oder Geräte in unterschiedlichsten Formaten und in nahezu beliebigen Intervallen produzieren. Um diese Datenströme nutzbar zu machen, muss man sie zuverlässig erfassen, transformieren, mit zusätzlichen Merkmalen anreichern und speichern. Praxisgerechte Lösungen sollten nicht nur einen unterbrechungsfreien Betrieb garantieren, sondern auch sicherstellen, dass unvorhersehbare Störungen und Verzögerungen der Übertragung keinen Einfluss auf die Präzision des Gesamtsystems haben. Zudem kommt für einen wirtschaftlichen Betrieb nur eine Architektur in Frage, die auf einer einzigen Datenbank beruht.

Die Kombination aus Apache Kafka, Apache Flink sowie CrateDB trägt diesen Anforderungen für die Verarbeitung kom­plexer Zeitreihen Rechnung. Bei allen Layern dieses Stacks handelt es sich um verteilte, fehlertolerante Systeme, die eine elastische Skalierung ermöglichen und durch ein paralleles Processing eine Performance mit hohem Durchsatz und geringer Latenz garantieren.

Eine Datenbank wie CrateDB eignet sich beispielsweise für industrielle Zeitreihendaten, weil sie SQL für die einfache Einführung und Integration mit anderen Systemen bietet, dynamische Schemata bereitstellt, die für automatische Updates sorgen, wenn sich die Strukturen von Sensor-Messages verändern, und eine Echtzeit-Performance für Abfragen unterstützt. Die Abfragegeschwindigkeit von unter einer Sekunde bleibt auch bei weiterer Skalierung erhalten, weil sich zusätzliche Nodes zum CrateDB-Cluster problemlos hinzufügen lassen, um größere Datenmengen zu verarbeiten oder mehr konkurrierende Klienten zu bedienen.

Message-Queuing mit Apache Kafka

Der Open-Source-Stack nutzt Apache Kafka, um die von den IoT-Sensoren und -Geräten empfangenen Daten in eine Queue einzureihen und für Folgesysteme wie etwa Flink hochverfügbar zu machen. Zunächst als reine Nachrichtenwarteschlange konzipiert, hat sich Kafka inzwischen zu einer kompletten Streaming-Plattform entwickelt, die einen hohen Datendurchsatz sowie Vielseitigkeit im Einsatz ermöglicht.

Das Message-Queuing-System basiert auf einem verteilten Commit-Log. Unter einem „Topic“ versteht man bei Kafka eine logische Instanz, die wiederum aus mehreren Partitionen bestehen kann, deren Zahl konfigurierbar ist. „Producer“, also Sensoren oder IoT-Geräte, senden ihre Events als „Records“ an die entsprechenden Partitionen eines Topics. Der Kafka-Cluster hält die Nachrichten basierend auf der festgelegten Policy als unveränderliche geordnete Sequenz für die definierten Konsumenten vor. Die Partitionen lassen sich mehreren Brokern (Servern) zuordnen und von diesen replizieren.

Apache Kafka ist ein Messaging-System auf Basis einer Publish-/Subscribe-Architektur. Consumer können bestimmte Topics abonnieren, um Nachrichten aus dem partitionierten Log zu lesen. Die Consumer selbst kann man wiederum zu Gruppen zusammenfassen. Dies ermöglicht das Reprocessing von Daten, die automatische Zuweisung von Konsumenten zu Partitionen oder auch Load-Balancing über Consumer hinweg.

Der Einsatz von Kafka zur Erfassung und zum Queuing der Sensordaten bietet eine Reihe von Vorteilen gegenüber einer direkten Verbindung zwischen Sender und Empfänger, weil die Software fehlertolerant ist und eine leichte Skalierung unterstützt. Auf diese Weise lassen sich Probleme der Zwischenspeicherung oder Überlastung sicher umgehen.

Als verteiltes System kann man die Kapazität von Kafka leicht erweitern, um mehr Geräte (Producer), mehr Daten oder mehr Consumer zu unterstützen, indem die Zahl der Broker (Server) oder der Partitionen erhöht wird. Kafka garantiert die Reihenfolge und Verfügbarkeit der Nachrichten in den Partitionen als „Total Order“. Kafka repliziert die Daten in einer verteilten Umgebung auf dem Cluster und stellt damit die Verfügbarkeit sicher, selbst wenn ein Node ausfällt.

Data-Stream-Processing mit Apache Flink

Stream-Processing meint die unmittelbare Analyse und Bearbeitung von Daten im Fluss. Die Mehrzahl der Daten im IoT entstehen kontinuierlich als Zeitreihe. Ohne Stream-Processing müssen diese Daten in einem Massenspeicher archiviert werden, damit eine Applikation sie bei Bedarf abrufen kann. Stream-Processing kehrt dieses Paradigma um, indem eine entsprechende Anwendung unmittelbar auf das Event reagiert. Dabei kann es sich um das Auslösen einer Reaktion handeln, um das Update einer Summe oder Statistik oder um die Speicherung dieses Events für zukünftige Aktivitäten.

Der Open-Source-IoT-Stack nutzt Apache Flink, um die von Kafka geordneten Datenströme zu verarbeiten und an die Crate DB zu übermitteln. Das ursprünglich von Berliner Universitäten entwickelte fehlertolerante Stream-Processing-Framework verarbeitet Datenströme In-Memory und parallel über Server-Cluster hinweg. Flink garantiert, dass die verarbeiteten Daten die finalen Ergebnisse genau einmal beeinflussen – selbst bei Systemfehlern. Das Konzept der „Event-Time“ nutzt den Zeitstempel von Events, sodass sie immer in der korrekten Reihenfolge verarbeitet werden, selbst wenn sie verspätet eintreffen. Mit dem „Back-Pressure-Relief“ drosselt Flink Datenquellen, um ein System-Overload zu verhindern.

Mit diesem Konzept stellt Flink ein leistungsfähiges Open-Source-Framework für Stream-Processing bereit, das viele Herausforderungen adressiert, mit denen IoT-Entwickler konfrontiert sind. Das betrifft die unmittelbare Reaktion auf Events ohne Zwischenschritte, das Handling von größten Datenvolumina sowie die Dezentralisierung und Entkopplung der Infrastruktur.

Echtzeit-Abfrage mit CrateDB

Die CrateDB kommt im Rahmen dieses Stacks als SQL-DBMS-Layer zum Einsatz, um die durch Flink bereitgestellten IoT-Zeitreihendaten zu speichern und abzufragen. Dabei handelt es sich um eine neue Art verteilter SQL-Datenbanken, die das Handling industrieller Time-Series verbessern sollen. Der Rückgriff auf SQL vereinfacht die Anwendung und Integration und die NoSQL-Basistechnologie ermöglicht die Verarbeitung vieler TBytes an IoT-Daten in unterschiedlichsten Formaten.

Die CrateDB arbeitet in einer Shared-Nothing-Architektur als Cluster identisch konfigurierter Server (Nodes). Die Nodes arbeiten nahtlos zusammen, und die Ausführung der Schreib- und Lesevorgänge wird automatisch über alle Nodes im Cluster verteilt. Die Erweiterung der Kapazität ist eine simple Frage des Hinzufügens neuer Nodes. Sharding, Replikation für die Fehlertoleranz und Rebalancing der Daten bei veränderter Clustergröße erfolgen automatisch.

Bisher erforderten solche Workloads reine NoSQL-Lösungen wie Cassandra, Elasticsearch oder InfluxDB, oftmals zudem in Kombination mit traditionellen RDBMS. CrateDB vereint diese Funktionen auf einem System. Für den Einsatz von CrateDB im IoT-Umfeld sprechen neben der simplen Skalierung und hohen Verfügbarkeit insbesondere die Echtzeit-Performance via Parallel-Processing, die In-Memory-Indizes sowie das asynchrone, blockierungsfreie Full-Mesh-Networking.

Die dynamischen Schemata sind ein weiteres Merkmal, das insbesondere für Sensordaten im IoT von Bedeutung ist. Beim Anlegen neuer Sensor-Nachrichtenstrukturen fügt CrateDB automatisch neue Spalten ohne Tabellen-Logs, Downtime oder Schemamigration hinzu. Wenn sich Sensoren oder Geräte in der Produktion ändern, passt sich die Datenbank automatisch an.

CrateDB unterstützt den Standard ANSI SQL via dem PostgreSQL Wire Protocol, JDBC sowie REST-Schnittstellen und -Treiber für die verbreiteten Programmiersprachen. Zudem unterstützt die Datenbank den Zugang via MQTT-Listener, der die Integration mit Flink vereinfachen kann.

Der komplette Stack

Der vorgestellte Stack für IoT-Streaming und industrielle Zeitreihen ermöglicht die Realisierung komplexer, hochperformanter und verteilter IoT-Lösungen, die hohen Anforderungen in Bezug auf die zu verarbeitenden Datenvolumina und die Verarbeitungsgeschwindigkeit genügen. Sowohl die Queuing- als auch die Streaming-Software können Millionen von Messages pro Sekunde verarbeiten und weiterleiten. Die Datenbank speichert diese Datenmengen und stellt sie für Echtzeitabfragen an Folgesysteme bereit. Damit können sie die Grundlage für Smart-Factory-Konzepte bilden, die ein Höchstmaß an Verfügbarkeit und Qualität und geringstmögliche Störungen des Produktionsprozesses garantieren müssen.

Christian Lutz ist CEO von Crate.io, www.crate.io.