前言
今天出现了一个库连接数连爆了的情况,是时候探讨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中所有数据库中所有非超级用户连接总数的最大值。
问题二:限制最大连接数的最佳位置在哪里,是在参数级别,还是在数据库级别还是在角色级别?
如果要限制每个数据库的用户数,则设置数据库级别是最佳位置。如果因为数据库有多个用户,某个用户会经常连接溢出,则考虑单独进行限制。