keydb 主動副本多主 PHP 會話存儲

keydb 主動副本多主 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 或哨兵風格配置運行的情況下實現此目的?

答案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 伺服器(只需記住對您正在執行的任何 Web 伺服器執行「重新載入」命令)。

相關內容