keydb active-replica 多主 php 会话存储

keydb active-replica 多主 php 会话存储

我希望在 HA 设置中使用 keydb/redis 进行 php 会话存储。目前,我有两个 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,然后创建一个脚本来监视每个服务器,如果其中一个 Keydb 服务器出现故障,check_keydb则修改文件。此脚本从 开始每分钟运行一次。如果检测到问题,它还会向我发送电子邮件警报。/etc/hostscron

为了检查 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如果出现问题,您就可以省去很多麻烦。

此外,如果您有多个 Web 服务器访问 Keydb 服务器,则需要在每个服务器上运行此脚本以使其调整其本地/etc/hosts文件。但是,如果是这种情况,设置 haproxy 并进行真正的负载平衡/故障转移可能更有意义。

作为修改文件的替代方法/etc/hosts,您可以创建类似的脚本来修改php.ini文件并将变量设置session.save_path =为仅包含当前活动的 Keydb 服务器(只需记住对您正在运行的任何 Web 服务器执行“重新加载”命令)。

相关内容