armazenamento de sessão php multimestre de réplica ativa keydb

armazenamento de sessão php multimestre de réplica ativa keydb

Estou procurando usar keydb/redis para armazenamento de sessão php em uma configuração de HA. Atualmente, tenho duas instâncias do keydb em execução com a seguinte configuração:

Instância 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

Instância 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

Eu tenho o seguinte configurado nas configurações do 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"

Quando ambas as instâncias estão online, tudo funciona conforme o esperado. Quando coloco um dos servidores keydb off-line, o php apresentará um erro se selecionar essa instância - em vez de usar uma que esteja ativa.

Existe uma maneira de fazer isso sem executá-lo por meio da configuração do estilo haproxy ou sentinela?

Responder1

Eu tive um problema semelhante e não queria ter o trabalho de configurar o haproxy. Em vez disso, coloquei meus nomes de host Keydb em meu /etc/hostsarquivo e, em seguida, criei um check_keydbscript que monitora cada servidor e, em seguida, modifica o /etc/hostsarquivo se um dos servidores Keydb for concluído. Este script é executado uma vez por minuto no cron. Ele também me enviará um alerta por e-mail se detectar um problema.

Para verificar o status dos servidores Keydb, costumo ncenviar um PINGcomando e aguardar uma +PONGresposta.

No meu caso, estou usando apenas um servidor Keydb primário e o outro é um backup ativo. No entanto, você pode modificar facilmente o script para lidar com vários servidores ativos. Se um servidor cair, basta fazer o script remover seu nome de host do /etc/hostsarquivo.

Abaixo está uma cópia do meu script. Claro, você precisará ajustar os endereços IP e fazer as alterações necessárias para sua configuração específica.

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

AVISO: antes de ativar seu script em um servidor de produção, salve uma cópia do /etc/hostsarquivo original. Eu deveria saber melhor depois de 30 anos, mas esqueci de fazer isso e acidentalmente destrui meu original e fiz com que vários serviços importantes ficassem off-line por alguns minutos até que eu pudesse restaurar o arquivo de um backup. Basta fazer um cp /etc/hosts /etc/hosts.bake você poderá evitar muitos problemas se algo der errado.

Além disso, se você tiver vários servidores web acessando seus servidores Keydb, você precisará executar este script em cada servidor para ajustar seu /etc/hostsarquivo local. No entanto, se for esse o caso, provavelmente faria mais sentido apenas configurar o haproxy e fazer balanceamento de carga/failover real.

Como alternativa à modificação do /etc/hostsarquivo, você pode criar um script semelhante para modificar seu php.iniarquivo e definir sua session.save_path =variável para incluir apenas os servidores Keydb atualmente ativos (lembre-se de executar um comando "recarregar" para qualquer servidor web que você esteja executando).

informação relacionada