AWS RDS PostgreSQL 错误“剩余的连接槽被保留用于非复制超级用户连接”

Posted

技术标签:

【中文标题】AWS RDS PostgreSQL 错误“剩余的连接槽被保留用于非复制超级用户连接”【英文标题】:AWS RDS PostgreSQL error "remaining connection slots are reserved for non-replication superuser connections" 【发布时间】:2016-11-28 01:59:31 【问题描述】:

在仪表板中,我看到当前有 22 个与数据库实例的打开连接,阻止新连接并出现错误:

剩余的连接槽保留给非复制超级用户连接。

我从 EC2 实例上运行的 Web 服务 API 访问数据库,并始终保持以下最佳实践:

Connection connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
Class.forName(DB_CLASS);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(SQL_Query_String);
...
resultSet.close();
statement.close();
connection.close();

    我可以在代码中做点别的吗?

    我应该在数据库管理中做其他事情吗?

    有没有办法定期关闭连接?

【问题讨论】:

【参考方案1】:

您可以在参数组idle_in_transaction_session_timeout中更改以删除空闲连接。

idle_in_transaction_session_timeout(整数)

使用已空闲的打开事务终止任何会话 长于指定的持续时间(以毫秒为单位)。这允许任何 该会话持有的锁将被释放,连接槽将被释放 被重复使用;它还允许仅对该事务可见的元组 被吸尘。有关这方面的更多详细信息,请参阅第 24.1 节。

默认值 0 禁用此功能。

AWS RDS 中的当前值为 86400000,转换为小时 (86400000/1000/60/60) 时为 24 小时。

【讨论】:

【参考方案2】:

亚马逊必须根据每个模型要求一定数量的内存和连接的权利来设置连接数

MODEL      max_connections innodb_buffer_pool_size
---------  --------------- -----------------------
t1.micro   34                326107136 (  311M)
m1-small   125              1179648000 ( 1125M,  1.097G)
m1-large   623              5882511360 ( 5610M,  5.479G)
m1-xlarge  1263            11922309120 (11370M, 11.103G)
m2-xlarge  1441            13605273600 (12975M, 12.671G)
m2-2xlarge 2900            27367833600 (26100M, 25.488G)
m2-4xlarge 5816            54892953600 (52350M, 51.123G)

但如果您愿意,您可以通过

将最大连接大小更改为自定义值

从 RDS 控制台 > 参数组 > 编辑参数,

您可以将 max_connections 参数的值更改为自定义值。

要定期关闭连接,您可以设置一个类似这样的 cron 作业。

select pg_terminate_backend(procpid)
from pg_stat_activity
where usename = 'yourusername'
 and current_query = '<IDLE>'
 and query_start < current_timestamp - interval '5 minutes';

【讨论】:

谢谢,有没有办法定期关闭连接? 谢谢,顺便说一句 - 我如何在 AWS RDS 中添加 cron 作业?谢谢, 嗯,你必须从本地或某个服务器上运行它。 首先,您必须确保可以从该实例访问 RDS。设置 cron 作业非常简单,只需 google 为脚本文件运行 cron 作业,您会发现大量文档。 这里是连接数的官方来源:docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/…【参考方案3】:

我正在使用 Amazon RDS、SCALA、Postgresql 和 Slick。首先 - RDS 中可用连接的数量取决于可用 RAM 的数量 - 即 RDS 实例的大小。最好不要更改默认连接号

您可以通过在您的 RDS 数据库实例上执行以下 SQL 语句来检查最大连接数:

show max_connections; 

检查您的 SPRING 配置以查看 多少线程您正在生成:

database 
  dataSourceClass = org.postgresql.ds.PGSimpleDataSource
  properties = 
    url = "jdbc:postgresql://test.cb1111.us-east-2.rds.amazonaws.com:6666/dbtest"
    user = "youruser"
    password = "yourpass"
  
  numThreads = 90

所有连接都是在 SRING BOOT 初始化时建立的,因此请注意不要超过 RDS 限制。这包括连接到数据库的其他服务。在这种情况下,连接数将是 90+。

db.t2.small 的当前限制为 198(4GB 内存)

【讨论】:

其实答案很好【参考方案4】:

您可以在Parameters Group 中为您的 RDS 实例更改最大连接数。尝试增加它。 或者您可以尝试升级您的实例,因为 max connexions 设置为 DBInstanceClassMemory/31457280

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html

【讨论】:

谢谢,有没有办法定期关闭连接?

以上是关于AWS RDS PostgreSQL 错误“剩余的连接槽被保留用于非复制超级用户连接”的主要内容,如果未能解决你的问题,请参考以下文章

AWS RDS (PostgreSQL) 自动备份

markdown 配置。 AWS PostgreSQL RDS使用pgbadger

AWS RDS PostgreSQL:PostgreSQL 复制延迟的承诺价值是多少?

将 CSV 导入到 postgreSQL 中的表中,忽略重复项 - 亚马逊 AWS/RDS

如何配置从 Vanilla Postgresql 9.6 DB 到 AWS RDS Postgresql 的流复制

AWS ElasticBeanstalk EC2 到 RDS postgresql 连接