留言

Amazon RDS Proxy 对 PostgreSQL 扩展查询协议的多路复用支持 数据库博客

PostgreSQL扩展查询协议在Amazon RDS Proxy下的多路复用支持

通过 Kiran Singh、Chirag Dave、Vinodkrishna Gopalan 和 Yoni Shalom 于 2023年11月10日发布

在本篇文章中,我们将介绍Amazon RDS Proxy对PostgreSQL扩展查询协议的多路复用支持。这项新功能将增强RDS Proxy的连接池能力,进而减少数据库连接的开销,并提供更快、更顺畅的故障转移体验。

关键要点

在本文中,您将了解到:

PostgreSQL 扩展查询协议的概述及其在客户机与服务器之间的通信。Amazon RDS Proxy的多路复用功能及其对连接池的改善。如何通过扩展查询协议利用RDS Proxy的多路复用功能。

RDS Proxy多路复用概述

RDS Proxy是一个完全托管、高可用性的数据库代理,旨在帮助应用程序更具可扩展性、对数据库故障更具弹性,并增强安全性。RDS Proxy允许您管理应用程序对数据库的访问,并支持连接池、多路复用和优雅的故障转移。这使您能够超越数据库连接限制,并管理连接的突发需求。

多路复用的价值

RDS Proxy的一个重要特点是连接多路复用。默认情况下,RDS Proxy可以在会话结束后重用连接,该过程称为多路复用。RDS Proxy临时从连接池中移除连接以进行重用,这一操作叫做借用连接。而在确认安全后,RDS Proxy将该连接返回到连接池。当后续事务不依赖于来自之前请求的会话状态信息时,跨事务的连接重用效率更高。

连接状态的影响

客户端连接到代理后,可能会进入一种称为固定状态。在固定状态下,来自同一客户端连接的后续事务将使用相同的数据库连接。一旦客户端连接断开,固定状态就会结束。RDS Proxy当检测到不适合其他会话的会话状态更改时,会自动将客户端连接固定到特定的数据库连接,从而降低了连接重用的有效性。

在典型的生产场景中,应用程序或许会使用诸如DBCP、CP30、HikariCP、psycopg或Npgsql等库进行客户端连接池管理。随着需求的增长,您会自动或手动扩展应用程序节点,从而增加数据库连接数。

例如,您的应用程序可能从10个节点开始,每个节点保持100个连接,最终总共达到1000个数据库连接。随着业务增长,当您扩展应用程序到50个节点后,系统可能会遇到因内存需求增加而导致的数据库瓶颈,甚至达到maxconnections,这会迫使您扩展数据库计算实例,或者在某些情况下重新设计应用程序。

为了缓解这个问题,您可以使用集中管理的连接池,它可以减少数据库在高负载下的连接需求。然而,RDS Proxy或其他开源连接池也有不同的限制,尤其是在支持准备语句时,例如,有些代理无法正确管理准备语句状态,导致准备语句在连接间泄漏。RDS Proxy通过将连接固定到准备语句来解决这一问题,从而导致数据库连接的总数与客户端连接的数量相同,而无法有效减少数据库连接总数。

在这样的场景中,您可能会看到的典型日志消息是:

客户端会话被固定到数据库连接[],直到会话结束。代理无法重用该连接。原因:检测到解析消息。

PostgreSQL扩展查询协议的新功能

直到今天,当客户端下载PostgreSQL扩展查询协议以通过RDS Proxy连接到其Amazon RDS或Amazon Aurora数据库时,连接会被固定到客户端连接。扩展查询协议现在在许多常用的客户端框架中已成为默认选项。然而,到目前为止,使用这些框架的应用程序无法享受到RDS Proxy的多路复用优势。正如前文所述,当RDS Proxy检测到会话状态变化例如准备语句时,会自动将客户端连接固定到特定的数据库连接。

通过此次发布,使用扩展查询协议连接的应用程序现在可以受益于RDS Proxy的多路复用。我们添加了监控和记录协议级准备语句的能力,使RDS Proxy能够在不受会话状态影响的情况下进行多路复用,同时限制数据库连接的需求。

为了理解RDS Proxy如何支持扩展查询协议的多路复用,我们首先需要了解PostgreSQL的扩展查询协议在客户机与服务器间的通信。

扩展查询协议详细介绍

扩展查询协议允许将SQL命令的执行划分为多个步骤。执行周期包含四个阶段:解析、绑定、执行和同步。每个阶段保留的状态由两种类型的对象表示:准备语句和门户。

解析:解析信息包含带有参数描述和目标准备语句对象名称的查询字符串。在扩展查询协议中,解析消息中的查询字符串不允许包括超过一个的SQL语句。准备语句会持续到当前会话结束。绑定:绑定消息创建一个门户,它表示已准备好运行的准备语句,并用参数值填充。命名门户持续到当前事务结束。执行:通过执行消息触发包含查询及已绑定参数的门户的实际执行。如果查询会返回行例如SELECT、SHOW等,执行步骤可以指示仅获取有限的行,这样就可能需要多个执行步骤来完成操作。同步:为了完成一批扩展查询消息,前端会发送同步消息。

有关扩展查询协议的更多信息,请参见扩展查询。

RDS Proxy对扩展查询协议的多路复用支持

通过此次发布,RDS Proxy在处理请求和响应消息时,将监控并记录每个客户端连接创建的所有准备语句。所有被监控的准备语句都将保持在客户端连接内,并将与客户端连接一同销毁。在事务完成后,数据库连接将被返回到连接池。如果随后同一客户端连接的请求引用了一个跟踪的准备语句例如通过BIND、DESCRIBE或CLOSE消息,RDS Proxy将根据新借用的数据库连接中的工作负载重新引入准备语句。此过程不会增加额外的数据库往返延迟,而是通过高效地将信息附加到从客户端连接接收到的扩展协议消息批次中来实现。

需要注意的是,对于准备语句的多路复用仅限于扩展查询协议消息。如果你使用查询级的PREPARE、DISCARD、DEALLOCATE或EXECUTE语句,或者使用对pgpreparedstatements视图的查询,仍会导致固定。

使用扩展查询协议时RDS Proxy多路复用的影响

为演示多路复用对工作负载可能产生的影响,我们在100个客户端环境下运行了针对pgbench的工作负载,并使用protocol=extended参数。我们运行了有和没有多路复用支持的测试,并监测了Amazon CloudWatch的指标。

下图展示了在使用没有多路复用支持的RDS Proxy时运行工作负载的结果。数据库连接数100与客户端连接数100相同,并且连接被固定,导致没有对数据库连接的重用。

Amazon RDS Proxy 对 PostgreSQL 扩展查询协议的多路复用支持 数据库博客

然而,如下图所示,在使用支持多路复用的RDS Proxy时,CloudWatch指标显示准备语句被多路复用,导致数据库连接数显著减少到30,而客户端连接依然保持在100不变。可以注意到没有连接被固定,实际上实现了连接的重用。

如何开始

使用扩展查询协议的多路复用功能在RDS Proxy中已自动启用,因此您无需采取任何措施。如果您使用扩展查询协议的客户端,将在使用RDS Proxy时看到以下几点:

RDS Proxy的CloudWatch指标中,数据库连接总数和固定连接数均显著减少。这意味着多路复用按预期工作,导致数据库连接数减小。RDS Proxy日志中与固定状态相关的日志消息减少:

客户端会话被固定到数据库连接[],直到会话结束。代理无法重用该连接。原因:检测到解析消息。

flyingbird飞鸟机场

结论

大多数PostgreSQL驱动程序默认使用扩展查询协议,而直到现在,这会导致在使用RDS Proxy时固定连接。固定连接会导致对数据库连接和PostgreSQL数据库内存使用的更高需求。通过此次发布,RDS Proxy可以为扩展查询协议客户端的准备语句执行连接多路复用,从而限制数据库连接和资源消耗。

我们欢迎您的反馈。如果您有任何问题或建议,请在评论区留言。

关于作者

Kiran Singh 是AWS的资深数据库专家解决方案架构师。Kiran专注于Amazon RDS和Amazon Aurora,并且是PostgreSQL领域的专家。Kiran与ISV合作伙伴共同设计和实施数据库迁移及现代化战略,并为客户提供构建可扩展、安全、性能优越和健壮的数据库架构的支持。

Chirag Dave 是亚马逊网络服务AWS的首席解决方案架构师,专注于管理PostgreSQL。他与客户保持技术关系,提供关于安全、成本、性能、可靠性、操作效率和最佳实践架构的建议。

Yoni Shalom 是AWS RDS的高级软件工程师,专注于数据库领域的应用程序网络解决方案,并担任RDS Proxy服务的首席工程师。

Vinodkrishna Gopalan 是AWS RDS的资深软件开发经理,负责RDS应用程序网络组织的领导工作。

使用 Amazon MSK 流式处理多租户数据 大数据博客