Almacenamiento de sesión PHP multimaestro de réplica activa de keydb

Almacenamiento de sesión PHP multimaestro de réplica activa de keydb

Estoy buscando usar keydb/redis para el almacenamiento de sesiones php en una configuración HA. Actualmente, tengo dos instancias de keydb ejecutándose con la siguiente configuración:

Instancia 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

Instancia 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

Tengo lo siguiente configurado dentro de la configuración de php

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"

Cuando ambas instancias están en línea, todo funciona como se esperaba. Cuando desconecto uno de los servidores keydb, php generará un error si selecciona esa instancia, en lugar de usar una que esté activa.

¿Hay alguna manera de hacer esto sin ejecutarlo a través de la configuración de estilo haproxy o centinela?

Respuesta1

Tuve un problema similar y no quería pasar por la molestia de configurar haproxy. En lugar de eso, puse mis nombres de host de Keydb en mi /etc/hostsarchivo y luego creé un check_keydbscript que monitorea cada servidor y luego modifica el /etc/hostsarchivo si uno de los servidores de Keydb falla. Este script se ejecuta una vez por minuto desde cron. También me enviará una alerta por correo electrónico si detecta un problema.

Para comprobar el estado de los servidores Keydb, suelo ncenviar un PINGcomando y luego esperar una +PONGrespuesta.

En mi caso, solo estoy usando un servidor Keydb principal y el otro es una copia de seguridad en caliente. Sin embargo, puede modificar fácilmente el script para manejar múltiples servidores activos. Si un servidor falla, simplemente haga que el script elimine su nombre de host del /etc/hostsarchivo.

A continuación se muestra una copia de mi guión. Por supuesto, deberá ajustar las direcciones IP y realizar los cambios necesarios para su configuración particular.

#
# 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

ADVERTENCIA: antes de activar su script en un servidor de producción, asegúrese de guardar una copia de su /etc/hostsarchivo original. Debería saberlo mejor después de 30 años, pero olvidé hacer esto y accidentalmente golpeé mi original y provoqué que varios servicios importantes se desconectaran durante unos minutos hasta que pude restaurar el archivo desde una copia de seguridad. Simplemente hazlo cp /etc/hosts /etc/hosts.baky podrás ahorrarte muchos problemas si algo sale mal.

Además, si tiene varios servidores web accediendo a sus servidores Keydb, deberá ejecutar este script en cada servidor para que ajuste su /etc/hostsarchivo local. Sin embargo, si ese es el caso, probablemente tendría más sentido simplemente configurar haproxy y realizar un equilibrio de carga/conmutación por error real.

Como alternativa a modificar el /etc/hostsarchivo, puede crear un script similar para modificar su php.iniarchivo y configurar su session.save_path =variable para que solo incluya los servidores Keydb actualmente activos (solo recuerde hacer un comando de "recargar" para cualquier servidor web que esté ejecutando).

información relacionada