Redis-Cluster mit Redis-Sentinel und Keepalived (failover ip)

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

  • 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!

Unterstützung mit WERO