我如何增加 Amazon RDS for MySQL 或 Amazon RDS for PostgreSQL 实例的最大连接数?

上次更新日期:2022 年 8 月 26 日

我想增加 Amazon Relational Database Service (Amazon RDS) for MySQL 或 Amazon RDS for PostgreSQL 数据库实例的最大连接数。

解决方法

查看当前的 max_connections 值

在 Amazon RDS for MySQL 中,max_connections 指标用于监控设置的最大(允许的)客户端同时连接数。

原定设置下,max_connections 参数基于 Amazon RDS for MySQL 中的以下公式(根据 DBInstanceClassMemory 值计算):

max_connections = DBInstanceClassMemory/12582880

要检查 max_connections 的当前值,请在连接到 Amazon RDS for MySQL 实例后运行以下命令:

SHOW GLOBAL VARIABLES LIKE 'max_connections';

在 Amazon RDS for PostgreSQL 中,max_connections 指标用于监控设置的最大同时连接数。原定设置下,max_connections 参数基于 Amazon RDS for PostgreSQL 中的以下公式(根据 DBInstanceClassMemory 值计算):

max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)

要检查 max_connections 的当前值,请在连接到 Amazon RDS for PostgreSQL 实例后运行以下命令:

postgres=> show max_connections;

RDS for MySQL 和 RDS for PostgreSQL 的 max_connections 默认值取决于 Amazon RDS 实例使用的实例类。数据库实例类的可用内存越多,支持的数据库连接数就越多。

请注意,使用公式计算的 max_connections 的默认数量可能与前面命令返回的默认连接数略有不同。这是因为总计 DBInstanceClassMemory 中的一些内存是为底层操作系统操作预留的。前面的命令只考虑为 PostgreSQL 引擎预留的内存,而不考虑为底层主机操作系统预留的内存。

查看连接过多的原因

当客户端连接数超过 max_connections 值时,您会收到类似于以下内容的错误:

以下因素可能导致数据库连接数超过 max_connections 值:

与数据库实例的客户端/应用程序连接数增加:这是由工作负载增加或表/行级别锁定导致的。

操作结束后未正确关闭客户端或应用程序连接:如果服务器连接未正确关闭,客户端应用程序将打开新连接。随着时间的推移,这些新的服务器连接可能会导致您的实例超过 max_connections 值。要列出 RDS for MySQL 数据库实例的所有活动连接,请运行以下命令:

SHOW FULL PROCESSLIST

要查看 RDS for PostgreSQL 实例的每个数据库的连接,请运行以下命令:

SELECT datname, numbackends FROM pg_stat_database;

休眠连接:当您为连接超时参数(例如 MySQL 中的 wait_timeoutinteractive_timeout)设置较高的值时,就会导致休眠连接(也称为非活动开放连接)。如果您配置的连接限制非常高,那么即使没有使用这些连接,最终也可能会导致更高的内存使用率。因此,当应用程序服务器尝试打开与数据库的所有客户端连接时,这些连接可能会被拒绝。要终止 RDS for MySQL 数据库实例中的休眠连接,请运行以下命令:

CALL mysql.rds_kill(example-pid);

空闲连接:您可以通过运行以下查询查看 RDS for PostgreSQL 实例中的空闲连接。此查询会显示有关处于下列任何状态超过 15 分钟的后端进程信息:“idle”(空闲)、“idle in transaction”(事务处理中空闲)、“idle in transaction (aborted)”[事务处理中空闲(已中止)]和“disabled”(已禁用)。

SELECT * FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE;

要终止 RDS for PostgreSQL 实例中的空闲连接,请运行以下命令:

SELECT pg_terminate_backend(example-pid)

提示:最佳实践是仅配置应用程序性能所需的活动连接。您也可以考虑升级到更大的 Amazon RDS 数据库实例类。

增加 max_connections 的值

您可以使用以下方法增加与 RDS for MySQL 或 RDS for PostgreSQL 数据库实例的最大连接数:

  • 使用自定义实例级别参数组为 max_connections 参数设置一个较大值。提高 max_connections 参数不会导致中断。尽管您可以将 max_connections 的值增加到超出默认值,但这并不是最佳实践。这是因为,当工作负载增加且需要更多内存时,实例可能会遇到问题。连接数的增加会提高内存使用量。内存不足的实例可能会崩溃。对于较小的实例,情况尤其如此。如果增加 max_connections 值,请务必监控资源的使用情况。另外,请务必咨询您的 DBA 以了解资源增加存在的问题。最佳实践是保留默认值,或者在需要更多连接时纵向扩展到更大的实例类。
  • 如果数据库实例使用的是原定设置参数组,则应将参数组更改为自定义参数组。确保将自定义数据库参数组与 Amazon RDS 实例相关联,然后重新启动该实例。新的自定义参数组与数据库实例关联后,可以修改 max_connections 参数值。有关更多信息,请参阅如何修改 Amazon RDS 数据库参数组中的值?
    注意:更改参数组可能会导致中断。有关更多信息,请参阅使用数据库参数组
  • 将数据库实例扩展到内存更多的数据库实例类。请注意,扩展 RDS 实例会影响账户的账单。要了解更多信息,请参阅 Amazon RDS 的数据库实例账单
    警告:修改 Amazon RDS 数据库实例时会发生停机。

遵循配置 max_connections 参数的最佳实践

使用数据库实例的 max_connections 参数时,请务必考虑以下最佳实践:

  • 如果系统对其他主要的内存消耗者(如缓冲池)使用的是原定设置值,则需要调整系统的默认连接限制。最佳实践是纵向扩展实例类,而不是更改实例类的值。但是,如果实例有大量可用内存,则可以手动更改此参数。在更改数据库实例的这些设置之前,则请考虑调整连接限制以增加或减少数据库实例的可用内存。
  • max_connections 值设置为略高于每个数据库实例上预计打开的最大连接数。
  • 对于 RDS for MySQL 实例,如果您激活了性能架构,请密切注意 max_connections 参数设置。性能架构内存结构将根据服务器配置变量自动调整大小。您设置的变量越高,性能架构使用的内存就越多。在极端情况下,此状况可能会导致小型实例类型(如 T2 和 T3)内存不足的问题。如果您使用的是性能架构,则最佳实践是将 max_connections 设置保留为原定设置值。如果您计划大幅增加 max_connections 值(高于原定设置值),则请考虑禁用性能架构。
    注意:如果您为 Amazon RDS for MySQL 数据库实例激活 Performance Insights,则性能架构也会自动激活。
  • 对于 RDS for MySQL 实例,在调整 max_connections 参数时,请务必查看以下与 MySQL 连接相关的参数:wait_timeout:服务器在非交互式 TCP/IP 或 Unix 文件连接上等待活动的秒数(在关闭连接之前)
    interactive_timeout:服务器在关闭交互式连接之前等待其活动的秒数。
    net_read_timeout:在丢弃读取活动之前等待来自 TCP/IP 连接的更多数据的秒数
    net_write_timeout:在丢弃写入活动之前等待 TCP/IP 连接写入数据块的秒数
    max_execution_time:SELECT 语句执行超时时间(单位为毫秒)
    max_connect_errors:如果连接中断的数量超过该参数,则主机将被阻止继续连接
    max_user_connections:任何给定 MySQL 账户允许同时连接的最大数量
  • 对于 RDS for PostgreSQL 实例,在调整 max_connections 参数时,请务必同时查看以下与 PostgreSQL 连接相关的参数:
    idle_in_transaction_session_timeout:终止空闲时间超过指定持续时间(以毫秒为单位)的已开启事务的任何会话。这样可释放该会话持有的任何锁定并重新使用连接槽。此外,仅此事务可见的元组会被清理。
    tcp_keepalives_idle:操作系统向客户端发送 TCP keepalive 消息的非活动秒数
    tcp_keepalives_interval:经过此时间后,客户端未确认的 TCP keepalive 消息将再次传输的秒数
    tcp_keepalives_count:在服务器与客户端的连接视为失效之前可能丢失的 TCP Keepalive 数量。

注意:本文不提供所列参数的推荐值,因为这些值因使用案例而异。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?