Redis Sentinel ist die offizielle Empfehlung zum Ausführen einer hochverfügbaren Redis-Konfiguration, indem eine Reihe zusätzlicher Redis Sentinel-Prozesse ausgeführt werden, um vorhandene Redis-Master- und -Slave-Instanzen aktiv zu überwachen und sicherzustellen, dass sie alle wie erwartet funktionieren. Wenn durch Konsens festgestellt wird, dass der Master nicht mehr verfügbar ist, wird automatisch ein Failover durchgeführt und einer der replizierten Slaves als neuer Master hochgestuft. Die Sentinels führen auch eine maßgebliche Liste verfügbarer Redis-Instanzen, die Clients ein zentrales Repository zur Verfügung stellen, um verfügbare Instanzen zu finden, mit denen sie sich verbinden können.
Unterstützung für Redis Sentinel ist mit RedisSentinel
verfügbar -Klasse, die auf die verfügbaren Sentinels hört, um ihre Liste verfügbarer Master-, Slave- und anderer Sentinel-Redis-Instanzen abzurufen, mit denen sie die Redis-Client-Manager konfiguriert und verwaltet, und alle Failover einleitet, sobald sie gemeldet werden.
Nutzungsnummer
Um die neue Sentinel-Unterstützung zu verwenden, würden Sie, anstatt die Redis-Client-Manager mit der Verbindungszeichenfolge der Master- und Slave-Instanzen zu füllen, ein einzelnes RedisSentinel
erstellen Instanz konfiguriert mit der Verbindungszeichenfolge der laufenden Redis Sentinels:
var sentinelHosts = new[]{ "sentinel1", "sentinel2:6390", "sentinel3" };
var sentinel = new RedisSentinel(sentinelHosts, masterName: "mymaster");
Dies zeigt ein typisches Beispiel für die Konfiguration eines RedisSentinel
die auf 3 Sentinel-Hosts verweist (d. h. die Mindestanzahl für ein hochverfügbares Setup, das jeden Knotenausfall überstehen kann). Es ist auch so konfiguriert, dass es sich mymaster
ansieht Konfigurationssatz (die Standard-Master-Gruppe).
INFO
Redis Sentinels können mehr als 1 Master-/Slave-Gruppe überwachen, jede mit einem anderen Master-Gruppennamen.
Der Standardport für Sentinels ist 26379 (wenn nicht angegeben) und da RedisSentinel andere Sentinels automatisch erkennen kann, ist die erforderliche Mindestkonfiguration nur:
var sentinel = new RedisSentinel("sentinel1");
INFO
Das Scannen und automatische Erkennen anderer Sentinels kann mit ScanForOtherSentinels=false
deaktiviert werden
Starten Sie die Überwachung von Sentinels #
Nach der Konfiguration können Sie mit der Überwachung der Redis Sentinel-Server beginnen und auf den vorkonfigurierten Client-Manager zugreifen mit:
IRedisClientsManager redisManager = sentinel.Start();
Welcher wie bisher in Ihrem bevorzugten IOC als Singleton registriert werden kann Beispiel:
container.Register<IRedisClientsManager>(c => sentinel.Start());
Erweiterte Sentinel-Konfiguration #
RedisSentinel verwaltet standardmäßig einen konfigurierten PooledRedisClientManager
-Instanz, die beide Master-Redis-Clients für Lese-/Schreibvorgänge GetClient()
auflöst und Slaves für readonly GetReadOnlyClient()
APIs.
Dies kann geändert werden, um den neueren RedisManagerPool
zu verwenden mit:
sentinel.RedisManagerFactory = (master,slaves) => new RedisManagerPool(master);
Benutzerdefinierte Redis-Verbindungszeichenfolge #
Der Host, mit dem RedisSentinel konfiguriert ist, gilt nur für diesen Sentinel-Host. Sie können weiterhin die Flexibilität von Redis Connection Strings nutzen, um die einzelnen Redis-Clients zu konfigurieren, indem Sie einen benutzerdefinierten HostFilter
angeben :
sentinel.HostFilter = host => "{0}?db=1&RetryTimeout=5000".Fmt(host);
Dadurch werden Clients zurückgegeben, die für die Verwendung von Datenbank 1 und einem Wiederholungs-Timeout von 5 Sekunden konfiguriert sind (wird in der neuen Funktion „Automatische Wiederholung“ verwendet).
Andere RedisSentinel-Konfiguration #
Während das Obige die beliebte Sentinel-Konfiguration abdeckt, die normalerweise verwendet wird, wird fast jeder Aspekt von RedisSentinel
behandelt Verhalten ist mit der folgenden Konfiguration anpassbar:
OnSentinelMessageReceived | Wird ausgelöst, wenn der Sentinel-Arbeiter eine Nachricht vom Sentinel-Abonnement erhält |
Bei Failover | Wird ausgelöst, wenn Sentinel den Redis Client Manager auf einen neuen Master umschaltet |
OnWorkerError | Wird ausgelöst, wenn die Redis Sentinel Worker-Verbindung fehlschlägt |
IpAddressMap | Ordnen Sie interne Redis-Host-IPs, die von Sentinels zurückgegeben werden, seinen externen IPs zu |
ScanForOtherSentinels | Ob routinemäßig nach anderen Sentinel-Hosts gesucht werden soll (standardmäßig wahr) |
RefreshSentinelHostsAfter | In welchem Intervall soll nach anderen Sentinel-Hosts gesucht werden (standardmäßig 10 Minuten) |
WaitBetweenFailedHosts | Wie lange nach einem Fehler gewartet werden soll, bevor eine Verbindung zur nächsten Redis-Instanz hergestellt wird (standardmäßig 250 ms) |
MaxWaitBetweenFailedHosts | Wie lange soll erneut versucht werden, eine Verbindung zu Hosts herzustellen, bevor ein Fehler ausgelöst wird (standardmäßig 60 Sekunden) |
WaitBeforeForcingMasterFailover | Wie lange nach aufeinanderfolgenden fehlgeschlagenen Versuchen, ein Failover zu erzwingen (Standard 60s) |
ResetWhenSubjectivelyDown | Setzen Sie Clients zurück, wenn Sentinel meldet, dass Redis subjektiv ausgefallen ist (Standardeinstellung wahr) |
ResetWhenObjectivelyDown | Setzen Sie Clients zurück, wenn Sentinel meldet, dass Redis objektiv ausgefallen ist (standardmäßig wahr) |
SentinelWorkerConnectTimeoutMs | Die maximale Verbindungszeit für Sentinel Worker (Standard 100 ms) |
SentinelWorkerSendTimeoutMs | Maximale TCP-Socket-Sendezeit für Sentinel Worker (Standard 100 ms) |
SentinelWorkerReceiveTimeoutMs | Max. TCP-Socket-Empfangszeit für Sentinel Worker (Standard 100 ms) |
Redis Sentinel-Server konfigurieren #
Das redis config-Projekt vereinfacht das Einrichten und Ausführen einer hochverfügbaren Redis Sentinel-Konfiguration mit mehreren Knoten, einschließlich Start-/Stopp-Skripts zum sofortigen Einrichten der minimalen hochverfügbaren Redis Sentinel-Konfiguration auf einem einzelnen (oder mehreren) Windows-, OSX- oder Linux-Servern. Diese Single-Server/Multi-Process-Konfiguration ist ideal für die Einrichtung einer funktionierenden Sentinel-Konfiguration auf einer einzelnen Entwickler-Workstation oder einem Remote-Server.
Das Redis-Config-Repository enthält auch die Redis-Binärdateien von MS OpenTech Windows und erfordert keine Softwareinstallation.
Windows-Nutzungsnummer
Um die enthaltene Sentinel-Konfiguration auszuführen, klonen Sie das redis-config-Repository auf dem Server, auf dem Sie es ausführen möchten:
git clone https://github.com/ServiceStack/redis-config.git
Starten Sie dann 1x Master, 2x Slaves und 3x Sentinel Redis-Server mit:
cd redis-config\sentinel3\windows
start-all.cmd
Gestartete Instanzen herunterfahren:
stop-all.cmd
Wenn Sie die Redis-Prozesse lokal auf Ihrer Entwicklungs-Workstation ausführen, ist die minimale Konfiguration zum Herstellen einer Verbindung zu den laufenden Instanzen einfach:
var sentinel = new RedisSentinel("127.0.0.1:26380");
container.Register(c => sentinel.Start());
Localhost vs. Netzwerk-IP-Nummern
Die Sentinel-Konfiguration geht davon aus, dass alle Redis-Instanzen lokal auf 127.0.0.1 ausgeführt werden . Wenn Sie es stattdessen auf einem Remote-Server ausführen, auf den alle Entwickler in Ihrem Netzwerk zugreifen können sollen, müssen Sie entweder die IP-Adresse in der *.conf
ändern Dateien, um die Netzwerk-IP des Servers zu verwenden. Andernfalls können Sie die Standardeinstellungen belassen und den RedisSentinel
verwenden IP-Adresszuordnungsfunktion, um lokale Host-IPs transparent der Netzwerk-IP zuzuordnen, mit der sich jeder PC in Ihrem Netzwerk verbinden kann.
Z.B. wenn dieser auf einem entfernten Server mit 10.0.0.9 läuft Netzwerk-IP, kann konfiguriert werden mit:
var sentinel = new RedisSentinel("10.0.0.9:26380") {
IpAddressMap = {
{"127.0.0.1", "10.0.0.9"},
}
};
container.Register(c => sentinel.Start());
Google Cloud – Click to Deploy Redis #
Der einfachste Cloud-Dienst, den wir gefunden haben, der sofort eine Redis-Sentinel-Konfiguration mit mehreren Knoten einrichten kann, ist die Verwendung der Click-to-Deployment-Redis-Funktion von Google Cloud, die in der Google Cloud-Konsole unter Bereitstellen und Verwalten verfügbar ist :
Klicken Sie auf Bereitstellen Mit der Schaltfläche können Sie den Typ, die Größe und den Ort konfigurieren, an dem Sie die Redis-VMs bereitstellen möchten. Sehen Sie sich den vollständigen Click-to-Deploy-Leitfaden für Redis an, um eine Anleitung zum Einrichten und Prüfen einer hochverfügbaren Redis-Konfiguration in Google Cloud zu erhalten.
Änderung zur Verwendung von RedisManagerPool #
Standardmäßig verwendet RedisSentinel einen PooledRedisClientManager
, kann dies geändert werden, um den neueren RedisManagerPool
zu verwenden mit:
sentinel.RedisManagerFactory = (master,replicas) => new RedisManagerPool(master);
Starten Sie die Überwachung von Sentinels #
Nach der Konfiguration können Sie mit der Überwachung der Redis Sentinel-Server beginnen und auf den vorkonfigurierten Client-Manager zugreifen mit:
IRedisClientsManager redisManager = sentinel.Start();
Welcher wie bisher in Ihrem bevorzugten IOC als Singleton registriert werden kann Beispiel:
container.Register<IRedisClientsManager>(c => sentinel.Start());
Redis Sentinel-Server konfigurieren #
Sehen Sie sich das Redis-Konfigurationsprojekt an, um schnell die minimale hochverfügbare Redis Sentinel-Konfiguration einzurichten, einschließlich Start-/Stopp-Skripts zum sofortigen Ausführen mehrerer Redis-Instanzen auf einem einzelnen (oder mehreren) Windows-, OSX- oder Linux-Servern.
Redis-Statistiken #
Sie können die RedisStats
verwenden -Klasse für Sichtbarkeit und Selbstprüfung Ihrer laufenden Instanzen. Das Redis-Statistik-Wiki listet die verfügbaren Statistiken auf.
Automatische Wiederholungen #
Um die Belastbarkeit von Client-Verbindungen zu verbessern, RedisClient
wird fehlgeschlagene Redis-Vorgänge aufgrund von Socket- und E/A-Ausnahmen in einem exponentiellen Backoff ab 10 ms transparent wiederholen bis zum RetryTimeout
von 10000 ms . Diese Standardeinstellungen können angepasst werden mit:
RedisConfig.DefaultRetryTimeout = 10000;
RedisConfig.BackOffMultiplier = 10;