keydb アクティブレプリカ マルチマスター PHP セッション ストレージ

keydb アクティブレプリカ マルチマスター PHP セッション ストレージ

HA セットアップで PHP セッション ストレージに keydb/redis を使用したいと考えています。現在、次の構成で 2 つの 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 サーバーの 1 つをオフラインにすると、アクティブなインスタンスを使用する代わりにそのインスタンスを選択すると、php はエラーを出力します。

haproxy または sentinel スタイルの構成を実行せずにこれを実行する方法はありますか?

答え1

私も同様の問題を抱えていましたが、haproxy を設定する手間を省きたいと思っていました。その代わりに、Keydb ホスト名をファイルに入れて、各サーバーを監視し、Keydb サーバーの 1 つがダウンした場合にファイルを変更するスクリプト/etc/hostsを作成しました。このスクリプトは から 1 分ごとに実行されます。また、問題が検出されると電子メール アラートが送信されます。check_keydb/etc/hostscron

Keydb サーバーのステータスを確認するには、コマンドncを送信して応答PINGを待ちます+PONG

私の場合、プライマリ Keydb サーバーを 1 つだけ使用し、もう 1 つはホット バックアップです。ただし、スクリプトを簡単に変更して、複数のアクティブ サーバーを処理することができます。サーバーがダウンした場合は、スクリプトでファイルからそのホスト名を削除するだけです/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 サーバーに対して「reload」コマンドを実行することを忘れないでください)。

関連情報