RDS的数据库独享代理提供连接池功能,您可以根据业务选择合适的连接池类型,有效解决连接数过多或短连接业务(例如PHP)频繁建立新连接导致实例负载过高的问题。

前提条件

实例已开通数据库独享代理

背景信息

RDS独享代理提供2种类型连接池,详细说明如下:

  • 事务级连接池(默认)

    独享代理默认使用事务级连接池,适用于总连接数比较多(如连接数上万)的场景。

    事务级连接池可以减少业务的连接数和短连接场景下频繁新建连接带来的负载。客户端可以与代理建立大量连接,但代理到数据库只创建少量连接。当客户端发送连接请求时,代理将从连接池中选取符合条件(与系统变量一致)的连接发送到数据库,并在当前事务结束后将该连接放回连接池。

    事务级连接池使用中有一些限制,请参见事务级连接池限制

  • 会话级连接池

    会话级连接池适用于短连接场景。

    会话级连接池主要用于减少短连接业务频繁建立新连接带来的实例负载。当某客户端连接断开时,系统会判断当前连接是否为闲置连接,如果是闲置连接,系统将会代理该连接并在连接池中保留一小段时间。当客户端重新发起连接请求时,若该闲置连接仍保留在连接池中,则可直接使用已保留的闲置连接(命中的条件包括user、clientip和dbname等),从而减少与数据库的建连开销。如果连接池内没有可用的闲置连接,则走正常连接流程,与数据库重新建立新连接。

    说明 会话级连接池并不能减少数据库的并发连接数,而是通过降低应用与数据库建立连接的速率来减少MySQL主线程的开销,更好地处理业务请求。但连接池里的闲置连接会短暂占用您的连接数。

注意事项

  • 当前连接池功能不支持同一账号对不同IP有不同权限,这可能会导致连接复用时权限出错。例如user@192.168.1.1设置了database_a的权限,而user@192.168.1.2没有database_a的权限,开通连接池可能会导致权限错误问题。
  • 连接池功能是指Proxy的连接池功能,不影响客户端的连接池功能,如果您的客户端已经支持连接池,则可以不使用Proxy的连接池功能。

事务级连接池限制

  • 执行以下操作时,连接将被锁定直至连接结束(即该连接不会再被放到连接池里供其它用户连接使用)。
    • 执行prepare语句或命令。
    • 创建临时表。
    • 修改用户变量。
    • 大报文(例如16M以上)。
    • 使用lock table。
    • 多语句。
    • 存储过程调用。
  • 不支持FOUND_ROWS、ROW_COUNT和LAST_INSERT_ID函数的调用,即使这些函数调用成功,也无法保证结果是否正确。
  • 对于设置了wait_timeout的连接,wait_timeout在客户端的表现可能不会生效,因为每次请求都会从连接池中获取连接,当wait_timeout超时后,只有连接池中的后端连接会断开,而后端连接断开并不会导致客户端连接断开。
  • 除了sql_modecharacter_set_servercollation_servertime_zone这四个变量以外,如果业务依赖其他session级别的系统变量,那么需要客户端在建连之后显式执行set语句,否则连接池可能会复用系统变量已经被更改过的连接。
  • 由于连接可能会被复用,您可以使用select connection_id()查询当前连接的thread id。
  • 由于连接可能会被复用,所以show processlist显示的IP地址和端口可能和客户端实际的IP地址和端口不一致。
  • 数据库代理会将所有节点上的show processlist结果合并后返回,在事务级连接池开启后,前端连接和后端连接的thread id无法对应。这导致kill命令可能会报错,但是实际上kill命令已经正常执行成功,可再通过show processlist确定相应的连接是否断开。

修改连接池

  1. 登录RDS管理控制台
  2. 在左侧单击实例列表,然后在上方选择实例所在地域。
    选择地域
  3. 找到目标实例,单击实例ID。
  4. 在左侧导航栏中单击数据库代理
  5. 连接池右侧选择连接池类型。
    说明 修改连接池类型仅对新连接生效。
    连接池