首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >keydb活动复制多主php会话存储

keydb活动复制多主php会话存储
EN

Server Fault用户
提问于 2022-11-23 02:04:08
回答 1查看 191关注 0票数 1

我希望在HA设置中将keydb/redis用于php会话存储。目前,我有两个keydb实例,其配置如下:

实例1 (192.168.2.10)

代码语言:javascript
复制
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)

代码语言:javascript
复制
requirepass pass123
masterauth pass123
# you will need to configure the following
multi-master yes
active-replica yes
replicaof 192.168.2.10 6379

然后,我在php设置中配置了以下内容

代码语言:javascript
复制
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或哨兵样式配置来运行它的方法?

EN

回答 1

Server Fault用户

发布于 2023-02-22 22:14:32

我也有一个类似的问题,不想经历设置哈代的麻烦。相反,我将我的Keydb主机名放在我的/etc/hosts文件中,然后创建一个check_keydb脚本,该脚本监视每个服务器,然后在其中一个Keydb服务器运行时修改/etc/hosts文件。这个脚本从cron每分钟运行一次。如果发现问题,它也会给我发电子邮件警报。

要检查Keydb服务器的状态,我使用nc发送PING命令,然后等待+PONG响应。

在我的例子中,我只使用一个主Keydb服务器,另一个是热备份。但是,您可以轻松地修改脚本以处理多个活动服务器。如果服务器出现故障,只需让脚本从/etc/hosts文件中删除其主机名即可。

下面是我剧本的副本。当然,您需要调整IP地址,并对特定配置进行任何必要的更改。

代码语言:javascript
复制
#
# 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="check_keydb@mydomain.com"
NOTIFY_EMAIL="admin@mydomain.com"

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,如果出了问题,你可以省去很多麻烦。

此外,如果有多个need服务器访问您的Keydb服务器,则需要在每个服务器上运行此脚本,使其调整其本地/etc/hosts文件。然而,如果是这样的话,那么仅仅设置make并进行真正的负载平衡/故障转移可能会更有意义。

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

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1116372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档