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
[…]
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 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!
