keydb 활성 복제본 다중 마스터 PHP 세션 저장

keydb 활성 복제본 다중 마스터 PHP 세션 저장

HA 설정에서 PHP 세션 저장을 위해 keydb/redis를 사용하려고 합니다. 현재 다음 구성으로 실행되는 두 개의 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/hostsKeydb 서버 중 하나가 완료되면 파일을 수정하는 스크립트를 만들었습니다. 이 스크립트는 에서 1분에 한 번씩 실행됩니다 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년이 지나면 더 잘 알겠지만, 이 작업을 잊어버리고 실수로 원본을 손상시켰으며 백업에서 파일을 복원할 수 있을 때까지 몇 분 동안 여러 중요한 서비스가 오프라인 상태가 되었습니다. 그냥 a를 수행 cp /etc/hosts /etc/hosts.bak하면 문제가 발생하더라도 많은 문제를 피할 수 있습니다.

또한 Keydb 서버에 액세스하는 웹 서버가 여러 개 있는 경우 각 서버에서 이 스크립트를 실행하여 로컬 파일을 조정해야 합니다 /etc/hosts. 그러나 그렇다면 haproxy를 설정하고 실제 로드 밸런싱/장애 조치를 수행하는 것이 더 합리적일 것입니다.

파일 을 수정하는 대신 /etc/hosts유사한 스크립트를 만들어 파일을 수정 하고 현재 활성 Keydb 서버만 포함하도록 변수를 php.ini설정할 수 있습니다(실행 중인 웹서버에 대해 "다시 로드" 명령을 수행하는 것을 기억하세요).session.save_path =

관련 정보