
Я ищу способ использовать 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» для любого веб-сервера, который вы используете).