KingbaseES 连接数限制
前言
我们经常碰到由于数据库连接数太多导致耗费太多服务器内存,除了连接池,我们可以在数据库上限制应用连接数。
真实连接数限制
整个数据库实例的连接数限制参数是max_connections
为超级用户保留的连接数量参数是superuser_reserved_connections,默认值是3。
它是为超级用户保留的连接数量。而在Oracle数据库没有对应此类参数功能,这个为超级用户保留连接的参数应用于大量连接占用服务器大量负载时,有可能超级用户连接不上数据库,如果设置此参数就可以从容的连接数据库,不会卡住。
真实的连接数限制=max_connections-superuser_reserved_connections
注意这是对非超级用户的连接数限制。
数据库指定最大连接数量限制
alter database test connection limit 4;
可以查看sys_database视图的datconnlimit字段,设置为-1表示无限制。超过上限4个连接,再次连接test数据库被拒绝。
TEST=# select datname,datconnlimit from sys_database;
datname | datconnlimit
-----------+--------------
security | -1
template1 | -1
template0 | -1
test1 | -1
wydb | -1
wydb2 | -1
test | 4
TEST=# show max_connections ;
max_connections
-----------------
10
(1 row)
TEST=# show superuser_reserved_connections ;
superuser_reserved_connections
--------------------------------
3
(1 row)
[kingbase7@localhost ~]$ ksql -Uu1 TEST
ksql: error: could not connect to server: FATAL: too many connections for database "test"
[kingbase7@localhost ~]$ ps -ef|grep u1 |grep idle
kingbas+ 16279 16253 0 16:26 ? 00:00:00 kingbase: u1 test [local] idle
kingbas+ 16281 16253 0 16:26 ? 00:00:00 kingbase: u1 test [local] idle
kingbas+ 16283 16253 0 16:26 ? 00:00:00 kingbase: u1 test [local] idle
kingbas+ 16285 16253 0 16:26 ? 00:00:00 kingbase: u1 test [local] idle
限制指定用户的最大连接数
ALTER USER tiutest WITH CONNECTION LIMIT 2;
TEST=# select rolname,rolconnlimit from sys_roles;
rolname | rolconnlimit
---------------------------+--------------
pg_monitor | -1
sso | -1
tiutest | 2
sao | -1·
system | 1
ud | -1
u1 | -1
TEST=# \c test tiutest
FATAL: remaining connection slots are reserved for non-replication superuser connections
Previous connection kept
TEST=#
[kingbase7@localhost ~]$ ps -ef|grep kingbase
kingbas+ 30766 29218 0 18:05 ? 00:00:00 kingbase: tiutest test [local] idle
kingbas+ 30783 29218 0 18:06 ? 00:00:00 kingbase: tiutest test [local] idle
kingbas+ 30785 30567 0 18:06 pts/3 00:00:00 grep --color=auto kingbase
[kingbase7@localhost ~]$ ksql -UTIUTEST TEST
ksql: error: could not connect to server: FATAL: too many connections for role "tiutest"
max_connections=5
superuser_reserved_connections=3
所以对非超级用户的连接数限制是2,如上测试,tiutest用户达到两个连接后就不允许再创建连接。
超级用户无法限制连接数
测试例子限制超级用户连接数为1,而实际可以创建3个连接,并不受连接数限制,这也很好理解,因为超级用户拥有特殊权限。
TEST=# show max_connections ;
max_connections
-----------------
5
(1 row)
TEST=# show superuser_reserved_connections ;
superuser_reserved_connections
--------------------------------
3
(1 row)
TEST=# ALTER USER system WITH CONNECTION LIMIT 1;
ALTER ROLE
TEST=# select rolname,rolconnlimit from sys_roles;
rolname | rolconnlimit
---------------------------+--------------
pg_monitor | -1
sso | -1
manager | -1
ceshi001 | -1
ab | -1
role01 | -1
tiutest | 2
tiusuper | 4
sao | -1
system | 1
ud | -1
u1 | -1
(21 rows)
[kingbase7@localhost ~]$ ps -ef|grep system
root 1 0 0 Oct16 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 499 1 0 Oct16 ? 00:00:00 /usr/lib/systemd/systemd-udevd
dbus 773 1 0 Oct16 ? 00:00:01 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root 17730 1 0 13:44 ? 00:00:00 /usr/lib/systemd/systemd-journald
root 17739 1 0 13:44 ? 00:00:00 /usr/lib/systemd/systemd-logind
kingbas+ 29269 29218 0 17:57 ? 00:00:00 kingbase: system test [local] idle
kingbas+ 30476 29218 0 17:59 ? 00:00:00 kingbase: system test [local] idle
kingbas+ 30564 29218 0 18:00 ? 00:00:00 kingbase: system test [local] idle
kingbas+ 30618 30567 0 18:00 pts/3 00:00:00 grep --color=auto system
数据库连接数限制策略
1.针对整个数据库实例设置max_connections做整体连接数限制,根据实际应用场景对用户级或数据库级做连接数限制。
2.如果限制每个数据库的用户数,则设置数据库级别是最佳方式。如果因为数据库有多个用户,某个用户会经常连接溢出,则考虑单独对其进行限制。
KINGBASE研究院