Redis-Skalierung und Failover für DirectumRX-Dienste

Redis ist ein Datenbankverwaltungssystem der NoSQL-Klasse (nicht relationale DBMS), das vollständig im RAM abgelegt ist. Für den Zugriff auf die Daten wird das Modell „Schlüssel“ - „Wert“ verwendet. Ein solches DBMS wird häufig zum Speichern von Caches in skalierbaren Diensten, zum Speichern von Bildern und kleinen Daten verwendet.

Redis DBMS ist weit verbreitet aufgrund von:

  • hohe Geschwindigkeit, weil Alle Daten werden im RAM gespeichert.
  • plattformübergreifend;
  • Vertrieb unter der BSD-Lizenz (gilt für Open Source-Software).

Die Verbreitung und Anwendbarkeit von Redis lässt sich anhand der umfangreichen Dokumentation mit allen Arten von Fällen auf der offiziellen Website des Projekts abschätzen.

Wenn Sie die horizontale Skalierung von DirectumRX-Diensten verwenden, müssen Sie die ausfallsichere Redis-Installation verwenden, um ordnungsgemäß mit dem DirectumRX-Speicherdienst und dem DirectumRX-Webzugriffsdienst zu arbeiten.

Bild

Redis speichert Betriebsdaten, Caches und andere Informationen, die für den Betrieb von Diensten im Skalierungsmodus erforderlich sind, damit der Prozess der Benutzerinteraktion mit dem System nicht von der Installation abhängt, mit der er gerade arbeitet.

Redis speichert keine sensiblen Daten und ist nicht stark ausgelastet. Im Falle eines Redis-Fehlers treten beim Wechseln zwischen Installationen jedoch viele Fehler auf.

Auf der offiziellen Redis-Website gibt es zwei Möglichkeiten, um horizontale Skalierung und Fehlertoleranz sicherzustellen:

  1. Mit Redis Sentiel .
  2. Redis Cluster verwenden .

Ziehen Sie in Betracht, diese Optionen anzupassen.

Konfigurieren Sie Redis Sentiel


Die Option zur Verwendung des Redis Sentiel (Redis Tracking Node) wurde in Redis 2.4 implementiert und besteht darin, den zusätzlichen Redis Sentiel-Dienst zur Überwachung der Verfügbarkeit des Assistenten zu verwenden. Er führt auch die Konfiguration von Replikatknoten durch, falls der Assistent ausfällt. Legt fest, welcher der SLAVE-Knoten zu MASTER wird, und führt die Neukonfiguration unterwegs durch.

Implementiert das klassische Schema:

Bild

Es kann viele SLAVE-Knoten geben (laut offizieller Website bis zu 1000). Für produktive Arbeit wird empfohlen, mindestens zwei SLAVE-Knoten zu verwenden.

In der Regel ist das Schema so konfiguriert, dass der Redis Sentiel-Dienst auf den Knoten MASTER und SLAVE konfiguriert ist. Wenn der Knoten MASTER ausfällt, entscheiden sich die verbleibenden Überwachungsknoten für die Einführung eines neuen MASTER.

Die aktuelle Version von Redis kann von der offiziellen Website des Produktentwicklers heruntergeladen werden. Die Distributionsseite ist jedoch nur für Linux verfügbar. Zu einer Zeit wurde das Microsoft- Projekt für die Portierung von Redis auf Windows entwickelt, aber derzeit hat das Projekt die Entwicklung auf Version 3.2.100 gestoppt. In diesem Artikel werden wir daher die relevanteste Bereitstellungsoption betrachten - unter Linux.

Als Testknoten werden wir zwei virtuelle Hosts redis1 und redis2 mit der installierten Linux-Distribution von Debian 10 verwenden.

Aktualisieren Sie zunächst die Paketlisten aus dem Standard-Repository und installieren Sie Redis:

apt-get update && apt-get upgrade apt install redis-server 

Überprüfen Sie die Version:

 root@redis1:/home/user# redis-server -v Redis server v=5.0.3 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=afa0decbb6de285f 

Lassen Sie redis1 als MASTER-Knoten und redis2 als SLAVE-Knoten fungieren.

Zu diesem Zweck schreiben wir in die Redis-Konfigurationsdateien die erforderlichen Parameter, mit denen Sie ein Replikat erstellen können (noch nicht fehlertolerant).

Geben Sie für redis1 in der Konfigurationsdatei /etc/redis/redis.conf Folgendes an:

 # ,   MASTER     . requirepass TestPass 

Geben Sie für redis2 in der Konfigurationsdatei /etc/redis/redis.conf Folgendes an:

 #   MASTER  . slaveof redis1 6379 #      . masterauth TestPass #   ,         . requirepass TestPass 

Starten Sie die Redis-Server-Dienste auf beiden Knoten neu:

 root@redis1:/etc/redis# /etc/init.d/redis-server stop [ ok ] Stopping redis-server (via systemctl): redis-server.service. root@redis1:/etc/redis# /etc/init.d/redis-server start [ ok ] Starting redis-server (via systemctl): redis-server.service. root@redis2:/etc/redis# /etc/init.d/redis-server stop [ ok ] Stopping redis-server (via systemctl): redis-server.service. root@redis2:/etc/redis# /etc/init.d/redis-server start [ ok ] Starting redis-server (via systemctl): redis-server.service. 

Wir überprüfen auf der MASTER-Seite, ob die Knoten zu Replikaten wurden und die erforderlichen Rollen erhalten haben:

 root@redis1:/etc/redis# redis-cli -a TestPass info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:master connected_slaves:1 slave0:ip=192.168.9.96,port=6379,state=online,offset=28,lag=0 master_replid:56b0a702d5823d107b0ca1ca2c80f8ef650a4b28 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:28 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:28 

Auf der Sklaven-Seite sehen wir die gleiche Situation:
 root@redis2:/etc/redis# redis-cli -a TestPass info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:slave master_host:redis1 master_port:6379 master_link_status:up master_last_io_seconds_ago:4 master_sync_in_progress:0 slave_repl_offset:14 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:56b0a702d5823d107b0ca1ca2c80f8ef650a4b28 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:14 

Jetzt müssen Sie das Replikat so konfigurieren, dass es bei einem Ausfall eines der Knoten automatisch wiederhergestellt wird. Dazu benötigen wir den Redis Sentinel-Tracking-Service.

Basierend auf der Dokumentation kann der Redis Sentinel-Überwachungsdienst die folgenden Vorgänge ausführen:

  1. Überprüft die Verfügbarkeit von MASTER- und SLAVE-Knoten und kann Warnungen über die Unzugänglichkeit von Knoten senden.
  2. Wenn der MASTER-Knoten ausfällt, kann der Zeugenknoten den SLAVE-Knoten in den MASTER-Modus versetzen sowie die verbleibenden SLAVE-Knoten neu konfigurieren, und sie beginnen mit dem neuen MASTER zu arbeiten.
  3. Nimmt Änderungen an den Konfigurationsdateien der Knoten MASTER und SLAVE vor.

Aus Gründen der Reinheit des Experiments werden wir einen Zeugen-Service auf einer separaten redis3-VM platzieren.

Wir verbinden das Redis-Repository auf die gleiche Weise und installieren das Redis-Sentinel-Paket:

 apt install redis-sentinel 

Nach der Installation müssen Sie die Einstellungen in der Konfigurationsdatei des Überwachungsknotens /etc/redis/sentinel.conf vornehmen:

 #    redis1   6379. #   1 -      , #        MASTER-. #       , #     MASTER-. sentinel monitor master01 redis1 6379 1 #  3 ,       . sentinel down-after-milliseconds master01 3000 #    MASTER- sentinel failover-timeout master01 6000 # ,  SLAVE-   . #    ,    , #      . sentinel parallel-syncs master01 1 #    . bind 192.168.9.97 127.0.0.1 ::1 #    MASTER-. sentinel auth-pass master01 TestPass 

Starten Sie den Dienst neu, nachdem Sie die Einstellungen vorgenommen haben:

 root@redis3:/etc/redis# /etc/init.d/redis-sentinel restart [ ok ] Restarting redis-sentinel (via systemctl): redis-sentinel.service. 

Überprüfen Sie, ob der Tracking-Service MASTER und SLAVE gesehen hat:

 root@redis3:/etc/redis# redis-cli -p 26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master01,status=ok,address=192.168.9.95:6379,slaves=1,sentinels=1 

Wir beginnen die Experimente.

Wir simulieren einen Fehler, stoppen den Redis-Server-Dienst auf dem Redis1-Knoten und erhalten die aktuellen Informationen des Zeugenknotens:

 root@redis3:/etc/redis# redis-cli -p 26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master01,status=ok,address=192.168.9.96:6379,slaves=1,sentinels=1 

Wir sehen, dass sich MASTER verändert hat.

Wir werden den Betrieb des redis1-Knotens wiederherstellen und seinen Status überprüfen:

 root@redis3:/var/log/redis# redis-cli -h redis1 -p 6379 -a TestPass info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:slave master_host:192.168.9.96 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:15977 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:6c0c7d0eedccede56f211f2db74a98c4d0ff6d56 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:15977 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:15977 

Wir sehen, dass der Knoten die SLAVE-Rolle erhalten hat und der redis2-Knoten ein MASTER-Knoten ist.

Simulieren Sie den Ausfall des redis2-Knotens und überprüfen Sie den Status des Zeugenknotens:

 root@redis3:/var/log/redis# redis-cli -p 26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master01,status=ok,address=192.168.9.95:6379,slaves=1,sentinels=1 

Und der Zustand des redis1-Knotens:

 root@redis3:/var/log/redis# redis-cli -h redis1 -p 6379 -a TestPass info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:master connected_slaves:0 master_replid:6e9d67d6460815b925319c2bafb58bf2c435cffb master_replid2:6c0c7d0eedccede56f211f2db74a98c4d0ff6d56 master_repl_offset:33610 second_repl_offset:26483 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:33610 

Großartig, der Mechanismus funktioniert. Jetzt stellt sich jedoch die Frage, wie wir unsere DirectumRX-Dienste verbinden, da sie eine einzelne Knotenadresse benötigen. Wir werden die Situation mit dem HAProxy-Service lösen.

Redis Node Proxying


Jeder Proxy-TCP-Dienst kann als Reverse-Proxy für Redis-Knoten fungieren. In diesem Artikel werden wir die Verwendung von HAProxy betrachten, da es sich um ein spezielles Tool handelt, das für hohe Verfügbarkeit und Lastausgleich ausgelegt ist und von allgemein bekannten Onlinediensten verwendet wird. Weitere Informationen zu HAProxy finden Sie auf der Entwicklerseite .

Installieren Sie HAProxy auf dem redis3-Knoten:

 root@redis3:/var/log/redis# apt install haproxy 

Fügen Sie in der HAProxy-Konfigurationsdatei /etc/haproxy/haproxy.cfg die Einstellungen für das Proxying von Anforderungen an Redis-Knoten hinzu:

 … frontend ft_redis bind *:6379 name redis mode tcp default_backend bk_redis backend bk_redis mode tcp option tcp-check tcp-check connect #  ,         . tcp-check send AUTH\ TestPass\r\n tcp-check expect string +OK tcp-check send PING\r\n tcp-check expect string +PONG tcp-check send info\ replication\r\n #    MASTER, .. SLAVE      . tcp-check expect string role:master tcp-check send QUIT\r\n tcp-check expect string +OK server Redis1 redis1:6379 check inter 3s server Redis2 redis2:6379 check inter 3s 

In dieser Konfiguration wird angegeben, dass wir alle Anforderungen, die an alle Schnittstellen der aktuellen virtuellen Maschine eingehen, an die Adresse an Port 6379 weiterleiten. Wir übertragen Anforderungen an den Knoten, der antwortet, dass er die MASTER-Rolle hat.

Starten Sie den Haproxy-Dienst neu:

 root@redis3:/etc/haproxy# /etc/init.d/haproxy restart 

Versuchen wir, eine Verbindung mit dem redis-cli-Client herzustellen und einen Testschlüssel zu erstellen:

 root@redis3:/etc/haproxy# redis-cli -p 6379 -a TestPass Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> SET TestKey "Some test string" OK 127.0.0.1:6379> GET TestKey "Some test string" 127.0.0.1:6379> info keyspace # Keyspace db0:keys=1,expires=0,avg_ttl=0 

Stoppen Sie den Knoten redis1 und fragen Sie die Liste der Schlüssel erneut ab:

 127.0.0.1:6379> info keyspace Error: Server closed the connection (3.01s) 127.0.0.1:6379> info keyspace # Keyspace db0:keys=1,expires=0,avg_ttl=0 (2.01s) 127.0.0.1:6379> GET TestKey "Some test string" 

Wir sehen, dass die Verbindung für einige Zeit getrennt wurde, aber dann die Verbindung wieder hergestellt wurde und alle Daten an Ort und Stelle blieben.

Jetzt reicht es aus, die Reverse-Proxy-Adresse in den Konfigurationsdateien der DirectumRX-Dienste zu registrieren, um eine Verbindung zu Redis herzustellen.

Konfigurieren Sie den Redis-Cluster


Die für Version Redis 3.0 und höher implementierte Redis Cluster-Clustering-Option ist eine Lösung zum Erstellen und Verwalten eines Clusters mit Datensegmentierung und -replikation. Führt Aufgaben der Knotenverwaltung, Replikation, Datensynchronisation auf Knoten aus und stellt den Zugriff der Clientanwendung auf den MASTER-Knoten sicher, falls einer von mehreren MASTER-Knoten ausfällt.

Bild

Redis Cluster arbeitet im Multimaster-Modus. Jeder MASTER-Knoten kann einen oder mehrere SLAVE-Knoten (bis zu 1000) haben.

Die Skalierung ist die Hauptfunktion des Clusters. Darüber hinaus kann der Cluster die Fehlertoleranz des Redis-Dienstes garantieren:

  • Wenn einige Knoten nicht funktionieren, verteilt der Cluster die Last von ihnen auf andere Knoten.
  • Wenn Schlüsselknoten nicht funktionieren, endet der gesamte Cluster.

Eine Situation kann auftreten, wenn Client 2 auf den Knoten M2 schreibt. M2 antwortet mit "OK" und versucht, in S2 zu schreiben. Gleichzeitig wartet M2 nicht auf den korrekten Abschluss des Datenaustauschs mit S2, sondern reagiert sofort auf den Client. In diesem Fall verfügt das S2-Replikat möglicherweise nicht über alle Daten. Daher wird empfohlen, mehrere SLAVE-Replikate zu verwenden.

Eine Situation kann auch auftreten, wenn M1, M3 M2 nicht mehr „sehen“ und der Client weiterhin Daten in M2 schreibt. Wenn die Nichtverfügbarkeit einige Zeit andauert (Cluster-Node-Timeout-Parameter), wird in diesem Fall S2 in den MASTER-Modus versetzt und M2 funktioniert nicht mehr von alleine.

In der offiziellen Dokumentation wird die Verwendung von 6 Knoten empfohlen - eine Redis-Instanz pro Knoten, was eine höhere Zuverlässigkeit ermöglicht. Niemand verbietet jedoch die Verwendung von drei Knoten mit der folgenden Verbindungstopologie:

Bild

Wenn einer der physischen Knoten ausfällt, wechseln die entsprechenden SLAVE-Replikate in den MASTER-Modus und der Betrieb wird nicht unterbrochen.

Wir implementieren 3 virtuelle Maschinen (redis1, redis2 und redis3) auf dem Prüfstand, von denen jede 2 Redis-Instanzen ausführen wird.

Die Clientanwendung stellt eine Verbindung zu einem bestimmten Port her, der in der Clientkonfigurationsdatei angegeben ist. Daher sollten MASTER-SLAVE-Paare an denselben Ports funktionieren.

Für das Paar M1 - S1 verwenden wir Port 6381
Für das Paar M2 - S2 verwenden wir Port 6382
Für das Paar M3 - S3 verwenden wir Port 6383

Bereiten Sie die Konfigurationsdateien vor

Auf redis1:

 cp /etc/redis/redis.conf /etc/redis/m1_redis.conf cp /etc/redis/redis.conf /etc/redis/s2_redis.conf mv /etc/redis/redis.conf /etc/redis/redis.bak 

Auf redis2:

 cp /etc/redis/redis.conf /etc/redis/m2_redis.conf cp /etc/redis/redis.conf /etc/redis/s3_redis.conf mv /etc/redis/redis.conf /etc/redis/redis.bak 

Auf redis3:

 cp /etc/redis/redis.conf /etc/redis/m3_redis.conf cp /etc/redis/redis.conf /etc/redis/s1_redis.conf mv /etc/redis/redis.conf /etc/redis/redis.bak 

Füllen Sie die Konfigurationsdateien gemäß der Vorlage aus:

 bind <IP- > protected-mode no #      ,    . port <> pidfile /var/run/redis_<>.pid # <yes/no> -   Redis Cluster cluster-enabled yes # ,      : #  ,  ,    . #         . cluster-config-file nodes-<>.conf #  ,  master-   , #          slaves #    . cluster-node-timeout 15000 

Lassen Sie uns die Redis-Knoten starten:

Knoten redis1:

 root@redis1:/etc/redis# redis-server /etc/redis/m1_redis.conf root@redis1:/etc/redis# redis-server /etc/redis/s2_redis.conf 

Redis2-Knoten:

 root@redis2:/etc/redis# redis-server /etc/redis/m2_redis.conf root@redis2:/etc/redis# redis-server /etc/redis/s3_redis.conf 

Redis3-Knoten:

 root@redis3:/etc/redis# redis-server /etc/redis/m3_redis.conf root@redis3:/etc/redis# redis-server /etc/redis/s1_redis.conf 

Um den Cluster zu konfigurieren, müssen Sie das Dienstprogramm redis-cli client verwenden und ihm eine Liste von IP: Port-Serverpaaren übergeben, die die Rollen von MASTER und SLAVE: spielen.

 redis-cli --cluster create redis1-ip:6381 redis2-ip:6382 redis3-ip:6383 redis1-ip:6382 redis2-ip:6383 redis3-ip:6381 --cluster-replicas 1 

Die Option --cluster-replicas 1 gibt an, wie viele SLAVE jeder Master haben wird, und sie werden automatisch aus der Liste der übertragenen Replikate ausgewählt.

 root@redis1:~/redis/src# redis-cli --cluster create 192.168.9.51:6381 192.168.9.52:6382 192.168.9.53:6383 192.168.9.51:6382 192.168.9.52:6383 192.168.9.53:6381 --cluster-replicas 1 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 192.168.9.52:6383 to 192.168.9.51:6381 Adding replica 192.168.9.51:6382 to 192.168.9.52:6382 Adding replica 192.168.9.53:6381 to 192.168.9.53:6383 >>> Trying to optimize slaves allocation for anti-affinity [OK] Perfect anti-affinity obtained! M: e92cb96fd6c20db7509662a248902e3751ebe95f 192.168.9.51:6381 slots:[0-5460] (5461 slots) master M: d499af3672b3063c7239572ec311ad3160f280ae 192.168.9.52:6382 slots:[5461-10922] (5462 slots) master M: 3a41475e1613519c3ecdec695736a898262a24a5 192.168.9.53:6383 slots:[10923-16383] (5461 slots) master S: 182e5cffc9c31c231de69ddbaf507ec1fe17bb09 192.168.9.51:6382 replicates d499af3672b3063c7239572ec311ad3160f280ae S: 44f656062259005adea58bc5ad024071a050e192 192.168.9.52:6383 replicates 3a41475e1613519c3ecdec695736a898262a24a5 S: 485ffb786e9763955e6f10ffc59247690ad9bc11 192.168.9.53:6381 replicates e92cb96fd6c20db7509662a248902e3751ebe95f Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join ..... >>> Performing Cluster Check (using node 192.168.9.51:6381) M: e92cb96fd6c20db7509662a248902e3751ebe95f 192.168.9.51:6381 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: d499af3672b3063c7239572ec311ad3160f280ae 192.168.9.52:6382 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 485ffb786e9763955e6f10ffc59247690ad9bc11 192.168.9.53:6381 slots: (0 slots) slave replicates e92cb96fd6c20db7509662a248902e3751ebe95f S: 182e5cffc9c31c231de69ddbaf507ec1fe17bb09 192.168.9.51:6382 slots: (0 slots) slave replicates d499af3672b3063c7239572ec311ad3160f280ae S: 44f656062259005adea58bc5ad024071a050e192 192.168.9.52:6383 slots: (0 slots) slave replicates 3a41475e1613519c3ecdec695736a898262a24a5 M: 3a41475e1613519c3ecdec695736a898262a24a5 192.168.9.53:6383 slots:[10923-16383] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. 

Der Cluster ist korrekt aufgebaut. Wir werden Informationen zum Cluster anzeigen:

 root@redis1:~/redis/src# redis-cli -c -h 192.168.9.51 -p 6381 192.168.9.51:6381> CLUSTER INFO cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:1254 cluster_stats_messages_pong_sent:1243 cluster_stats_messages_sent:2497 cluster_stats_messages_ping_received:1238 cluster_stats_messages_pong_received:1254 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:2497 192.168.9.51:6381> 

Um ein bestimmtes Replikat wie bei Redis Sentiel zu testen, können Sie den INFO-Replikationsbefehl verwenden:

 root@redis1:~/redis/src# redis-cli -c -h 192.168.9.51 -p 6381 192.168.9.51:6381> INFO replication # Replication role:master connected_slaves:1 slave0:ip=192.168.9.53,port=6381,state=online,offset=1946,lag=0 master_replid:59cd95d394dad9d0e49042637fdfd5290db4abfe master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1946 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1946 192.168.9.51:6381> 

Versuchen wir, mehrere Schlüssel zu erstellen und zu überprüfen, ob diese Schlüssel auf den Replikaten angezeigt wurden:

 192.168.9.51:6381> SET key1 test1 -> Redirected to slot [9189] located at 192.168.9.52:6382 OK 192.168.9.52:6382> SET key2 test2 -> Redirected to slot [4998] located at 192.168.9.51:6381 OK 192.168.9.51:6381> SET key3 test3 OK 192.168.9.51:6381> 

Überprüfen Sie auf M2:

 root@redis2:/home/user# redis-cli -c -h 192.168.9.52 -p 6382 192.168.9.52:6382> GET key1 "test1" 192.168.9.52:6382> GET key2 -> Redirected to slot [4998] located at 192.168.9.51:6381 "test2" 192.168.9.51:6381> GET key3 "test3" 192.168.9.51:6381> 

Und auf dem M3:

 root@redis3:/home/user# redis-cli -c -h 192.168.9.53 -p 6383 192.168.9.53:6383> GET key1 -> Redirected to slot [9189] located at 192.168.9.52:6382 "test1" 192.168.9.52:6382> GET key2 -> Redirected to slot [4998] located at 192.168.9.51:6381 "test2" 192.168.9.51:6381> GET key3 "test3" 192.168.9.51:6381> 

Wir werden den redis1-Knoten deaktivieren und überprüfen, wie S1 funktioniert:

 192.168.9.52:6382> CLUSTER NODES <b>182e5cffc9c31c231de69ddbaf507ec1fe17bb09 192.168.9.51:6382@16382 slave,fail d499af3672b3063c7239572ec311ad3160f280ae 1569509904727 1569509900000 4 connected</b> 485ffb786e9763955e6f10ffc59247690ad9bc11 <i>192.168.9.53:6381@16381 master</i> - 0 1569510017272 7 connected 0-5460 44f656062259005adea58bc5ad024071a050e192 192.168.9.52:6383@16383 slave 3a41475e1613519c3ecdec695736a898262a24a5 0 1569510018274 5 connected <b>e92cb96fd6c20db7509662a248902e3751ebe95f 192.168.9.51:6381@16381 master,fail - 1569509906731 1569509901721 1 connected</b> 3a41475e1613519c3ecdec695736a898262a24a5 192.168.9.53:6383@16383 master - 0 1569510019275 3 connected 10923-16383 d499af3672b3063c7239572ec311ad3160f280ae 192.168.9.52:6382@16382 myself,master - 0 1569510017000 2 connected 5461-10922 

Wir sehen Informationen über den Ausfall von M1 und S2 und dass S3 in den MASTER-Modus gewechselt ist.

Überprüfen Sie, wo die Schlüssel gespeichert sind:

 192.168.9.52:6382> GET key1 "test1" 192.168.9.52:6382> GET key2 -> Redirected to slot [4998] located at 192.168.9.53:6381 "test2" 192.168.9.53:6381> GET key3 "test3" 192.168.9.53:6381> 

Schlüssel, die zuvor auf redis1 gespeichert waren, sind jetzt auf redis3 verfügbar.

Stellen Sie den Betrieb des Knotens redis1 wieder her und überprüfen Sie den Status der Knoten M1 und S2:

 192.168.9.53:6381> CLUSTER NODES <i>e92cb96fd6c20db7509662a248902e3751ebe95f 192.168.9.51:6381@16381 slave 485ffb786e9763955e6f10ffc59247690ad9bc11 0 1569511658217 7 connected 182e5cffc9c31c231de69ddbaf507ec1fe17bb09 192.168.9.51:6382@16382 slave d499af3672b3063c7239572ec311ad3160f280ae 0 1569511657000 4 connected</i> d499af3672b3063c7239572ec311ad3160f280ae 192.168.9.52:6382@16382 master - 0 1569511656000 2 connected 5461-10922 3a41475e1613519c3ecdec695736a898262a24a5 192.168.9.53:6383@16383 master - 0 1569511656000 3 connected 10923-16383 485ffb786e9763955e6f10ffc59247690ad9bc11 192.168.9.53:6381@16381 myself,master - 0 1569511656000 7 connected 0-5460 44f656062259005adea58bc5ad024071a050e192 192.168.9.52:6383@16383 slave 3a41475e1613519c3ecdec695736a898262a24a5 0 1569511657216 5 connected 

Der Zustand von M1 und S2 hat sich erholt, aber jetzt befindet sich M1 im SLAVE-Modus.

Und die Schlüssel befinden sich auch auf dem redis3-Knoten:

 192.168.9.53:6383> GET key1 -> Redirected to slot [9189] located at 192.168.9.52:6382 "test1" 192.168.9.52:6382> GET key2 -> Redirected to slot [4998] located at 192.168.9.53:6381 "test2" 192.168.9.53:6383> GET key3 -> Redirected to slot [935] located at 192.168.9.53:6381 "test3" 

Der Cluster ist konfiguriert und die Redis-Wiederherstellung wird getestet.

Um auf DirectumRX-Dienste zugreifen zu können, müssen Sie auch Reverse-Proxys konfigurieren, wie im Fall der Einrichtung von Redis Sentiel.

Anstelle einer Schlussfolgerung


In diesem Artikel wurde kein weiterer Weg zur Erhöhung der Redis-Fehlertoleranz in Betracht gezogen - die Verwendung eines Cluster-Ressourcenmanagers eines Drittanbieters, z. B. Pacemaker . In diesem Fall ist es möglich, mit zwei Knoten auszukommen, es besteht jedoch eine hohe Wahrscheinlichkeit eines Datenverlusts im Notfall.

Für einen Reverse-Proxy (in diesem Fall HAProxy) ist es auch wünschenswert, Fehlertoleranz bereitzustellen, aber dieses Problem ging auch über den Rahmen dieses Artikels hinaus. Wenn Sie sich für das Thema interessieren, können diese Bereitstellungsoptionen auch in separaten Artikeln mit schrittweiser Optimierung und Prüfung der Ergebnisse berücksichtigt werden.

Unter den folgenden Links erfahren Sie mehr über das Thema:
Redis Cluster Tutorial
Redis Sentinel-Dokumentation
HAProxy-Konfigurationshandbuch .

Source: https://habr.com/ru/post/de469543/


All Articles