暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

PostgreSQL 连接数限制的一些思考

前言

今天出现了一个库连接数连爆了的情况,是时候探讨PostgreSQL连接数的最佳限制方案了,连接池不在本文探讨的范围。

多层级限制

在PostgreSQL多租户的环境中,对连接数的限制方式主要有三个层级。

第一层级:

整个服务器连接数的限制,这主要由max_connections
来限制。

postgresql.conf  max_connections = 1000

同时还要注意一点,superuser_reserved_connections
,它是为超级用户保留的连接数量。在 Oracle数据库中,如果连接数突然增加,此时想进入数据库查询一些信息,直接就会报连接不上,此时必须 kill一些会话来进行连接。而 PostgreSQL吸取了这种经验,直接设置superuser_reserved_connections
参数,就能有效地避免这种问题,默认值是3。

所以真实的max_connections= 设置好的max_connections- superuser_reserved_connections

第二层级

对于数据库层,我们可以为每个数据库指定最大连接数量限制。有以下限制:

alter database test connection limit 300;

复制

可以通过pg_database视图的datconnlimit
字段查看大小限制,设置为-1表示无限制。

postgres=# select datname,datconnlimit from pg_database;
  datname  | datconnlimit 
-----------+--------------
 postgres  |           -1
 template1 |           -1
 template0 |           -1
 kms       |           -1

复制
第三层级

对连接的用户施加限制,可以限制指定用户的最大连接数。显示方法如下:

ALTER USER kms WITH CONNECTION LIMIT 20;

复制

可以通过pg_roles视图的rolconnlimit
字段查看大小限制,设置为-1则表示无限制。

postgres=# select rolname,rolconnlimit from pg_roles;
          rolname          | rolconnlimit 
---------------------------+--------------
 pg_monitor                |           -1
 pg_read_all_settings      |           -1
 pg_read_all_stats         |           -1
 pg_stat_scan_tables       |           -1
 pg_read_server_files      |           -1
 pg_write_server_files     |           -1
 pg_execute_server_program |           -1
 pg_signal_backend         |           -1
 root                      |           -1
 repl                      |           -1
 gateway                   |           -1
 ctgadmin                  |           -1
 ctgmonitor                |           -1
 ctgbackup                 |           -1
 search_manager_new        |           -1
 kms_user_new              |           -1
 kms                       |           20

复制

思考问题

问题一:如果在postgresql.conf中将max_connections设置为200,则无论数据库和角色设置如何,它将成为所有数据库的最大连接数吗?

是的,max_connections减去superuser_reserved_connections是与整个PG中所有数据库中所有非超级用户连接总数的最大值。

问题二:限制最大连接数的最佳位置在哪里,是在参数级别,还是在数据库级别还是在角色级别?

如果要限制每个数据库的用户数,则设置数据库级别是最佳位置。如果因为数据库有多个用户,某个用户会经常连接溢出,则考虑单独进行限制。


文章转载自励志成为PostgreSQL大神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论