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/hosts
archivo y luego creé un check_keydb
script que monitorea cada servidor y luego modifica el /etc/hosts
archivo 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 nc
enviar un PING
comando y luego esperar una +PONG
respuesta.
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/hosts
archivo.
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/hosts
archivo 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.bak
y 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/hosts
archivo 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/hosts
archivo, puede crear un script similar para modificar su php.ini
archivo 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).