ZIS BEHIND THE SCENES – HOCHVERFÜGBARKEIT VON ELEMENT IoT
Veröffentlicht: 27. Jul 2022In diesem Jahr haben wir uns bei ZENNER IoT Solutions eine besondere Aktion ausgedacht. Statt immer nur über unsere Produkte und Projekte zu berichten, was wir natürlich liebend gerne tun, werden wir über den Sommer regelmäßig in der Rubrik “ZIS Behind the Scenes” einen Einblick in den “Maschinenraum” geben.
In dieser Artikelserie werden wir über die Technologie und die Menschen hinter den Produkten berichten. In dieser Woche machen wir weiter mit dem Thema Hochverfügbarkeit.
HOCHVERFÜGBARKEIT
Die Anforderungen an eine IoT-Plattform wie ELEMENT IoT sind mit denen einer klassischen Webanwendung nicht zu vergleichen. In einer klassischen Webanwendung, die von menschlichen Bedienern aufgerufen wird, können die Aufrufe wohl eher pro Minute gezählt werden. Wenn einmal eine Anfrage länger dauert oder die Anwendung kurz nicht verfügbar ist, dann sind es die Nutzer gewohnt einfach nochmal “Neu Laden” zu klicken. Im gewerblichen Einsatzbereich wird es außerhalb der Geschäftszeiten nur wenige Anfragen geben. Auch ein mehrstündiges Wartungsfenster werden die meisten Nutzer akzeptieren.
Eine IoT-Plattform hingegen erhält den überwiegenden Teil der Anfragen nicht von den menschlichen Nutzern, sondern von den IoT-Geräten oder anderen Systemen. Diese fragen zu jeder Tages- und Nachtzeit an. Daten müssen in Echtzeit in einer hohen Frequenz ausgetauscht werden. Zu jeder Sekunde, zu hunderten oder tausenden.
REDUNDANZ
Um zu jeder Zeit verfügbar zu sein, bedarf es einer Grundmaßnahme: Redundanz. Es muss nicht nur ein Server bereit sein, die riesige Anzahl an Anfragen zu beantworten, sondern eine ganze Flotte von Servern, die sich die Last teilen und die Anfragen ggf. ausgefallener oder gerade in Wartung befindlicher Kollegen übernehmen.
Was so simpel klingt, ist es allerdings leider nicht. Die Flotte von Servern muss sich untereinander abstimmen und koordinieren. Damit wird aus dem Gesamtsystem ein sogenanntes verteiltes System. Verteilte Systeme sind eine der großen Herausforderungen der Informatik. Dies ist so, weil die Netzwerkverbindung unter den beteiligten Servern per se als unzuverlässig gelten muss. Wenn nun einer der Server nicht erreichbar ist, kann man grundsätzlich nicht sagen, ob der Server ein Problem hat oder nur die Verbindung unterbrochen ist. Die Lösungen der einzelnen Probleme sind komplex.
Überblick über die wesentlichen Lösungsbausteine
Erlang/OTP
Der erste wichtige Baustein ist Erlang/OTP (siehe erster Teil unserer Reihe). Erlang/OTP, die Programmierumgebung mit der wir arbeiten, wurde genau für die Anwendung in verteilten Systemen konzipiert und bringt daher eine Menge an Funktionen mit, die bei anderen Programmiersprachen zusätzlich implementiert werden müssten oder nur durch zusätzliche Tools ermöglicht würden. Insbesondere ermöglicht es Erlang/OTP, dass sich alle in einem Netzwerk laufenden Instanzen von ELEMENT IoT untereinander verbinden können und z.B. automatisch Arbeitspakete untereinander verteilen können.
Message-Queue
Der zweite Baustein ist eine sogenannte Message-Queue. Dies ist ein System, welches eingehende Nachrichten puffert und an alle beteiligten ELEMENT IoT Instanzen verteilt. Wir verwenden das OpenSource-Tool RabbitMQ, das ebenfalls auf Erlang/OTP basiert. Der Vorteil ist, dass zum einen Lastspitzen in der Message-Queue gepuffert werden und zum anderen beliebig viele ELEMENT IoT Instanzen die Nachrichten in dem Puffer abarbeiten können. Wenn eine Instanz ausfällt, bearbeiten die anderen Instanzen solange die Nachrichten weiter.
PostgreSQL
Der dritte Baustein ist die PostgreSQL Datenbank, ebenfalls ein OpenSource-Tool, die wir mit einem sogenannten Hot-Standby betreiben. Das bedeutet, jede Schreiboperation auf der Datenbank wird auf einen zweiten Server gespiegelt und sollte der primäre Server ausfallen, kann der Hot-Standby einspringen und die Daten zur Verfügung stellen.
Reverse Proxy
Der vierte Baustein ist ein Reverse-Proxy und Loadbalancer, wir nutzen Nginx. Dieser sitzt, sozusagen als Pförtner, vor den ELEMENT IoT Instanzen und weiß welche verfügbar sind und welche gerade nicht, so dass er die Webanfragen auf die verfügbaren Instanzen verteilen kann.
Docker
Der fünfte Baustein ist Docker, eine leichtgewichtige Virtualisierungs-Schicht, die gleichzeitig die Orchestrierung der einzelnen Komponenten erlaubt. Die wichtigste Funktion im Hinblick auf Hochverfügbarkeit ist dabei die Möglichkeit des rollierenden Updates bzw. Neustarts. Das bedeutet, dass im Falle eines Updates oder Neustarts von ELEMENT IoT die Instanzen nicht alle gleichzeitig durchgestartet werden, sondern eine nach der anderen. So sind immer ausreichend Instanzen verfügbar, um die Last abzuarbeiten und die meisten Wartungsfenster laufen so komplett ohne Service-Unterbrechung.
Diese Architektur läuft natürlich in unterschiedlichen Firewall-Zonen und und mit diversen weiteren Automatisierungs- und Monitoring-Tools. Das würde für dieses Mal allerdings zu sehr ins Detail gehen, stattdessen zeigen wir an dieser Stelle exemplarisch einen Screenshot der Uptime einer unsere Kunden Instanzen, auf den wir wirklich stolz sind, da er zeigt, wozu wir diesen ganzen Aufwand betreiben:
Mehr zu ELEMENT IoT finden Sie hier.