RDS Proxy - HA和Failover

当RDS实例进行故障转移时,RDS Proxy 通过在代理上对新连接和查询请求进行排队来帮助减少故障转移对应用程序的影响,从而减少应用程序在重试连接到数据库时收到的错误数量。

此外,RDS Proxy 还可以更快地检测故障转移完成情况,并帮助更快地恢复连接。

执行测试:

将下面代码保存为simple_failover.py

import argparse
import psycopg2
import time

# Parse the command line arguments
parser = argparse.ArgumentParser()
parser.add_argument('-e', '--endpoint', help="The database endpoint", required=True)
parser.add_argument('-u', '--username', help="The database user name", required=True)
parser.add_argument('-p', '--password', help="The database user password", required=True)
parser.add_argument('-d', '--dbname',   help="The database name", required=True)
args = parser.parse_args()

# Assign the credentials (input arguments) to variables
c_dbname=args.dbname
c_user=args.username
c_host=args.endpoint
c_pwd=args.password

# Connect to the DB
try:
    conn = psycopg2.connect(dbname=c_dbname,user=c_user,host=c_host,password=c_pwd,connect_timeout=1)
    conn.close()
except Exception as e:
    print(e)
    print ("Unable to connect to the database")
else:
    while True:
        try:
            conn = psycopg2.connect(dbname=c_dbname,user=c_user,host=c_host,password=c_pwd,connect_timeout=1)
            cur = conn.cursor()
            cur.execute('select clock_timestamp(),pg_is_in_recovery(),inet_server_addr()')

        except Exception as e2:
            print(e2)

        else:
            for result in cur:
                print("Connected to {} (host: {}) at {}".format(c_host, result[2], result[0].strftime("%H:%M:%S")))

            cur.close()
            conn.commit()
            conn.close()
            time.sleep(1)

安装依赖:

pip install psycopg2-binary

首先检查数据库实例端点在故障转移后恢复所需的时间。打开两个terminal,一个执行检查:

终端窗口 1:

## Run the script against the DB instance endpoint
python simple_failover.py -e $DBENDP -u $DBUSER -p $DBPASS -d pglab

终端窗口 2,启动目标数据库实例的故障转移重启

## Reboot the instance and force a failover
aws rds reboot-db-instance \
    --db-instance-identifier rds-pg-labs \
    --region $AWSREGION \
    --force-failover \
    --query 'DBInstance.DBInstanceStatus'

image-20231223221818905

中间影响了大概1分钟

针对RDS Proxy Endpoint执行脚本

现在,对RDS Proxy Endpoint运行相同的脚本:

终端窗口 1:

## Fetch the Proxy endpoint
PRXENDP=`aws rds describe-db-proxies \
    --db-proxy-name rds-pg-labs-proxy \
    --region $AWSREGION \
    --query 'DBProxies[].Endpoint' \
    --output text`

## Run the script against the DB instance endpoint
python simple_failover.py -e $PRXENDP -u $DBUSER -p $DBPASS -d pglab

从第二个终端窗口启动目标数据库实例的故障转移重启:

## Reboot the instance and force a failover
aws rds reboot-db-instance \
    --db-instance-identifier rds-pg-labs \
    --force-failover \
    --region $AWSREGION \
    --query 'DBInstance.DBInstanceStatus'

image-20231223222204484

中间影响了大概30s

结论

使用Proxy时,应用程序恢复速度更快,并且在故障转移期间收到的错误/异常更少,这演示了 RDS Proxy 如何帮助应用程序提高故障恢复能力并减少这些故障的破坏性。