好消息,从Hologres V0.10.25版本开始,Hologres的默认连接数增加一倍啦!这就意味着,同等规格实例将会拥有更多的连接数,业务上也可以增加更多的应用去连接Hologres,无需再为连接数不够而担心啦!
下面我们来康康现在新版本的连接数和实例规格的映射关系吧:
实例规格 |
最大总连接数(个) ① |
Superuser预留总连接数 |
32Core |
256(128*2) |
6 |
64Core |
512(128*4) |
6 |
96Core |
768(128*6) |
6 |
128Core |
1024(128*8) |
9 |
160Core |
1280(128*10) |
12 |
192Core |
1536(128*12) |
15 |
256Core |
2048(128*16) |
18 |
400Core |
3200(128*25) |
30 |
512Core |
4096(128*32) |
36 |
Hologres运行时的资源包括用于元数据管理的进程资源、用于查询服务的计算资源、用于优化数据写入的导入链路资源以及缓存服务。所有服务基于容器技术,通过多个并行的容器计算节点实现高性能并行计算能力。
Hologres基于实例的资源规格提供默认的最大连接数是针对大多数场景,经过调校和优化的默认配置。最大连接数不可修改,系统扩容或者缩容时,最大连接数同时调整为对应规格的默认连接数。
但是默认连接数的增加,并不意味着业务上可以无限制随便使用,因此,本文除了带来以上好消息外,还为大家准备了关于连接数使用的最佳实践,以下内容全是实操干货,建议收藏本文并反复阅读,以帮助业务更好的使用Hologres。
实践1:查看实例连接数相关信息
1.查看实例默认连接数
当您创建实例并连接开发工具之后,可以执行如下SQL语句查看当前实例版本的最大连接数
show max_connections;
说明:
1)以上SQL语句的执行结果展示的是单个Frontend节点最大连接数,最大总连接数=单Frontend节点最大连接数*Frontend节点数,上面映射表中最大连接数的括号中为具体每个节点的规格。
2)旧实例版本的查询结果还是会跟之前一致,若有需求可以提工单或者找对应技术支持升级至最新版本,连接数将会默认增加一倍。
2.查看DB连接数
可以通过如下命令查看当前DB的连接数
SELECT datname ,COUNT(1) AS COUNT FROM pg_stat_activity WHERE backend_type = 'client backend' AND application_name != 'hologres' AND usename != 'holo_admin' GROUP BY datname;
3.查看连接数状态
通过查询pg_stat_activity视图来获取所有JDBC或PSQL连接的状态。
select * from pg_stat_activity where backend_type = 'client backend' and state = '<statename>';
其中statename是需要填写的状态参数名,包括以下几种:例如,您可以执行如下命令查询当前实例的空闲连接。
- idle:空闲连接,表示进程在等待新的客户端命令。
- active:活跃连接,表示进程正在执行查询操作。
- idle in transaction:表示进程处于一个事务中,但是当前没有执行查询操作。
- idle in transaction (aborted):表示进程处于一个事务中,该事务存在语句错误,并且进程当前没有执行查询操作。
示例查看空闲连接:
select * from pg_stat_activity where backend_type = 'client backend' and state = 'idle';
Holoweb等Hologres周边组件会通过JDBC的方式占用一定的连接数,如果您的连接数满足需求,无需关心此类连接数的占用。当SQL连接数长期接近或达到max_connections时,意味着您需要检查您的应用是否存在连接数泄漏情况,需要在应用端合理设置连接池大小,或者您也可以释放空闲连接。
注意:若是您的账号是superuser,则可以查看到当前实例下的所有连接,但是若您的账号不是superuser,则只能看到自己账号的相关连接。
实践2:管理员预留连接
Hologres会为Superuser预留连接,不同的实例规格预留的连接数不同,具体预留关系可以参考上表。
Superuser预留连接用于在连接数达到最大时对连接进行管理操作(如终止idle连接),普通用户的连接数最大为max_connections减去预留连接。
在实践中,不建议普通用户使用Superuser账号操作数据库,否则会导致连接全部占满,且无法通过管理渠道释放连接。(敲黑板,重点!重点!)
实践3:单个用户预留连接
Hologres支持为单个用户设置连接数上限,以防止某个用户占用过多连接造成资源浪费。
1.限制单个用户连接数。
ALTER ROLE "云账号ID" CONNECTION LIMIT <number>;
使用示例:
如下示例限制RAM用户283813xxxx,最多只有一个1连接。
ALTER ROLE "p4_283813xxxx" CONNECTION LIMIT 1;
2.查看用户的限制连接数
您可以执行如下语句查看当前已经为实例用户设置的限制连接数。
SELECT rolname, rolconnlimit FROM pg_roles WHERE rolconnlimit <> -1;
查询示例结果如下:
rolname | rolconnlimit ---------------+-------------- p4_283813xxxx | 1 (1 row)
实践4:终止连接
如果您遇到如下情况,则说明系统连接数已经达到上限:
- 连接数达到甚至超出max_connections的取值,您可以在Hologres管控台的监控告警页查看连接数。
- 产生FATAL: sorry, too many clients already connection limit exceeded for superusers报错。
- 产生FATAL: remaining connection slots are reserved for non-replication superuser connections报错。
当您有上述情况产生,可以通过Superuser账号连接实例,执行如下语句查看空闲连接是否过多。
select * from pg_stat_activity where backend_type = 'client backend' and state = 'idle';
如果查询结果显示空闲进程过多,并且确定是无用的空闲连接时,可以找到上述语句结果中的pid字段,并执行如下语句释放空闲连接。
-- cancel该连接上的query select pg_cancel_backend(<pid>); --结束对应的后台连接进程 select pg_terminate_backend(<pid>); --批量终止后台idle连接进程,释放连接 SELECT pg_terminate_backend(pid) ,query ,datname ,usename ,application_name ,client_addr ,client_port ,backend_start ,state FROM pg_stat_activity WHERE length(query) > 0 AND pid != pg_backend_pid() AND backend_type = 'client backend' AND state = 'idle' AND application_name != 'hologres' AND usename != 'holo_admin';
新功能预告
为了能让大家更好的管理连接以及可视化方式优雅的杀连接,后期将会在Holoweb开放连接数管理功能,届时您可以通过Holoweb直接查看当前实例所有的连接数信息,并且可以通过可以通过可视化的方式kill无效连接,方便快捷,简单易用!
更多有关连接数的新功能将会陆续发布,请及时关注群或者社区最新消息!
总结
默认连接数的增加,可以方便业务去连接更多的应用,但并不意味着连接数是无限制使用的,我们需要合理的规划和正确的使用,才能带来事半功倍的效果!下面再为大家总结使用连接数时的最佳姿势:
- 善用账号权限,尽量避免Superuser直接连接应用,以方便Superuser账号及时管理连接数
- 应用上合理的设置连接池释放机制,同时也建议为单个用户预留连接限制,防止资源浪费
- 定期清理空闲连接,防止连接泄漏或者空闲连接占用过多的资源
感谢您的阅读,也欢迎使用体验Hologres,可以参考使用手册,同时也欢迎扫码加入钉群进行技术交流: