RDS Proxy 在连接处理方面提供的优势之一是连接复用,其中代理使用较小的数据库连接集来处理来自大量客户端连接的请求。这种多路复用是使用事务作为粒度单位来执行的,这意味着代理在不同的数据库连接上执行来自同一客户端会话的不同事务,以实现多路复用优势。
我们使用pgbench 生成一个简单的工作负载,并比较使用和不使用 RDS Proxy 的行为。
在开始测试之前,我们需要获取数据库端的最大连接限制,该限制由max_connections
参数控制,执行以下命令:
export PGPASSWORD=$(echo $DBPASS)
psql -h $DBENDP -d pglab -U $DBUSER -c "SHOW max_connections"
初始化pgbench数据库:
pgbench -i -h $DBENDP -d pglab -U $DBUSER # 初始化pgbench
初始化完成后,在数据库中可以查看到创建出来的数据表:
我们将尝试执行创建比限制更多的连接的负载并观察行为(上面最大限制是403):
pgbench -h $DBENDP -U $DBUSER -d pglab -c 600 -n --select-only -T 300 -C -P 1 > temp-op1 2>&1
在上面的命令中:
-c
选项指定并发数据库会话的数量-T
指定每个客户端运行的秒数。-T
选项为 300,以便每个客户端会话运行足够长的时间,以便 CloudWatch 正确捕获。-n
选项指示pgbench
在运行测试之前不执行清理--select-only
选项指示pgbench
运行内置的select
脚本-C
选项指示pgbench
为每个事务建立新连接-P
选项控制进度报告的打印频率。我们将所有输出重定向到名为“temp-op1”的临时文件,读取输出文件来查看pgbench
引发的错误:
grep "FATAL" temp-op1 | head
上面的消息FATAL
表明pgbench
尝试创建比max_connections
更多的连接,从而达到了限制。
使用RDS Proxy执行上面查询,这次把并发连接数加大到1000个:
pgbench -h $PRXENDP -U $DBUSER -d pglab -c 1000 -n --select-only -T 600 -C -P 1 > temp-op2 2>&1
查看报错,发现没有任何输出:
grep "FATAL" temp-op2 | wc -l
在RDS Proxy的Metrics中,能看到相关的监控,我们看到,RDS Proxy只用了10个数据库连接就能为1000个并发客户端提供连接服务:
直接连接到数据库实例终端节点时,max_connections
值将作为连接限制,如果达到该限制,任何客户端都将无法建立新连接。
然而,当使用RDS Proxy时,它处理大量的客户端连接,并将它们复用在有限数量的数据库连接上,以便pgbench
能够建立比 RDS 实例限制更多的连接。这样,RDS Proxy 可以帮助扩展应用程序,并防止从数据库接收“连接过多”错误。