NEWS
Redis in ioBroker - Überblick
-
In diesem Zusatzbeitrag wird es recht speziell, da es um Vorbereitungen für ein Hochverfügbares iobroker-System geht. Für die meisten Home-Automation-Systeme ist dies ggf gar nicht so relevant. Auch wird die gesamte Installation um einiges komplexer und man muss sich noch tiefer mit den Themen beschäftigen.
Redis-Sentinel - Erste Schritte in Richtung Hochverfügbarkeit
Über die Vorteile eines Systems mit einem Redis-Server und einem oder mehreren Slaves ist weiter oben schon einiges gesagt worden. Dennoch ist ein Master-Slave Setup erst einmal statisch. Falls der Master ausfällt sind keine Änderungen an den Daten mehr möglich. Man kann die Server auch dynamisch umkonfigurieren und so aus einem Slave einen neuen Master machen. Das manuell bei allen Slaves zu machen nachdem es passiert ist und man es mitbekommen hat führt immer noch zu einem längeren Ausfall des Systems.
Was ist Redis Sentinel?
Die Lösung der Redis-Entwickler dies alles zu automatisieren heißt "Redis Sentinel". Der Sentinel ist ein zusätzlicher Prozess, welcher den Redis-Master und die Slaves überwacht und reagiert sobald der Master nicht mehr erreichbar ist. Dann stimmen sich die Sentinel-Prozesse ab und wählen einen neuen Master aus. Hat dies stattgefunden werden die restlichen Redis-Hosts entsprechend automatisch umkonfiguriert.
Über eine Verbindung zu den Sentinel-Prozessen kann abgefragt werden, welcher Host gerade der Master ist.Die einzige Bedingung dafür ist das mindestens 3 Sentinel-Prozesse auf getrennten Hosts laufen müssen - und idealerweise passend dazu eine entsprechende Anzahl an Redis-Hosts. Mehr Prozesse gehen auch, am besten immer eine ungerade Anzahl. Jeder dieser Hosts muss natürlich genügend RAM verfügbar haben um alle Daten im Speicher zu haben.
Zur Abstimmung über einen neuen Master muss eine Mehrheit vorliegen - bei 3 Hosts müssen also 2 noch erreichbar sein um einen neuen Master zu bestimmen. Bei 5 Hosts werden 3 Stimmen benötigt. Falls keine Mehrheit gefunden werden kann wird kein neuer Master bestimmt und das System bleibt erst einmal offline. Dies passiert um sicherzustellen das es zu keinen sog. "Split-Brain"-Situationen kommt, in denen Untergruppen aktiv sind und sich damit verschiedene Datenstände entwickeln, die am Ende nicht mehr zusammengebracht werden können.
Ein Sentinel Setup benötigt also entsprechende Hardware!
Ausführliche Informationen zu Redis Sentinel (für jeden der es nutzen will fast schon Pflichtlektüre!) gibt es unter https://redis.io/topics/sentinel
Was bringt mir das?
Mit dem notwendigen Hardware-Einsatz kann man ein System aufbauen in dem ioBroker auf mehreren Hosts verteilt laufen kann und auch die Datenbank verteilt läuft. Die Datenbank ist jetzt "Hochverfügbar". SObald ein Host ausfällt übernimmt ein anderer die Rolle des Datenbank-Masters. Alle Adapter erkennen dies und verbinden sich neu. Alles läuft ohne Unterbrechung weiter und Daten gehen nicht verloren.
Um auch die ioBroker js-controller und Adapter hochverfügbar zu machen fehlen noch ein paar Teile, die in der nächsten Zeit geplant sind.
Sentinel einrichten
Der Redis-Sentinel wird mit
sudo apt-get install redis-sentinel
installiert - auf mindestens 3 Hosts, idealerweise gemeinsam mit den Redis-Prozessen. Die Redis-Prozesse müssen als Master-Slave-System konfiguriert sein und so laufen.
In der Sentinel Konfiguration müssen nun die gleichen Anpassungen beibind
undprotected_mode
wie beim Redis gemacht werden, damit die ioBroker-Hosts auf den Sentinel zugreifen können.
Standardmässig ist der Name für den Master "mymaster". Um dies zu ändern muss der Name bei allen relevanten Einstellungen in der Konfigurationsdatei angepasst werden.
Darüber hinaus sollte man die Einstellungsentinel failover-timeout mymaster 20000
setzen, da sonst ein Failover (Wahl und Umstellung auf einen neuen Master) bis zu 6 Minuten dauern kann und zu einem kurzen Ausfall führt. Mit der Einstellung sollte eine Wahl in maximal 40s erledigt sein.Im Falle eines Ausfalls des Masters braucht der Sentinel ca 20-30s um diesen zu erkennen und eine Wahl zu Starten, welche damit nach 40-70s (je nachdem ob eine oder zwei Abstimmungen nötig sind) erledigt sein sollte. js-controller und Adapter-Prozesse beenden sich nach ca. 90s nach Verbindungsverlust.
Ansonsten fehlt nur die Anpassung der IP des Redis-Masters in der Konfiguration
sentinel monitor mymaster 127.0.0.1 6379 2
. Das Ganze in allen Redis-Sentinel-Konfigurationen. Wer sich wundert: Die Sentinel Prozesse sind untereinander nirgends konfiguriert - diese finden sich über den Redis-Master.Unter
/var/log/redis/redis-sentinel.log
sollten nun alle Slaves ebenfalls mit einem+slave
aufgelistet sein.ioBroker für Redis-Sentinel konfigurieren
Die Konfiguration von ioBroker erfolgt wieder über
iobroker setup custom
. Als Typ muss "redis" gewählt werden. Als "Host" muss nun die Komma-getrennte Liste aller Sentinel-Hosts angegeben werden. Bei Port entweder der Redis-Sentinel-Port (Standard 26739) oder die Komma-getrennte Liste der Ports passend zu den angegebenen Hosts. Die nächste Abfrage gilt dem Sentinel-Master-Namen (Standard: mymaster). Wenn die Daten vorher schon im Redis-System waren, dann ist auch keine Migration nötig.Danach einfach starten und wenn alles korrekt ist erfragt ioBroker beim Sentinel den aktuellen Master und verbindet sich dort hin. Falls ioBroker die Verbindung zum Master verliert wird der aktuelle Master wieder erneut vom Sentinel abgefragt und die Verbindung erneuert. Daten gehen im Normalfall nicht verloren.
Wenn, wie oben angeregt, getrennte Redis-Prozesse für States und Objects/Dateien eingesetzt werden, muss die Sentinel-Konfiguration ebenso verdoppelt werden und eindeutige Sentinel-Master-Namen gewählt werden (z.B. states-master und objects-master). Es muss aber kein zweiter Sentinel installiert werden! Ein Sentinel-Prozess kann mehrere Redis-Master gleichzeitig überwachen. Es kann dann aber dazu kommen das der States-Master und der Objects-Master auf verschiedenen Hosts liegen.
-
Redis FAQ
1. Brauche ich Redis für meinen ioBroker oder nicht?
Für alle üblichen Installationen reichen normalerweise die ioBroker-eigenen Datenbanken vollkommen aus! Erst wenn der js-controller dauerhaft 50-70% oder mehr CPU braucht und sich das System gleichzeitig träge anfühlt kann es Sinn machen sich mit dem Thema Redis zu beschäftigen. Alternativ wird es nötig wenn man ein hochverfügbares ioBroker System anstrebt, aber dazu sich noch einige Dinge mehr nötig.2. Wie finde ich heraus ob ich Redis nutze oder nicht?
Ein Aufruf voniobroker status
zeigt an welcher Datenbanktyp für die States- und Objects-Datenbanken verwendet werden. "file" bedeutet das die ioBroker eigenen Datenbanken genutzt werden. "redis" bedeutet das ein Redis im Einsatz ist. -
Jetzt brauche ich Urlaub.
-
Super Artikel.
Ich war wohl etwas voreilig und habe auch die Objekte auf Redis umgestellt, was bei mir nach Lektüre des Artikels gar nicht sinnvoll ist.
Es läuft und ich habe sogar den Eindruck, dass ich mehr RAM habe, als vorher, was eigentlich nicht sein kann.Kann ich die Speicherung der Objekte unproblematisch wieder auf file umstellen?
Sprich kann ich mit iobroker stepup custom auch wieder zurück auf file bei den Objekten?
Und noch ein zweite Frage. Ist redis mit dem backup Adapter kompatibel?
-
@apollon77
Herzlichen Dank für die (endlich) Aufklärung und die umfangreichen Erklärungen dazu.
Mir ist allerdings etwas aufgefallen.
Die Config liegt bei mir woanders.
nicht/etc/redis/redis-server.conf
sondern
/etc/redis/redis.conf
-
@apollon77 Top, Lesestoff fürs Wochenende
Vielleicht noch als Vorschlag für ein weiteres Kapitel: Die Docker-Fraktion wird dafür wohl einen eigenen Container aufsetzen (läuft bei mir seit 3 Wochen sehr stabil)
-
@Marty56 ja du kannst jederzeit in alle Richtungen mit dem controller 2.0. Auch die Migration funktioniert dann und macht alles so wie es nötig ist.
Der backitup Adapter kann sogar die Redis-DB sichern ... könnte man noch erweitern oben - Ich habe mich nur damit noch nicht beschäftigt.
-
@Chaot Du hast Recht. Aktualisiert!
-
@darkiop Auch ich habe mein Sentinel Test-Setup in LXC-Containern auf Proxmox laufen ... fmit Docker hab ich gerade zu wenig Erfahrung. Wenn jemand einen Text schreibt nehme ich es gern oben mit auf oder (vllt sinnvoller) als extra Thread den wir dann verlinken.
-
@apollon77 sagte in Redis in ioBroker - Überblick:
Der backitup Adapter kann sogar die Redis-DB sichern ... könnte man noch erweitern oben - Ich habe mich nur damit noch nicht beschäftigt.
Wobei der allerdings von einer lokalen Redis Installation ausgeht, @simatec ggf. kann man hier in Zukunft auch aufh "externe" Redis-DBs schauen?
@apollon77 sagte in Redis in ioBroker - Überblick:
Auch ich habe mein Sentinel Test-Setup in LXC-Containern auf Proxmox laufen ... fmit Docker hab ich gerade zu wenig Erfahrung. Wenn jemand einen Text schreibt nehme ich es gern oben mit auf oder (vllt sinnvoller) als extra Thread den wir dann verlinken.
Das strebe ich für die Zukunft evtl. auch noch an - Ein Nuc i3/i5 auf dem denn alles zusammen läuft und nicht mehr auf der Syno 918+. Wobei ich mich an Docker gewöhnt habe und eigentlich sehr zufrieden bin
Viel gibt es da aber auch nicht zu tun. Container mit
docker run -d \ --name iobroker-redis \ --hostname iobroker-redis \ --user=1026 \ --volume /volume2/docker-ssd/iobroker-redis/data:/data \ --network=mac0 \ --ip=192.168.1.86 \ --dns=192.168.1.43 \ --restart=always \ redis:latest
starten (Netzwerk natürlich zuvor auf eigene Umgebung anpassen).
Verbindung zur Redis-DB testen:
docker run -it --network mac0 --rm redis:latest redis-cli -h iobroker-redis
Die Konfiguration des ioBroker erfolgt ja anlog der "lokalen" Redis Installation.
-
@darkiop ich denke das backitup nicht so einfach an das dump file eines externen redis ran kommt oder?!
Bei Docker wäre also der Trick das /var/lib/redis nach außen zu Mappen wie es in deinem Beispiel ist und dann kannst du es so sichern. Und es übersteht auch restarts.
-
@apollon77 sagte in Redis in ioBroker - Überblick:
Bei Docker wäre also der Trick das /var/lib/redis nach außen zu Mappen wie es in deinem Beispiel ist und dann kannst du es so sichern. Und es übersteht auch restarts.
Du meinst /data (vom redis Contrainer) nach /var/lib/redis in den ioBroker Container zuhängen? Das kann ich gerne mal probieren. Mit meiner jetztigen Config übersteht /data aber auch restarts.
-
@darkiop ich denke das data Volume von deinem Container ist genau das was ich meine. Alles gut. Wenn da eine dump.rdb drin ist passts
-
@apollon77 sagte in Redis in ioBroker - Überblick:
@darkiop ich denke das backitup nicht so einfach an das dump file eines externen redis ran kommt oder?!
Bei Docker wäre also der Trick das /var/lib/redis nach außen zu Mappen wie es in deinem Beispiel ist und dann kannst du es so sichern. Und es übersteht auch restarts.
Es wäre auf jeden Fall eine Überlegung, das mit in backitup aufzunehmen oder.
Bisher unterstützt backitup die lokale Sicherung der redis db -
@simatec die Frage ist halt wie du an das dump rankommet. Wenn das geht dann ist es nur ein file.
-
@apollon77
Da gebe ich dir recht ... wie könnten wir Systemübergreifend hier einen Zugriff hinbekommen?Aktuell fällt mir ohne Freigaben des auf dem externen System nix ein 🧐
-
@simatec Ich denke das ich dann sehr schnell sehr vielfältig. Aber ja irgendwie Freigaben
-
danke für den Link
-
ich habe aus Neugier auch mal Redis installiert. Unter Windows 10 geht das auch mit WSL, ich habe die Ubuntu 18.04 Tools installiert und mit 'sudo apt install redis' bekommt man eine Version 4.0.9. Ist die aktuell genug? Ich hatte zuerst die 5.0.7 von der redis website installiert und kompiliert, damit läuft ioBroker auch komplett lokal unter Win10.
Wenn auf redis umgestellt ist und der server nicht läuft, dann startet der ioBroker Dienst nicht. Bzw. beendet wohl mit Fehler den er nicht anzeigt, nur im EventLog taucht eine Warning auf das der Controller beendet wurde. -
@JojoS 4.0.9 ist "ok" ... 5.x besser Und ja wenn Du Redis nutzt muss das auch da sein, sonst startet der controller nicht.