
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/hosts
Datei eingetragen und dann ein check_keydb
Skript erstellt, das jeden Server überwacht und die /etc/hosts
Datei ä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, nc
sende ich normalerweise einen PING
Befehl und warte dann auf eine +PONG
Antwort.
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/hosts
Datei 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.bak
kö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/hosts
Dateien 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/hosts
Datei können Sie ein ähnliches Skript erstellen, um Ihre php.ini
Datei 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).