KeyDB, Active-Replica, Multi-Master, PHP-Sitzungsspeicher

KeyDB, Active-Replica, Multi-Master, PHP-Sitzungsspeicher

Ich möchte KeyDB/Redis zur Speicherung von PHP-Sitzungen in einem HA-Setup verwenden. Derzeit laufen bei mir zwei KeyDB-Instanzen mit der folgenden Konfiguration:

Instanz 1 (192.168.2.10)

requirepass pass123
masterauth pass123
# you will need to configure the following
multi-master yes
active-replica yes
replicaof 192.168.2.9 6379

Instanz 2 (192.168.2.9)

requirepass pass123
masterauth pass123
# you will need to configure the following
multi-master yes
active-replica yes
replicaof 192.168.2.10 6379

Ich habe dann folgendes in den PHP-Einstellungen konfiguriert

session.save_handler = redis
session.save_path = "tcp://192.168.2.10:6379?timeout=1.5&auth=pass123, tcp://192.168.2.9:6379?timeout=1.5&auth=pass123"

Wenn beide Instanzen online sind, funktioniert alles wie erwartet. Wenn ich einen der KeyDB-Server offline nehme, gibt PHP einen Fehler aus, wenn es diese Instanz auswählt – anstatt eine aktive zu verwenden.

Gibt es eine Möglichkeit, dies zu tun, ohne es über eine Konfiguration im Haproxy- oder Sentinel-Stil auszuführen?

Antwort1

Ich hatte ein ähnliches Problem und wollte mir die Mühe ersparen, Haproxy einzurichten. Stattdessen habe ich meine Keydb-Hostnamen in meine /etc/hostsDatei eingetragen und dann ein check_keydbSkript erstellt, das jeden Server überwacht und die /etc/hostsDatei ändert, wenn einer der Keydb-Server ausfällt. Dieses Skript wird einmal pro Minute ausgeführt cron. Es sendet mir auch eine E-Mail-Benachrichtigung, wenn es ein Problem erkennt.

Um den Status der Keydb-Server zu überprüfen, ncsende ich normalerweise einen PINGBefehl und warte dann auf eine +PONGAntwort.

In meinem Fall verwende ich nur einen primären Keydb-Server und der andere ist ein Hot Backup. Sie können das Skript jedoch problemlos ändern, um mehrere aktive Server zu verwalten. Wenn ein Server ausfällt, lassen Sie das Skript einfach seinen Hostnamen aus der /etc/hostsDatei entfernen.

Unten finden Sie eine Kopie meines Skripts. Natürlich müssen Sie die IP-Adressen anpassen und alle für Ihre spezielle Konfiguration erforderlichen Änderungen vornehmen.

#
# Checks both connections to our mirrored Keydb/Redis servers.
# If one of them is down, adjust the keydb hostname in /etc/hosts
# and make it point to the IP address of the active server.
#

FROM_EMAIL="[email protected]"
NOTIFY_EMAIL="[email protected]"

PORT=6379

TARGET1=keydb1
TARGET2=keydb2

TARGET1_STATUS=up
TARGET2_STATUS=up

RESPONSE=$(echo PING | nc -w 2 $TARGET1 $PORT | tr -d '\r\n')
if [ "$RESPONSE" != "+PONG" ]
then
    TARGET1_STATUS=down
fi

RESPONSE=$(echo PING | nc -w 2 $TARGET2 $PORT | tr -d '\r\n')
if [ "$RESPONSE" != "+PONG" ]
then
    TARGET2_STATUS=down
fi

HOSTS_FILE=/etc/hosts

if [[ "$TARGET1_STATUS" != "up" || "$TARGET2_STATUS" != "up" ]]
then
    grep -v -E '^\s*10\.15\.124\.3[12]\s+keydb\s+' $HOSTS_FILE > /tmp/hosts.tmp

    cat <<__EOT__ | mail -r $FROM_EMAIL -s 'keydb server has problems' $NOTIFY_EMAIL
$TARGET1:$PORT $TARGET1_STATUS
$TARGET2:$PORT $TARGET2_STATUS
__EOT__
fi

if [ "$TARGET1_STATUS" != "up" ]
then
    cp /tmp/hosts.tmp $HOSTS_FILE
    echo "10.15.124.32  keydb   # main connection" >> $HOSTS_FILE

    echo $TARGET1:$PORT $TARGET1_STATUS
    exit 1
fi

if [ "$TARGET2_STATUS" != "up" ]
then
    cp /tmp/hosts.tmp $HOSTS_FILE
    echo "10.15.124.31  keydb   # main connection" >> $HOSTS_FILE

    echo $TARGET2:$PORT $TARGET2_STATUS
    exit 1
fi

echo "OK"
exit 0

WARNUNG: Bevor Sie Ihr Skript auf einem Produktionsserver aktivieren, speichern Sie unbedingt eine Kopie Ihrer Originaldatei /etc/hosts. Nach 30 Jahren sollte ich es eigentlich besser wissen, aber ich habe das vergessen und versehentlich mein Original überschrieben. Dadurch gingen mehrere wichtige Dienste für einige Minuten offline, bis ich die Datei aus einer Sicherung wiederherstellen konnte. Wenn Sie das einfach tun, cp /etc/hosts /etc/hosts.bakkönnen Sie sich eine Menge Ärger ersparen, wenn etwas schief geht.

Wenn mehrere Webserver auf Ihre Keydb-Server zugreifen, müssen Sie dieses Skript außerdem auf jedem Server ausführen, damit die lokalen /etc/hostsDateien angepasst werden. In diesem Fall wäre es jedoch wahrscheinlich sinnvoller, einfach Haproxy einzurichten und echtes Lastenausgleich/Failover durchzuführen.

Alternativ zum Ändern der /etc/hostsDatei können Sie ein ähnliches Skript erstellen, um Ihre php.iniDatei zu ändern und Ihre session.save_path =Variable so einzustellen, dass nur die aktuell aktiven Keydb-Server eingeschlossen werden (denken Sie nur daran, für den gerade ausgeführten Webserver einen „Reload“-Befehl auszuführen).

verwandte Informationen