跳至内容

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

2 分钟阅读
0

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

解决方案

**注意:**在增加最大连接数之前,最佳做法是优化现有配置。

检查当前的 max_connections 值

max_connections 指标用于设置 RDS for MySQL 和 RDS for PostgreSQL 的最大数据库连接数。max_connections 的默认值取决于 Amazon RDS 实例使用的实例类。数据库实例类可用内存越多,数据库连接数越大。

要检查 max_connections 值,请连接到您的数据库引擎的 Amazon RDS 数据库实例并运行以下命令。

  • RDS for MySQL:

    SHOW GLOBAL VARIABLES LIKE 'max_connections';
  • RDS for PostgreSQL:

    postgres=> show max_connections;

**注意:**使用公式计算的默认 max_connections 数可能与上述命令的输出结果略有不同。出现此差异是因为 Amazon RDS 从总 DBInstanceClassMemory 中为底层操作系统操作预留了一些内存。上述命令仅使用为 PostgreSQL 引擎预留的内存,不使用为底层主机操作系统预留的内存。

优化您的现有连接

在增加 max_connections 的值之前,请检查是否可以减少现有连接的数量。当客户端连接的数量超过 max_connections 值时,您会收到以下错误之一:

当 Amazon RDS 的工作负载增加或具有表级锁或行级锁时,可能会发生这些错误。如果您的实例上的工作负载按预期运行,则您必须增加 max_connections 参数的值。

检查操作结束后是否关闭了所有客户端和应用程序连接

如果服务器连接未关闭,客户端应用程序将打开一个新连接。随着时间的推移,这些新的服务器连接可能会导致您的实例超过 max_connections 值。

要列出 RDS for MySQL 数据库实例的所有连接,请运行以下命令:

SHOW FULL PROCESSLIST;

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

SELECT datname, numbackends FROM pg_stat_database;

(仅适用于 MySQL)检查是否存在休眠连接

当您为连接超时参数(例如 wait_timeout 或 interactive_timeout)设置较高的值时,打开的连接会出现休眠或处于非活动状态。如果您配置了较高的连接配额,则即使您没有使用这些连接,内存使用率也可能会很高。

要查看 RDS for MySQL 实例中的空闲连接,请运行以下查询:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND='Sleep';

要终止 RDS for MySQL 数据库实例中的休眠连接,请运行以下命令:

CALL mysql.rds_kill(example-pid);

(仅适用于 PostgreSQL)检查是否存在空闲连接

要查看 RDS for PostgreSQL 实例中的空闲连接,请运行以下查询:

    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;

查询输出中将显示处于空闲、事务空闲、事务空闲(已中止)或已禁用状态超过 15 分钟的后端进程。

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

SELECT pg_terminate_backend(example-pid);

**注意:**最佳做法是仅配置应用程序性能所需的活动连接。如果您的应用程序结构需要空闲连接,则最佳做法是使用 Amazon RDS 代理。

增加最大连接数

**注意:**当您纵向扩展实例时,您会遇到停机并更改计费方式。

要增加最大连接数,最佳做法是将数据库实例纵向扩展到具有更多内存的数据库实例类。将 max_connections 参数增加到超过默认值并不是最佳做法。当更多的连接需要使用更多内存时,该实例可能会遇到问题。内存不足的实例可能会崩溃。如果您增加 max_connections 值,请监控 FreeableMemory Amazon CloudWatch 指标以监控您的资源使用情况。

但是,如果您的实例有大量可用内存,则可以手动更改 max_connections 参数。在调整 max_connections 之前,请调整参数组中的连接限制,以考虑数据库实例上可用内存的变化。

如果您的数据库实例使用默认参数组,则您必须创建和使用自定义参数组来修改 max_connections。将自定义数据库参数组与您的 Amazon RDS 实例相关联,然后重启该实例。将新的自定义参数组与您的数据库实例关联后,您可以修改 max_connections 参数值。有关详细信息,请参阅“如何修改 Amazon RDS 数据库参数组中的值”。将 max_connections 值设置为略高于您期望在每个数据库实例上打开的最大连接数。

**注意:**在重启期间,您会遇到短暂的中断。

RDS for MySQL 增加 max_connections 的最佳实践

如果您激活了性能架构,则最佳做法是使用默认的 max_connections 设置。性能架构内存结构会根据服务器配置变量自动调整大小。

**注意:**如果您为 Amazon RDS for MySQL 数据库实例激活性能详情,则性能架构将自动激活。

针对您的用例,优化以下 MySQL 连接相关参数的超时设置:

  • wait_timeout
  • interactive_timeout
  • net_read_timeout
  • net_write_timeout
  • max_execution_time
  • max_connect_errors
  • max_user_connections

有关这些参数的详细信息,请参阅 MySQL 网站上的 7.1.8 服务器系统变量。

RDS for PostgreSQL 增加 max_connections 的最佳实践

针对您的用例,优化以下 PostgreSQL 连接相关参数的超时设置:

  • idle_in_transaction_session_timeout
  • tcp_keepalives_idle
  • tcp_keepalives_interval
  • tcp_keepalives_count

有关这些参数的详细信息,请参阅 PostgreSQL 网站上的 idle_in_transaction_session_timeout(整数)和 19.3.2 TCP 设置。