Diese Anleitung beschreibt die Installation eines Redis-Clusters (redis-sentinel) und die Verwendung einer Failover-IP (Keepalived). Dazu haben wir eine Laborumgebung wie folgt aufgebaut:
- Laborumgebung
- Installation
- Konfiguration Redis-Server
- Konfiguration Redis-Sentinel
- Cluster-Checks
- Konfiguration Keepalived
- Redis-Replikationsüberprüfung
Laborumgebung
- IP/Keepalived: 192.168.0.120
- Nextcloud: 192.168.0.130
- Redis-Node #1: 192.168.0.131
- Redis-Node #2: 192.168.0.132
- Redis-Node #3: 192.168.0.133
Software-Installation
Installieren Sie die notwendigen Softwarepakete auf allen drei Redis-Nodes:
apt install -y lsb-release curl gpg keepalived
curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/redis.list
apt update
apt install -y redis-server redis-sentinel redis-tools --allow-change-held-packages
cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
cp /etc/redis/sentinel.conf /etc/redis/sentinel.conf.bak
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
systemctl stop redis-server.service redis-sentinel.service
Redis-Server Konfiguration
Auf allen drei Redis-Nodes wird die Redis-Konfiguration wie folgt angepasst:
nano /etc/redis/redis.conf
[…]
bind 0.0.0.0
[…]
protected-mode no
[…]
dir /var/lib/redis
save 900 1
save 300 10
save 60 10000
[…]
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
[…]
maxmemory 4292967296
[…]
replica-read-only yes
repl-diskless-sync no
[…]
Auf den beiden Redis Nodes 2 und 3 wird zudem noch folgende Zeile eingefügt:
replicaof 192.168.0.131 6379
Redis-Sentinel Konfiguration
Passen Sie nun die Redis-Sentinel-Konfiguration auf allen drei Redis-Nodes an:
nano /etc/redis/sentinel.conf
[...]
protected-mode no
[...]
bind 0.0.0.0
port 26379
[...]
# sentinel monitor mymaster 127.0.0.1 6379 2
sentinel monitor mymaster 192.168.0.131 6379 2
sentinel down-after-milliseconds mymaster 1000
sentinel failover-timeout mymaster 5000
[...]
Aktivieren und starten Sie nun beide Redis-Dienste auf allen drei Redis-Nodes:
systemctl enable --now redis-server redis-sentinel
Cluster-Check
Sie können nun auf allen drei Redis-Nodes feststellen, wer im Verbund welche Redis-Rolle führt:
redis-cli info replication | grep role

Im dargestellten Beispiel ist der Redis-Node #2 unser „Master“. Zudem können Sie den Redis-Master wie folgt identifizieren:
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster

Keepalived Konfiguration
Erzeugen Sie nun die Failover-IP-Konfiguration (Keepalived) auf allen drei Redis-Nodes. Erstellen Sie dafür das zugrundeliegende Kontrollskript:
nano /etc/keepalived/check_redis_master.sh
#!/bin/bash
REDIS_CLI="/usr/bin/redis-cli"
if ! pgrep -x redis-server > /dev/null; then
exit 1
fi
ROLE=$($REDIS_CLI --no-auth-warning role | head -1)
if [ "$ROLE" == "master" ]; then
exit 0 # This node is master - should hold vIP
else
exit 1 # This node is replica - should not hold vIP
fi
Erzeugen Sie anschließend die Keepalived-Konfiguration auf allen drei Redis-Nodes:
nano /etc/keepalived/keepalived.conf
global_defs {
router_id redis_131
enable_script_security
script_user root
}
vrrp_script check_redis_master {
script "/etc/keepalived/check_redis_master.sh"
interval 1 # Check alle x Sekunden
weight -20 # Reduziere die Prio um 20, wenn der Check fehlschlägt
fall 2 # Benötigt 2 Fehlversuche, bis Zustand "DOWN"
rise 3 # Benötigt 3 OK-Versuche, bis Zustand "UP/OK"
}
vrrp_instance VI_1 {
state BACKUP
interface eth0 # Name des NIC anpassen
virtual_router_id 100
priority 100 # Master hat 100, Slave 99, Slave2 98...
advert_int 1
authentication {
auth_type PASS
auth_pass fosc-it.com
}
virtual_ipaddress {
192.168.0.120/22
}
track_script {
check_redis_master
}
}
Ändern Sie am Redis-Node #2 folgende Zeilen ab:
[...]
router_id redis_132
[...]
priority 99
[...]
Ändern Sie am Redis-Node #3 folgende Zeilen ab:
[...]
router_id redis_133
[...]
priority 98
[...]
Aktivieren Sie nun die Keepalived-Konfiguration auf allen drei Redis-Nodes:
chmod +x /etc/keepalived/check_redis_master.sh
systemctl restart keepalived.service
Überprüfen Sie auf allen drei Redis-Nodes, dass die IP mit der Endung 120 am Master (im Beispiel Redis-Node #2) hinterlegt wurde:
ip --br a | grep 120

Redis-Replikationstest
Testen Sie nun die Replikation. Verbinden Sie sich dazu über einen beliebigen Redis-Client und über die Failoverip mit dem Redis-Master
redis-cli -h 192.168.0.120 SET testkey "FOSC-IT.COM"
Erstellen Sie einen Redis-Key namens „testkey“, der den Wert „FOSC-IT.COM“ erhält. Diesen Redis-Key lassen wir uns an den anderen Redis-Nodes #2 und #3 (Slaves) anzeigen:
redis-cli get testkey

Um beispielsweise die Ausfallsicherheit einer Cloud (Nextcloud) zu erhöhen, kann diese Failover-IP als Redis-Backend verwendet werden:
nano /var/www/nextcloud/config/config.php
[...]
'redis' =>
array (
'host' => '192.168.0.120',
'port' => '6379',
'timeout' => 0.5,
'dbindex' => 1,
),
[...]
Auch die PHP-Session könnten darüber ausfallsicher bereitgestellt werden. Gerne unterstützen wir Sie dabei sofern – kontaktieren Sie uns dafür gerne über die FOSC IT GmbH.
Das war’s schon! Über Ihre Unterstützung (diese wird ordnungsgemäß versteuert!) würden sich meine Frau, meine Zwillinge und ich sehr freuen!
Nutzen Sie bitte unsere Telefonnummer für Ihre WERO-Unterstützung.

Vielen Dank – Carsten Rieger!