Redis Sentinel – Hochverfügbarkeit: Alles, was Sie von DEV bis PROD wissen müssen: Vollständiger Leitfaden

Was bedeutet der Begriff ‚Redis‘ eigentlich?

Es bedeutet REmote DIctionary Server.

Alles klar! Es gibt viele verschiedene Redis-Artikel, aber ich wollte meine Erfahrungen als Entwickler mit Redis teilen, indem ich einen „All-in-One-Artikel“ erstellt habe, der die wichtigsten und wichtigsten Dinge abdeckt, die für einen Entwickler oder einen Devops-Ingenieur benötigt und hilfreich sind, um einen hochverfügbaren Redis-Cluster mit Sentinel zu erstellen.

Also fangen wir an …

Redis, ein Open Source In Memory Data Structure Store, ist eine sehr beliebte Auswahl unter Entwicklern, die für Caching-Zwecke, als Message Broker und hauptsächlich als NoSQL-Schlüssel-Wert-Datenbank für verschiedene Anwendungsfälle verwendet wird.

In diesem Beitrag werde ich speziell über Redis zusammen mit Master / Slave-Replikation, Hochverfügbarkeit (Redis Sentinel), automatischem Failover, einigen Tipps zur Optimierung der Produktionsebene und Überwachungsaspekten diskutieren und demonstrieren. Zusätzlich zu diesen Themen werde ich die Probleme und Fehler erwähnen, mit denen ich während der Implementierung von Redis Sentinel mit Ubuntu konfrontiert war. Im Folgenden werden die Details zur Betriebssystemversion und zur Redis-Version angezeigt.

OS version: Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-119-generic x86_64)
Redis Version: 4.0.9

Zusätzlich möchte ich hervorheben, dass die Redis-Dokumentation sehr informativ ist und es ‚the go to place‘ ist, wenn Sie weitere Erläuterungen zu Redis benötigen.

Vorwärts zu den Redis-Grundlagen; Redis ist eine In-Memory-Datenbank, was einfach bedeutet, dass Redis auf RAM ausgeführt wird. Sie müssen auch wissen, dass Redis mehrere Datenstrukturen wie Strings, Hashes, Listen, Sets, sortierte Sets mit Bereichsabfragen, Bitmaps unterstützt. Darüber hinaus unterstützt es auch atomare Operationen wie das Anhängen an eine Zeichenfolge, das Inkrementieren des Werts in einem Hash, das Verschieben eines Elements in eine Liste usw.

Nun, lassen Sie uns mit Redis High Availability beginnen.

Redis Sentinel ist die Hochverfügbarkeitslösung von Redis. Im Falle eines Fehlers in Ihrem Redis-Cluster erkennt Sentinel automatisch den Fehlerpunkt und bringt den Cluster ohne menschliches Eingreifen wieder in den stabilen Modus.

Was passiert wirklich in Redis Sentinel?

Sentinel überprüft immer die MASTER- und SLAVE-Instanzen im Redis-Cluster und überprüft, ob sie wie erwartet funktionieren. Wenn Sentinel einen Fehler im MASTER-Knoten in einem bestimmten Cluster erkennt, startet Sentinel einen Failover-Prozess. Infolgedessen wählt Sentinel eine SLAVE-Instanz aus und befördert sie zum MASTER. Letztendlich werden die anderen verbleibenden SLAVE-Instanzen automatisch neu konfiguriert, um die neue MASTER-Instanz zu verwenden.

Sentinel fungiert als Konfigurationsanbieter oder als Berechtigungsquelle für die Erkennung von Client-Diensten.

Was bedeutet das ? Anwendungsclients stellen einfach eine Verbindung zu den Sentinels her, und Sentinels stellen ihnen die neueste Redis-Masteradresse zur Verfügung.

Darüber hinaus ist Sentinel ein robustes verteiltes System, bei dem mehrere Sentinel zustimmen müssen, dass ein bestimmter Master nicht mehr verfügbar ist. Dann beginnt nur der Failover-Prozess ein Wählen Sie einen neuen MASTER-Knoten. Diese Sentinel-Vereinbarung erfolgt gemäß dem Quorumwert.

Was ist Quorum ?

Der Quorumwert ist die Anzahl der Wächter, die zustimmen müssen, dass der Master nicht erreichbar ist. Das Quorum wird jedoch nur verwendet, um den Fehler zu erkennen. Um ein Failover tatsächlich durchführen zu können, muss einer der Sentinels zum Anführer für das Failover gewählt und zum Fortfahren autorisiert werden. Dies geschieht nur mit der Stimme der Mehrheit der Sentinel-Prozesse.

Machen wir uns mit Redis Sentinel die Hände schmutzig.

Wir bleiben beim Basic Setup mit 3 Server Instanzen.

Bitte beachten Sie das obige Diagramm, das die grundlegende Einrichtung der 3 Serverinstanzen veranschaulicht. Stellen Sie zunächst sicher, dass Ihre Ubuntu-Instanzen mit relevanten Build-Abhängigkeiten auf dem neuesten Stand sind. Manchmal benötigen Sie möglicherweise auch jemalloc. Im Folgenden werden die Schritte zum Installieren von Redis auf Ihren Serverinstanzen angezeigt.

sudo apt-get update 
sudo apt-get install build-essential tcl
sudo apt-get install libjemalloc-dev (Optional)curl -O http://download.redis.io/redis-stable.tar.gz
tar xzvf redis-stable.tar.gz
cd redis-stable
make
make test
sudo make install

Jetzt sollten Sie im Redis-Verzeichnis beide Redis sehen können.conf und Sentinel.conf-Konfigurationsdateien.

Bevor wir Redis ausführen, führen wir einige notwendige Grundkonfigurationen durch, um einen Redis-Cluster einzurichten und auszuführen. Im Folgenden sind die IP-Adressen dieses Setups aufgeführt.

10.52.209.46 (Initial Master Node)
10.52.209.47 (Initial Slave Node)
10.52.209.49 (Initial Slave Node)

Der Standardport für Redis Server ist 6379 und Sentinel ist 26379. Stellen Sie daher sicher, dass Sie diesen Port mit öffnen,

sudo ufw allow 6379
sudo ufw allow 26379

Die Redis-Konfigurationen (beide in redis.conf und Sentinel.conf) in den obigen Servern sollte wie folgt konfiguriert werden.

Für die Grundeinstellung reichen die obigen Konfigurationen aus, aber für die Produktionsebene beachten Sie bitte die Tipps, die im letzten Teil dieses Beitrags erwähnt werden. Der einzige Unterschied in Redis.conf-Dateien in 3 Servern ist, dass alle Slaves die folgende Konfiguration haben müssen. 10.52.209.46 ist die Master-IP-Adresse.

slaveof 10.52.209.46 6379

slaveof weist Redis cluster an, diese bestimmte Serverinstanz als SLAVE-Instanz des angegebenen Masterknotens (10.52.209.46) zu erstellen.

In Wächter.conf, folgende Konfiguration Benachrichtigen Sie Sentinels, um die Clusterüberwachung mit den folgenden Anfangseinstellungen zu starten. Danach kann diese Konfigurationseinstellung automatisch entsprechend aktualisiert werden.

sentinel monitor mymaster 10.52.209.46 6379 2
(This tells sentinel to monitor the master node. And the last argument which is 2 is the quorum value)

Weiter, Wächter.conf enthält auch die folgenden Konfigurationswerte.

sentinel down-after-milliseconds mymaster 5000
(Means server will unresponsive for 5 seconds before being classified as +down and consequently activating a +vote to elect a new master node.)sentinel failover-timeout mymaster 10000
(Specifies the failover timeout in milliseconds.)

Okie Dokie! Jetzt … Lassen Sie uns Redis ausführen.

Es gibt viele Möglichkeiten, Redis auszuführen. In dieser Demo werde ich mich an den folgenden Befehl halten.

(Go to src folder.)
cd src/ && redis-server ../redis.conf &
cd src/ && redis-server ../sentinel.conf — sentinel &(Or else you can simply use cd utils && ./install_server.sh.)

Danach können Sie einfach die Redis-Prozesse über den Befehl ps -ef | grep redis überprüfen. Jede Serverinstanz sollte sowohl einen Redis-Prozess als auch einen Sentinel-Prozess ausführen. Wenn alles nach Plan läuft, sollten 2 Prozesse wie folgt ausgeführt werden.

Stellen Sie nun über einen der folgenden Befehle eine Verbindung zum Redis-Client her und testen Sie, ob Redis einwandfrei funktioniert.

redis-cli ping
or
redis-cli -h IP_Address pingYou should get a output of PONG.

Großartig! Jetzt haben Sie Redis zum Laufen gebracht. Konzentrieren wir uns auf die Master / Slave-Replikation.

Master / Slave-Replikation

Jetzt, wenn Sie die Redis überprüfen.log (das sich an der Stelle befindet, die wir in Redis definiert haben.conf) der einzelnen Instanzen können Sie die Master -Slave-Synchronisation sehen.

Master-Knoten – redis.anmelden

Slave-Knoten – redis.anmelden

Überprüfen des Replikationsstatus

Sie können die Replikationsinformationen auch über den Befehl info replication in Redis CLI überprüfen. Unter dem Rollenattribut wird angegeben, ob dieser bestimmte Knoten ein MASTER oder ein SLAVE ist (gelbes Feld).Außerdem werden im Master-Knoten die Details aller angeschlossenen Slaves angezeigt. (green box)

Nun wollen wir untersuchen, was Sentinel.loggen Sie sich ein. (die sich an der Stelle befindet, die wir im Sentinel definiert haben.conf)

Außerdem, wenn Sie den Sentinel überprüfen.conf-Datei, Sie können sehen, dass die conf-Datei automatisch mit den neuesten Konfigurationen aktualisiert wird, einschließlich der Werte sentinel known-slave und Sentinel known-sentinel.

Cool! Erstellen wir nun einen Beispielwert in allen Knoten.

127.0.0.1:6739> set demokey "Amila"

Wie Sie im obigen Diagramm sehen können, sind SLAVES SCHREIBGESCHÜTZT, daher können Sie nur Daten in den Master schreiben. Da Redis asynchron mit allen verbleibenden Slaves repliziert, können Sie den eingefügten Wert von allen Redis-Slaves mit demselben angegebenen Schlüssel abrufen. Zusätzlich können Sie überKEYS* alle eingefügten Schlüssel auflisten. Das obige Diagramm beschreibt deutlich, worüber wir gerade gesprochen haben.

Lassen Sie uns nun überprüfen, wie das automatische Failover von Redis Sentinel funktioniert.

Automatisches Failover von Redis Sentinel

Okiee! Lassen Sie uns ein automatisches Failover-Szenario simulieren. Um ein Failover-Szenario zu simulieren, können Sie einfach den Redis-Server stoppen oder den Redis-Prozess in der MASTER-Instanz beenden. Sogar Sie können den Redis-Prozess schlafen. Sie können wählen, was auch immer die Art und Weise, die Sie wünschen.

kill -9 <process id>
or
redis-cli -p 6379 DEBUG sleep 30
or
redis-cli -p 6379 DEBUG SEGFAULT

Wie im obigen Diagramm dargestellt, bestimmen in einem Failover-Szenario, wenn der MASTER-Knoten ausfällt, die 2 verbleibenden Sentinels das Failover, und wenn beide zustimmen (da der Quorumwert 2 ist), wird ein neuer MASTER aus diesen 2 verbleibenden Knoten ausgewählt.

Im Folgenden wird der Protokoll-Tail für dieses Failover-Szenario angezeigt.

redis.protokoll der Slave-Knoten.

sentinel.protokoll der Slave-Knoten

Überprüfen wir nun den Replikationsstatus über den Befehl info replication.

Weitere Ausarbeitung des Log Tail,

Jeder Sentinel erkennt, dass der Master mit einem +sdown -Ereignis ausgefallen ist. (+ sdown bedeutet, dass sich die angegebene Instanz jetzt im subjektiven Down-Zustand befindet.)

+new-epoch bedeutet, dass die aktuelle Epoche aktualisiert wurde.Das Ereignis

+sdown wird später zu +odown eskaliert, was bedeutet, dass sich mehrere Wächter darüber einig sind, dass der Master nicht erreichbar ist. (+odown bedeutet, dass sich die angegebene Instanz jetzt im Down-Zustand befindet.)

Sentinels +vote ein Sentinel, der den ersten Failover-Versuch startet.

Das Failover findet statt.

Des Weiteren, folgende Shows upstart Jobs.

Upstart für Redis

description "Redis Server"start on runlevel 
stop on runlevel script
echo $$ > /var/run/redis.pid
su - amila -c "cd /home/amila/redis-stable/src/; redis-server ../redis.conf"
end scriptpost-stop script
rm -f /var/run/redis.pid
end script

Upstart für Sentinel

description "Redis Sentinel Server"start on runlevel 
stop on runlevel script
echo $$ > /var/run/redis.pid
su - amila -c "cd /home/amila/redis-stable/src/; redis-server ../sentinel.conf --sentinel"
end scriptpost-stop script
rm -f /var/run/redis.pid
end script

Herzlichen Glückwunsch! Das ist es einfach. So behandelt Redis Hochverfügbarkeit und automatisches Failover. Schauen wir uns nun einige interessante Redis-Fakten an, bevor wir uns mit Tipps und Tricks zur Optimierung befassen.

Interessante Fakten über Redis.

Bild Referenz: http://download.redis.io/logocontest/

Redis kann bis zu 2 32 Schlüssel verarbeiten und wurde in der Praxis getestet, um mindestens 250 Millionen Schlüssel pro Instanz zu verarbeiten.

Eine leere Instanz belegt ~ 3 MB Arbeitsspeicher.

1 Million kleine Schlüssel -> String-Wertepaare verwenden ~ 85 MB Speicher.

1 Million Schlüssel -> Hashwert, der ein Objekt mit 5 Feldern darstellt, verwendet ~ 160 MB Speicher.

Redis ist Single Threaded. Wie kann ich mehrere CPU / Kerne ausnutzen?

Es ist nicht sehr häufig, dass die CPU zu Ihrem Engpass bei Redis wird, da Redis normalerweise entweder an Speicher oder an das Netzwerk gebunden ist. Wenn dies der Fall ist, hilft die horizontale oder vertikale Skalierung von Redis-Instanzen, CPU-bezogene Engpässe zu reduzieren.

Redis ist eine speicherinterne, aber persistente Datenbank auf der Festplatte.

Redis-Persistenz ->RDB : point-in-Time-Snapshots Ihres Datensatzes in bestimmten Intervallen. (Datensicherung) | AOF : Protokolliert jeden vom Server empfangenen Schreibvorgang. (Langlebiger)

Wenn Sie Java verwenden, können Sie Jedis, einen Java-Client, verwenden, um Ihre Java-Anwendung mit Redis zu verbinden. Hinweis: Jedis verwendet Apache Commons Pool für das Verbindungspooling (GenericObjectPool). A single Jedis instance is not threadsafe! Um diese Probleme zu vermeiden, sollten Sie JedisPool verwenden, einen threadsicheren Pool von Netzwerkverbindungen. Die maximale Größe des Verbindungspools beträgt standardmäßig 8.

Konzentrieren wir uns nun auf die Probleme / Fehler, die auftreten können, und einige Tipps und Tricks zur Optimierung der Produktionsleistung für Redis.

Probleme / Fehler, die Sie möglicherweise erhalten & Tipps und Tricks zur Optimierung der Produktionsleistung

Zunächst im Redis.conf und Sentinel.conf, alle Konfigurationen sind in einer Reihenfolge, also vermasseln Sie die Reihenfolge nicht. Andernfalls erhalten Sie Konfigurationsfehler wie folgt.

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 98
>>> 'sentinel down-after-milliseconds mymaster 5000'
No such master with specified name.

Richten Sie aus Sicherheitsgründen ein Kennwort ein, um sich bei Master und Slaves zu authentifizieren. Dazu können Sie ganz einfach die Redis ändern.conf und Sentinel.conf entsprechend mit folgendem Konfigurationswert.

In sentinel.conf
sentinel auth-pass <master-name> <password>In redis.conf
masterauth <master-password>

Stellt sicher, dass die TCP-Backlog-Einstellung (Maximale Verbindungen) 511 ist. Sie können diesen Wert entsprechend (unter Berücksichtigung Ihrer Serverspezifikation) mit den folgenden Schritten festlegen.

sudo nano /etc/rc.local
Add this:
sysctl -w net.core.somaxconn=65535When you reboot the next time, the new setting will be to allow 65535 connections instead of 128 as before. When you add the line to rc.local make sure it's before the exit 0.

Einige der Warnungen, die Sie möglicherweise von Redis erhalten.log könnte sein,

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.You can add this via following command as well as using a cat command you can makesure whether the value is set properly.echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
cat /etc/sysctl.conf

Möglicherweise müssen Sie THP oder Transparent Huge Page deaktivieren.

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.Fixsudo nano /etc/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled

Die Verwendung des UNIX-Sockets anstelle des TCP-Ports 6379 trägt ebenfalls zum Leistungsgewinn von Redis bei.

Referenz: https://redis.io/topics/benchmarks

Um dies zu erreichen, redis.conf sollte in folgende Einstellung geändert werden.

unixsocket /var/run/redis.sock
unixsocketperm 777# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 0

Zusätzlich können Sie je nach Anwendungsfall auch die Redis-Persistenzoption konfigurieren.

Wenn Sie möchten, können Sie die Persistenz überhaupt deaktivieren, wenn Ihre Daten nur so lange existieren sollen, wie der Server ausgeführt wird. Hinweis: Sie können die RDB-Persistenz deaktivieren, indem Sie alle „Speichern“ -Zeilen in redis auskommentieren.conf wie folgt.

Comment out these 3 values in redis.conf
save 900 1
save 300 10
save 60 10000rdbcompression no
rdbchecksum no

Die AOF-Persistenz (nur Datei anhängen) ist in Redis standardmäßig deaktiviert.conf.

appendonly no

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

Überwachung von Redis

Aus Überwachungsperspektive gibt es mehrere Tools zur Überwachung von Redis. NewRelic bietet erweiterte Funktionen zur Überwachung und Analyse von Redis, einschließlich „Meiste Zeit verbrauchte DB-Vorgänge“, „Vorgänge nach Durchsatz“, „Vorgänge nach Abfragezeit“ usw.

Weitere Informationen zu New Relic Redis finden Sie hier. Darüber hinaus ist Redis-stat auch ein gutes Opensource-Redis-Überwachungstool.

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

AWS ElasticCache

AWS bietet auch einen In-Memory-Cache-Cloud-Service namens „ElastiCache“ an, der auch mit Redis geliefert wird. Es kann als effektiver, benutzerfreundlicher Cloud-Dienst angegeben werden, der die meisten manuellen Konfigurationen und administrativen Aufgaben entlastet.

ElastiCache ist ein Webdienst, der das Starten, Verwalten und Skalieren eines verteilten In-Memory-Caches in der Cloud erleichtert.

Interessanterweise wird es mit fabelhaften erweiterten Funktionen wie dem Cluster-Modus mit Sharding innerhalb weniger Klicks, Multi-AZ mit Auto-Failover, Verschlüsselung im Ruhezustand, Verschlüsselung während der Übertragung, Import von RDB-Dateien in S3, Aktivierung automatischer Sicherungen und vielem mehr ausgeliefert.

Das coolste Merkmal von AWS ElastichCache ist, dass es ein umfassendes Überwachungs-Dashboard für Ihren Redis-Cluster bietet, einschließlich Überwachungsaspekten wie CPU / Speicherauslastung (Swap und freier Speicher), Verbindungsanzahl, Elementanzahl, Räumungen, Zeichenfolge; Schlüssel; Hash-basierte Befehlsanzahl, Replikationsverzögerung und vieles mehr.

Nun … Das war’s so ziemlich für diesen Beitrag!

Wie ich am Anfang dieses Beitrags erwähnt habe, gibt es viele verschiedene Redis-Artikel, aber ich wollte einen „All-in-One-Artikel“ erstellen, der die wichtigsten Fakten und Tipps enthält, die für einen Entwickler oder Devops-Ingenieur erforderlich und hilfreich sind, um einen hochverfügbaren Redis-Cluster mit Sentinel zu erstellen.

Bevor ich diesen Beitrag beendete, war einer der interessanten Artikel, die ich fand, wie Flickr Redis Sentinel implementierte. Bitte überprüfen Sie auch diesen Beitrag.

OK. Vielen Dank, dass Sie diesen Artikel gelesen haben, und ich freue mich darauf, bald einen weiteren interessanten Artikel zu veröffentlichen, in dem ich meine Erfahrungen als Entwickler teile. Bis dahin, Prost! und Happy Coding!