Dies Anleitung soll dafür Dienen wie man Redis-Cluster auf Ubuntu installiert.
Voraussetzung
Redis muss auf einem Linux OS installiert werden. (Ubuntu, Redhat, Centos, etc)
Für die Installation braucht es sicherlich 3 Redis Instanzen. Diese können auf unterschiedlichen Server installiert werden, oder mehrere Instanzen auf einem Server. (best practice, anhand untenstehendem Beispiel.)
Sofern die Redis-Server in unterschiedlichen Zonen stehen, müssen sich diese gegenseitig erreichen können.
Folgende Firewall Port müssen geöffnet werden
6379
16384
16379
7001 (Falls über Cluster)
7002 (Falls über Cluster)
7003 (Falls über Cluster)
7004 (Falls über Cluster)
7006 (Falls über Cluster)
Beispiel
Als Beispiel haben wir 3 Virtuelle Ubuntu Server.
Redis HA 1 (192.168.17.134)
Redis HA 2 (192.168.17.135)
Redis HA 3 (192.168.17.136)
Auf Redis HA1 ist sowohl eine Master Instanz 7001 sowohl auch eine Slave Instanz 7004
Auf Redis HA2 ist sowohl eine Master Instanz 7002 sowohl auch eine Slave Instanz 7005
Auf Redis HA3 ist sowohl eine Master Instanz 7003 sowohl auch eine Slave Instanz 7006
Der Slave für Master 7001 ist Slave 7006
Der Slave für Master 7002 ist Slave 7006
Der Slave für Master 7003 ist Slave 7004
Installation
Allgemeine Installation für alle 3 Server
Switch auf root user:
sudo su
Erstelle eine Folder in /etc/redis in welchem Redis installiert wird:
mkdir /etc/redis
Herunterladen von Redis und anschliessendes entpacken
https://download.redis.io/releases/redis-6.2.6.tar.gz
kann auch auf Windows heruntergeladen werden und anschliessend auf dem Linux-Server via WINSCP kopiert werden.
wget https://download.redis.io/releases/redis-6.2.6.tar.gz tar xzf redis-6.2.6.tar.gz
Nun sollte in Verzeichnis /etc/redis folgende Folder/Files vorhanden sein:
Mit cd kann in das Verzeichnis /redis-6.2.6 navigiert werden
Redis benötigt, gcc, make und tcl. Dies kann mit folgendem Befehl installiert werden.
sudo apt-get install -y tcl tk sudo apt install gcc sudo apt-get install make
Überprüfen, ob die Lokale Firewall aktiv ist
sudo ufw status
Ansonsten die erwähnten Ports aktivieren
sudo ufw allow 6379 sudo ufw allow 16384 sudo ufw allow 16379 sudo ufw allow 7001 sudo ufw allow 7002 sudo ufw allow 7003 sudo ufw allow 7004 sudo ufw allow 7005 sudo ufw allow 7006
Da wir make installiert haben, müssen wir das File in etc/redis/redis-6.2.6/makefile noch ausführen
cd /etc/redis/redis-6.2.6/ sudo make test
Konfiguration VM 1
Da wir wie in unserem Beispiel mehrere Redis-Instanzen pro Server haben. Brauchen wir mehrere konfig-Files pro Server.
Das heisst wir erstellen auf der VM01 folgende config-Files →node1.conf
/ node4.conf
. Mit welchen wir anschliessend Redis starten.
Config-File 1 & 4 erstellen
Falls Vim noch nicht installiert ist. Kann dies mit “apt install vim” installiert werden
Am besten erstelllt man die config-Files im folder /etc/redis - sprich noch in das Verzeichnis navigieren
cd /etc/redis
sudo vim node1.conf
Folgender Text kopieren;
port 7001 cluster-enabled yes cluster-config-file cluster-node-1.conf cluster-node-timeout 5000 appendonly yes appendfilename node-1.aof dbfilename dump-1.rdb
vim Datei speichern ctrl+c | wq!
vim Datei schliessen ohne speichern ctrl+c | q!
vim Datei dursuchen esc /suchen
vim Datei editieren i
sudo vim node4.conf
Folgender Text kopieren;
port 7004 cluster-enabled yes cluster-config-file cluster-node-4.conf cluster-node-timeout 5000 appendonly yes appendfilename node-4.aof dbfilename dump-4.rdb
Konfiguration VM 2
Da wir wie in unserem Beispiel mehrere Redis-Instanzen pro Server haben. Brauchen wir mehrere konfig-Files pro Server.
Das heisst wir erstellen auf der VM02 folgende config-Files →node2.conf
/ node5.conf
. Mit welchen wir anschliessend Redis starten.
Config-File 2 & 5 erstellen
Falls Vim noch nicht installiert ist. Kann dies mit “apt install vim” installiert werden
Am besten erstelllt man die config-Files im folder /etc/redis - sprich noch in das Verzeichnis navigieren
cd /etc/redis sudo vim node2.conf
Folgender Text kopieren;
port 7002 cluster-enabled yes cluster-config-file cluster-node-2.conf cluster-node-timeout 5000 appendonly yes appendfilename node-2.aof dbfilename dump-2.rdb
vim Datei speichern ctrl+c | wq!
vim Datei schliessen ohne speichern ctrl+c | q!
vim Datei dursuchen esc /suchen
vim Datei editieren i
sudo vim node5.conf
Folgender Text kopieren;
port 7005 cluster-enabled yes cluster-config-file cluster-node-5.conf cluster-node-timeout 5000 appendonly yes appendfilename node-5.aof dbfilename dump-5.rdb
Konfiguration VM 3
Da wir wie in unserem Beispiel mehrere Redis-Instanzen pro Server haben. Brauchen wir mehrere konfig-Files pro Server.
Das heisst wir erstellen auf der VM03 folgende config-Files →node3.conf
/ node6.conf
. Mit welchen wir anschliessend Redis starten.
Config-File 3 & 6 erstellen
Falls Vim noch nicht installiert ist. Kann dies mit “apt install vim” installiert werden
Am besten erstelllt man die config-Files im folder /etc/redis - sprich noch in das Verzeichnis navigieren
cd /etc/redis sudo vim node3.conf
Folgender Text kopieren;
port 7003 cluster-enabled yes cluster-config-file cluster-node-3.conf cluster-node-timeout 5000 appendonly yes appendfilename node-3.aof dbfilename dump-3.rdb
vim Datei speichern ctrl+c | wq!
vim Datei schliessen ohne speichern ctrl+c | q!
vim Datei dursuchen esc /suchen
vim Datei editieren i
sudo vim node6.conf
Folgender Text kopieren;
port 7006 cluster-enabled yes cluster-config-file cluster-node-6.conf cluster-node-timeout 5000 appendonly yes appendfilename node-6.aof dbfilename dump-6.rdb
Redis Starten
Auf jeder VM kann nun mit folgeden Befehl Redis mit einem Config-File gestartet werden.
Hierfür empfehlen wir direkt ins Verzeichnis /etc/redis zu navigieren und folgende Befehle auszuführen
cd /etc/redis
Server | Instanz | Befehl |
---|---|---|
HA1 (192.168.17.134) | Node 01 - Port 7001 Node 04 - Port 7004 | ./redis-6.2.6/src/redis-server node1.conf & ./redis-6.2.6/src/redis-server node4.conf & |
HA 2 (192.168.17.135) | Node 02 - Port 7002 Node 05 - Port 7005 | ./redis-6.2.6/src/redis-server node2.conf & ./redis-6.2.6/src/redis-server node5.conf & |
HA 3 (192.168.17.136) | Node 03 - Port 7003 Node 06 - Port 7006 | ./redis-6.2.6/src/redis-server node3.conf & ./redis-6.2.6/src/redis-server node6.conf & |
Redis Verbinden
Auf die einzelnen Instanzen kann nun via Redis-CLI zugegriffen werden.
Server | Instanz | Befehl |
---|---|---|
HA1 (192.168.17.134) | Node 01 - Port 7001 Node 04 - Port 7004 | ./redis-6.2.6/src/redis-cli -p 7001 ./redis-6.2.6/src/redis-cli -p 7004 |
HA 2 (192.168.17.135) | Node 02 - Port 7002 Node 05 - Port 7005 | ./redis-6.2.6/src/redis-cli -p 7002 ./redis-6.2.6/src/redis-cli -p 7005 |
HA 3 (192.168.17.136) | Node 03 - Port 7003 Node 06 - Port 7006 | ./redis-6.2.6/src/redis-cli -p 7003 ./redis-6.2.6/src/redis-cli -p 7006 |
Redis Cluster konfigurieren
Da die Instanzen jedoch noch Lokal laufen, müssen diese dem Cluster hinzugefügt werden.
Hierfür navigiert man erneut auf /etc/redis
cd /etc/redis
./redis-6.2.6/src/redis-cli --cluster
+ alle Instanzen. Die zweite Instanz ist in jedem Fall der Slave. --cluster-replicas gibt an wie viele slave pro Master erstellt wird.
./redis-6.2.6/src/redis-cli --cluster create 192.168.17.134:7001 192.168.17.134:7004 192.168.17.135:7002 192.168.17.135:7005 192.168.17.136:7003 192.168.17.136:7006 --cluster-replicas 1
Überprüfen und mit Y bestätigen.
Redis-CLI
Auf die Redis-CLI kommt man wie folgt:
-p = Port -c = Cluster
./redis-6.2.6/src/redis-cli -c -p 7001
ping
ping
Können andere Nodes gepingt werden.
info
info
Zeigt alle Informationen über den Cluster an
cluster nodes
cluster nodes
Zeigt alle Nodes an, und ob diese Master oder Slave sind.
info replication
info replication
Zeigt an, ob der Server Master oder Slave ist und wer dessen Slave ist.
Failover
Wenn wir nun als Beispiel den Master 7003 beenden.
Müsste der Slave 7004 als neuen Master fungieren.
Für dieses Beispiel fahren wir den Master 7003 herunter.
./redis-6.2.6/src/redis-cli -c -p 7003 shutdown
Auf dem Master von 7001 und 7002 erhält man nun folgende Meldung:
2074:S 26 Apr 2022 13:56:22.765 # Error condition on socket for SYNC: Connection refused 2074:S 26 Apr 2022 13:56:23.773 * Connecting to MASTER 192.168.17.136:7003 2074:S 26 Apr 2022 13:56:23.773 * MASTER <-> REPLICA sync started 2074:S 26 Apr 2022 13:56:23.773 # Error condition on socket for SYNC: Connection refused 3904:M 26 Apr 2022 13:56:24.099 * FAIL message received from 9b989e13f6e83d661c072853f48d89d1a995f69c about 88ff5fc7513281e33e5397175cba7dbec2d01265 3904:M 26 Apr 2022 13:56:24.099 # Cluster state changed: fail 2074:S 26 Apr 2022 13:56:24.100 * FAIL message received from 9b989e13f6e83d661c072853f48d89d1a995f69c about 88ff5fc7513281e33e5397175cba7dbec2d01265 2074:S 26 Apr 2022 13:56:24.100 # Cluster state changed: fail 2074:S 26 Apr 2022 13:56:24.177 # Start of election delayed for 711 milliseconds (rank #0, offset 589126). 2074:S 26 Apr 2022 13:56:24.781 * Connecting to MASTER 192.168.17.136:7003 2074:S 26 Apr 2022 13:56:24.781 * MASTER <-> REPLICA sync started 2074:S 26 Apr 2022 13:56:24.781 # Error condition on socket for SYNC: Connection refused 2074:S 26 Apr 2022 13:56:24.983 # Starting a failover election for epoch 28. 3904:M 26 Apr 2022 13:56:24.984 # Failover auth granted to cdfafbc0721ba7774a6e9412e51e7369bd150c1a for epoch 28 2074:S 26 Apr 2022 13:56:25.006 # Failover election won: I'm the new master. 2074:S 26 Apr 2022 13:56:25.006 # configEpoch set to 28 after successful failover 2074:M 26 Apr 2022 13:56:25.006 * Discarding previously cached master state. 2074:M 26 Apr 2022 13:56:25.006 # Setting secondary replication ID to ddd94fd4c80c068c06c03fc5113ce9f33cbbe780, valid up to offset: 589127. New replication ID is 897d8ffc57482c31a6d37db92136073b713e813e 2074:M 26 Apr 2022 13:56:25.006 # Cluster state changed: ok 3904:M 26 Apr 2022 13:56:25.024 # Cluster state changed: ok
Wenn man nun erneut Redis-CLI “Cluster nodes” ausführt, sieht man auch, dass der Slave7004 nun Master ist.
Ebenfalls, dass der Master 7003 nicht erreichbar ist.
Wenn der ehmalige Slave 7004 nun wieder gestartet wird, ist dieser Standardmässig noch als Slave hinterlegt.
./redis-6.2.6/src/redis-server node3.conf &
Meldung nach dem Aufstarten:
17830:S 26 Apr 2022 14:05:46.962 * MASTER <-> REPLICA sync: receiving 193 bytes from master to disk 17830:S 26 Apr 2022 14:05:46.962 * MASTER <-> REPLICA sync: Flushing old data 17830:S 26 Apr 2022 14:05:46.962 * MASTER <-> REPLICA sync: Loading DB in memory 17830:S 26 Apr 2022 14:05:46.963 * Loading RDB produced by version 6.2.6 17830:S 26 Apr 2022 14:05:46.963 * RDB age 0 seconds 17830:S 26 Apr 2022 14:05:46.963 * RDB memory usage when created 2.54 Mb 17830:S 26 Apr 2022 14:05:46.963 # Done loading RDB, keys loaded: 2, keys expired: 0. 17830:S 26 Apr 2022 14:05:46.963 * MASTER <-> REPLICA sync: Finished with success 17830:S 26 Apr 2022 14:05:46.963 * Background append only file rewriting started by pid 17836 17830:S 26 Apr 2022 14:05:47.001 * AOF rewrite child asks to stop sending diffs. 17836:C 26 Apr 2022 14:05:47.001 * Parent agreed to stop sending diffs. Finalizing AOF... 17836:C 26 Apr 2022 14:05:47.001 * Concatenating 0.00 MB of AOF diff received from parent. 17836:C 26 Apr 2022 14:05:47.001 * SYNC append only file rewrite performed 17836:C 26 Apr 2022 14:05:47.001 * AOF rewrite: 0 MB of memory used by copy-on-write 17830:S 26 Apr 2022 14:05:47.075 * Background AOF rewrite terminated with success 17830:S 26 Apr 2022 14:05:47.075 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB) 17830:S 26 Apr 2022 14:05:47.075 * Background AOF rewrite finished successfully
Wenn man den 7003 wieder als Master deklarieren möchte, kann man dies mit
./redis-6.2.6/src/redis-cli -c -p 7003 cluster failover
Meldung:
127.0.0.1:7003> 17830:S 26 Apr 2022 14:07:57.685 # Received replication offset for paused master manual failover: 589308 17830:S 26 Apr 2022 14:07:57.685 # All master replication stream processed, manual failover can start. 7830:S 26 Apr 2022 14:07:57.685 # Start of election delayed for 0 milliseconds (rank #0, offset 589308). 17830:S 26 Apr 2022 14:07:57.685 # Starting a failover election for epoch 29. 17830:S 26 Apr 2022 14:07:57.686 # Currently unable to failover: Waiting for votes, but majority still not reached. 17830:S 26 Apr 2022 14:07:57.686 # Failover election won: I'm the new master. 17830:S 26 Apr 2022 14:07:57.686 # configEpoch set to 29 after successful failover 17830:M 26 Apr 2022 14:07:57.686 # Connection with master lost. 17830:M 26 Apr 2022 14:07:57.686 * Caching the disconnected master state. 17830:M 26 Apr 2022 14:07:57.686 * Discarding previously cached master state. 17830:M 26 Apr 2022 14:07:57.686 # Setting secondary replication ID to 897d8ffc57482c31a6d37db92136073b713e813e, valid up to offset: 589309. New replication ID is 17e90a8ddf3d4fd645d4ec162267629a4109ea9f
Erneute überprüfung über Cluster nodes