
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/hosts
arquivo e, em seguida, criei um check_keydb
script que monitora cada servidor e, em seguida, modifica o /etc/hosts
arquivo 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 nc
enviar um PING
comando e aguardar uma +PONG
resposta.
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/hosts
arquivo.
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/hosts
arquivo 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.bak
e 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/hosts
arquivo 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/hosts
arquivo, você pode criar um script semelhante para modificar seu php.ini
arquivo 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).