keydb активная реплика мультимастерное хранилище сеансов php

keydb активная реплика мультимастерное хранилище сеансов php

Я ищу способ использовать keydb/redis для хранения сеансов php в настройке HA. В настоящее время у меня запущены два экземпляра keydb со следующей конфигурацией:

Экземпляр 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

Экземпляр 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

Затем я настроил следующее в настройках 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"

Когда оба экземпляра находятся в сети, все работает как и ожидалось. Когда я отключаю один из серверов keydb, php выдает ошибку, если выбирает этот экземпляр — вместо того, чтобы использовать активный.

Есть ли способ сделать это без использования конфигурации в стиле haproxy или sentinel?

решение1

У меня была похожая проблема, и я не хотел тратить время на настройку haproxy. Вместо этого я поместил свои имена хостов Keydb в свой /etc/hostsфайл, а затем создал check_keydbскрипт, который отслеживает каждый сервер, а затем изменяет /etc/hostsфайл, если один из серверов Keydb завершает работу. Этот скрипт запускается раз в минуту из cron. Он также отправит мне оповещение по электронной почте, если обнаружит проблему.

Чтобы проверить состояние серверов Keydb, я ncотправляю PINGкоманду и жду +PONGответа.

В моем случае я просто использую один основной сервер Keydb, а другой — горячий резерв. Однако вы можете легко изменить скрипт для обработки нескольких активных серверов. Если сервер выйдет из строя, просто сделайте так, чтобы скрипт удалил его имя хоста из файла /etc/hosts.

Ниже приведена копия моего скрипта. Конечно, вам нужно будет настроить IP-адреса и внести любые изменения, необходимые для вашей конкретной конфигурации.

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

ВНИМАНИЕ: прежде чем активировать скрипт на производственном сервере, обязательно сохраните копию исходного /etc/hostsфайла. Мне следовало бы знать лучше за 30 лет, но я забыл это сделать и случайно затёр свой оригинал, что привело к отключению нескольких важных служб на несколько минут, пока я не смог восстановить файл из резервной копии. Просто сделайте это, cp /etc/hosts /etc/hosts.bakи вы сможете избавить себя от многих проблем, если что-то пойдёт не так.

Также, если у вас есть несколько веб-серверов, получающих доступ к вашим серверам Keydb, вам нужно будет запустить этот скрипт на каждом сервере, чтобы он настроил их локальный /etc/hostsфайл. Однако, если это так, то, вероятно, было бы разумнее просто настроить haproxy и выполнить настоящую балансировку нагрузки/отказоустойчивость.

В качестве альтернативы изменению /etc/hostsфайла вы можете создать аналогичный скрипт для изменения вашего php.iniфайла и настроить session.save_path =переменную так, чтобы она включала только активные в данный момент серверы Keydb (только не забудьте выполнить команду «reload» для любого веб-сервера, который вы используете).

Связанный контент