本文将为您介绍Hologres实例的连接架构,以及如何对实例中的连接进行诊断和管理。
连接和Query管理概述
Hologres兼容PostgreSQL,可以通过查询pg_stat_activity视图信息来查看实例连接信息,以达到分析实例连接状态和诊断运行SQL的目的。具体涉及的操作内容如下所示:
-
连接架构概述:了解Hologres从接入层(Gateway)到执行层(FE、FixedFE、Walsender)的分层连接架构,理解各层独立的连接数上限。
-
各层连接数上限:查询Gateway、FE、FixedFE、Walsender各层的连接数上限及对应报错。
-
连接数相关报错速查表:根据报错信息快速定位达到上限的层级及处理建议。
-
查询实例的默认最大连接数:不同的实例规格对应不同的默认连接数,通过命令查询当前实例规格的最大连接数。
-
HoloWeb可视化管理连接:通过HoloWeb可视化查看活跃连接,并进行管理如Kill等操作。
-
通过SQL查询连接信息:通过查询实例、DB的连接数、每个连接状态以及终止空闲连接,更好的管理实例。
-
查询FixedFE连接:FixedFE连接不在pg_stat_activity中展示,需通过专用视图查看。
-
释放连接:通过SQL函数,释放指定连接资源。
-
管理员预留连接:用于在连接数达到最大时对连接进行管理操作。
-
单个用户连接数限制:为单个用户设置连接数上限,以防止某个用户占用过多连接造成资源浪费。
-
自动释放空闲连接:开启自动释放空闲连接功能自动释放长期不使用连接。
-
连接数使用最佳实践:使用Hologres连接数的最佳实践建议。
连接架构概述
Hologres实例的连接链路是分层的,客户端连接依次经过接入层与执行层,各层都有各自独立的连接数上限。
各组件角色如下:
-
Gateway(网关):实例的统一接入层,所有客户端连接首先到达Gateway。Gateway负责连接认证、IP白名单校验,并根据连接属性将连接转发到下游的FE或FixedFE节点。Gateway节点数量最少为2个以保障高可用。计算组实例中,Gateway还负责把连接转发到对应计算组的FE。
-
FE(Frontend):兼容PostgreSQL协议的前端节点,处理标准SQL连接(DDL、查询、写入等)。Fixed Plan的点查、点写请求也可以在FE连接上执行,此时消耗FE的
max_connections配额;是否改走FixedFE由客户端类型与实例版本决定。show max_connections返回的即是单个FE节点的连接数上限。 -
FixedFE(Fixed Frontend):每个FE节点上伴生的高吞吐连接服务,主要服务Fixed Plan的点查点写场景(如holo-client,以及Flink、DataWorks实时写入链路)。自Hologres V2.1版本起,Binlog消费也默认使用FixedFE轻量级连接。FixedFE连接非常轻量,不占用FE的
max_connections配额,拥有独立且远大于FE的连接数上限。 -
Walsender:FE内处理逻辑复制(
replication=database)连接的进程。自Hologres V2.1版本起,Binlog消费和实时写入已默认走FixedFE轻量级连接,Walsender主要用于仍使用传统复制协议的兼容场景。Walsender连接数独立于max_connections,单独由max_wal_senders控制。
不同类型的连接消耗的是不同层的连接配额。例如Fixed Plan写入连接打满FixedFE的配额时,并不影响普通SQL连接;反之,普通连接把max_connections占满时,Fixed Plan链路依然可用。诊断连接数满的问题时,需要先根据报错信息判断是哪一层达到上限,详情请参见连接数相关报错速查表。
各层连接数上限
Gateway连接数上限
-
自Hologres V4.0.15版本起,为避免客户端超高频连接对实例稳定性造成影响,计算组型实例单个Gateway的连接数上限已由无限制调整为8000。详情请参见V4.0默认行为变更。
-
实例Gateway层的总连接上限为Gateway节点数乘以8000。Gateway节点数量最少为2,可在管控台调整。
-
可通过管控台监控指标Gateway连接数使用率观察接入层连接资源的峰值压力。
达到上限时的报错如下。
too many client tcp connections (global client_max)
FE连接数上限(max_connections)
单个FE节点的普通SQL连接数上限由max_connections控制,不同实例规格默认值不同,可通过如下命令查询。
-- 单个FE节点的最大连接数
show max_connections;
-- 整个实例的最大连接数(等于FE节点数乘以max_connections),Hologres V1.3.23及以上版本支持
select instance_max_connections();
Hologres会为Superuser预留一部分连接(superuser_reserved_connections),用于在连接数达到上限时仍能登录进行管理操作(如终止idle连接)。普通用户可用的连接数为max_connections减去预留连接数。
达到上限时的报错如下。
FATAL: sorry, too many clients already connection limit exceeded for superusers
FATAL: remaining connection slots are reserved for non-replication superuser connections
FixedFE连接数上限
-
每个FE节点上的FixedFE服务拥有独立的连接数上限,为6400个每节点。
-
实例FixedFE层的总连接上限为FE节点数乘以6400。
-
FixedFE连接不占用
max_connections配额,也不出现在pg_stat_activity中,需要通过专用视图hg_fixed_fe_stat_activity查看,详情请参见查询FixedFE连接。 -
走FixedFE的典型连接包括:holo-client、Flink连接器、DataWorks数据集成的Fixed Plan写入与点查连接,以及Binlog消费连接(自Hologres V2.1版本起默认走轻量级连接)。
-
FixedFE连接目前仅支持查看,不支持通过SQL终止(Kill)释放。如遇FixedFE连接数打满,需在客户端侧排查连接池配置或重启对应任务。
达到上限时的报错如下。
FATAL: too many fixed frontend connections
Walsender连接数上限(max_wal_senders)
-
逻辑复制连接(
replication=database)在FE上由Walsender进程服务,单个FE节点的Walsender连接数上限由max_wal_senders控制,默认为600。 -
Walsender连接数独立于
max_connections,两者互不占用。
自Hologres V2.1版本起,实时写入(如Flink连接器)和Binlog消费已默认使用轻量级连接(FixedFE),不再走Walsender通道。对维表和结果表,Flink连接器会在Hologres版本大于V3.0.28时自动选择轻量级连接模式(connection.fixed.enabled),详情请参见参数配置(VVR 11及以上版本)。因此Walsender连接数上限主要影响仍使用传统复制协议的少量场景。更多关于Binlog消费连接方式的说明,请参见通过JDBC消费Hologres Binlog。
达到上限时的报错如下。
FATAL: number of requested standby connections exceeds max_wal_senders (currently 600)
上限速览表
|
层级 |
上限参数 |
默认或固定值 |
生效粒度 |
查看方式 |
|
Gateway |
|
8000(Hologres V4.0.15版本起,计算组型实例) |
每个Gateway节点 |
管控台监控指标Gateway连接数使用率 |
|
FE |
|
按实例规格 |
每个FE节点 |
|
|
FE(实例级) |
无 |
FE节点数乘以 |
实例 |
|
|
FixedFE |
固定值 |
6400 |
每个FE节点 |
通过 |
|
Walsender |
|
600 |
每个FE节点 |
无 |
以上各层连接数的使用情况,均可在Hologres管控台实例的监控信息>流量与连接分组中查看。
连接数相关报错速查表
|
报错信息 |
达到上限的层级 |
处理建议 |
|
|
Gateway节点8000上限 |
排查客户端连接泄漏;必要时增加Gateway节点数。 |
|
|
FE的 |
释放idle连接,详情请参见释放连接;或升配、增加FE节点。 |
|
|
FE普通用户配额(预留Superuser连接后已满) |
使用Superuser运维账号登录并释放连接。 |
|
|
FixedFE 6400上限 |
检查Fixed Plan客户端(如holo-client、Flink连接器)连接池配置是否过大或存在泄漏。 |
|
|
Walsender的 |
检查Binlog消费任务数量,以及failover后是否残留旧连接。 |
|
|
非上限问题,idle超时被回收 |
重连,或调大 |
查询pg_stat_activity视图信息
pg_stat_activity是一个非常有用的视图,可以分析排查当前运行的SQL任务以及一些异常问题。您可以执行如下命令查看实例连接和Query的运行信息。
select * from pg_stat_activity ;
pg_stat_activity视图的参数说明如下所示。
|
字段 |
描述 |
|
datid |
Hologres后端连接到的数据库的OID。 |
|
datname |
Hologres后端连接到的数据库的名称。 |
|
pid |
Hologres后端的进程ID。 |
|
usesysid |
登录到Hologres后端的用户OID。 |
|
usename |
当前连接的用户名。 |
|
application_name |
客户端的应用类型。 其中常见的应用类型如下:
|
|
client_addr |
客户端的IP地址。 显示的IP地址可能是被解析过的,不保证一定是源端IP。 |
|
client_hostname |
客户端的主机名。 |
|
client_port |
客户端的端口。 |
|
backend_start |
后台进程开始的时间。 |
|
xact_start |
该进程的当前事务被启动的时间。
|
|
query_start |
当前活动查询开始的时间,如果当前连接状态不是active,取值为上一个查询开始的时间。 |
|
state_change |
连接的状态(state)上一次被改变的时间。 |
|
wait_event_type |
后端正在等待的事件类型,如果不存在则为NULL。可能的取值有:
|
|
wait_event |
如果后端当前正在等待,则是等待事件的名称,否则为 NULL。 |
|
state |
表示连接的状态。常见的状态如下:
|
|
backend_xid |
Hologres后端的顶层事务标识符。 |
|
backend_xmin |
当前后端的xmin范围。 |
|
query |
后端最近执行的查询。如果state为 |
|
backend_type |
当前后端的类型。可能的类型为autovacuum launcher、autovacuum worker、logical replication launcher、logical replication worker、parallel worker、background writer、client backend、checkpointer、startup、walreceiver、walsender以及 walwriter。除此之外还包括后端的执行组件,例如PQE等。 说明
需要关注 |
使用说明
仅超级管理员(Superuser)可以看到所有连接信息,普通用户只能看到自己的连接信息。
查询实例的默认最大连接数
不同的实例规格对应不同的默认连接数,您可以通过以下命令查询当前实例规格的最大连接数。命令执行完成后显示结果为单个FrontEnd节点的连接数,总连接数需要乘实例的FrontEnd节点数,不同实例的Frontend节点数请参见实例管理。
-
查询当前实例的最大连接数,Hologres V1.3.23及以上版本支持。
select instance_max_connections(); -
查询单个FrontEnd(FE)节点的最大连接数。实例总连接数即为FE数量乘以单个节点的最大连接数。
show max_connections;
HoloWeb可视化管理连接
您可以通过HoloWeb可视化查看活跃连接并进行管理。
-
登录HoloWeb控制台,详情请参见连接HoloWeb并执行查询。
-
单击顶部导航栏的诊断与优化。
-
在左侧导航栏单击活跃连接管理。
-
进入活跃连接管理页面,配置好参数,可查看实例的连接以及相关信息。
说明仅Superuser账号可以看到全部连接信息,普通用户只能看到自己的连接信息。
参数说明如下。
参数
说明
实例名
Hologres实例名称。
数据库
Hologres数据库名称,可选择指定数据库,不选择则默认展示全部数据库。
Database
连接的数据库名称。
说明若数据库名称为Postgres,则说明是后台运维连接,可忽略。
User Name
连接的用户账号。
Client Address
客户端IP地址,但不一定是真实的IP,可能是经过路由转发的出口IP。
Application Name
连接的应用名称。
State
连接的状态,常见的状态如下。
-
active:活跃。
-
idle:空闲。
-
idle in transaction:长事务中的空闲状态。
-
idle in transaction(Aborted):已失败事务中的空闲状态。
Query Start
Query开始时间。
Query
执行的Query。
说明若是Query太长,可能会被截断。
PID
Query的pid。
操作
-
Kill:不符合预期的连接可直接Kill或者批量删除。
-
详情:单击可以看到详细的连接信息。
-
通过SQL查询连接信息
若您更倾向于使用SQL的方式查询连接信息,可以通过以下方式操作。
-
查询当前数据库的连接数。
您可以通过如下命令查看当前数据库的连接数,更多关于参数的说明,请参见参数说明。
-
Hologres V1.1及以上版本。
SELECT datname::TEXT ,COUNT(1) AS COUNT FROM pg_stat_activity WHERE backend_type = 'client backend' AND application_name != 'hologres' GROUP BY datname::TEXT; -
Hologres V0.10及以下版本。
SELECT datname ,COUNT(1) AS COUNT FROM pg_stat_activity WHERE backend_type = 'client backend' AND application_name != 'hologres' GROUP BY datname;
-
-
查看每个连接的状态。
您可以在Hologres管控台通过HoloWeb查看每个实例的连接状态,也可以执行如下语句,通过查询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):表示进程处于一个事务中,该事务存在语句错误,并且进程当前没有执行查询操作。
-
fastpath function call:表示进程正在执行一个
fast-path函数。 -
disabled:表示进程的
track activities被禁用。
例如,您可以执行如下命令查询当前实例的空闲连接。
select * from pg_stat_activity where backend_type = 'client backend' and state = 'idle';Holoweb等Hologres周边组件会通过JDBC的方式占用一定的连接数,如果您的连接数满足需求,无需关心此类连接数的占用。当SQL连接数长期接近或达到
max_connections时,意味着您需要检查您的应用是否存在连接数泄漏情况,需要在应用端合理设置连接池大小,或者您也可以根据下面章节释放空闲连接,详情请参见释放连接。 -
-
查看每个接入节点的连接数
查询实例当前每个FrontEnd节点的连接数,Hologres V1.3.23版本起支持。当前没有连接使用的FE节点不会显示在查询结果中。
select * from hologres.hg_connections;查询结果字段含义如下:
-
fe_id:FE节点的编码。
-
used_connections:FE节点当前已使用的连接数。
-
max_connections:FE节点的最大连接数,同
show max_connections命令的返回值。
-
查询FixedFE连接
FixedFE连接(Fixed Plan写入与点查连接)不在pg_stat_activity中展示,需要查询专用视图hg_fixed_fe_stat_activity。
-- 查看当前FE节点上的所有FixedFE连接
select * from hg_fixed_fe_stat_activity;
-- 统计FixedFE连接数(对比6400上限评估水位)
select count(*) from hg_fixed_fe_stat_activity;
-- 按数据库、用户、应用统计FixedFE连接
SELECT datname
,usename
,application_name
,COUNT(1)
FROM hg_fixed_fe_stat_activity
GROUP BY datname
,usename
,application_name;
主要字段包括datname、conn_id(FixedFE连接ID)、usename、application_name、client_addr、client_port、backend_start、state、query_start、query等,其中backend_type为fixed frontend connection。
仅Superuser可以看到所有FixedFE连接信息,普通用户只能看到自己的连接信息。FixedFE连接目前仅支持查看,不支持通过pg_terminate_backend等函数终止。如需释放FixedFE连接,请在客户端侧关闭对应连接或重启相关任务(如Flink作业)。
释放连接
如果您遇到如下情况,则说明系统连接数(或者某个接入节点)已经达到上限:
-
连接数达到甚至超出
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报错。 -
产生
FATAL: too many fixed frontend connections报错,表示FixedFE层达到上限。 -
产生
too many client tcp connections报错,表示Gateway层达到上限。
当您有上述情况产生,可以先根据连接数相关报错速查表定位是哪一层达到上限。对于FE层连接数满的情况,可以通过Superuser账号连接实例(利用管理员预留连接),执行如下语句查看空闲连接是否过多。
select * from pg_stat_activity where backend_type = 'client backend' and state = 'idle';
如果查询结果显示空闲进程过多,并且确定是无用的空闲连接时,可以找到上述语句结果中的pid字段,并执行如下语句释放空闲连接。更多关于参数的说明,请参见参数说明。
select pg_cancel_backend(<pid>); -- cancel该连接上的query
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 query not like '%pg_cancel_backend%';
管理员预留连接
Hologres会为Superuser预留连接,不同的实例规格预留的连接数不同,详情请参见实例管理。Superuser预留连接用于在连接数达到最大时对连接进行管理操作(如终止idle连接),普通用户的连接数最大为max_connections减去预留连接。在实践中,不建议普通用户使用Superuser账号操作数据库,否则会导致连接全部占满,且无法通过管理渠道释放连接。
单个用户连接数限制
限制单个用户的连接数上限
由于Hologres兼容PostgreSQL,因此支持为单个用户设置连接数上限,以防止某个用户占用过多连接造成资源浪费。
通过执行如下语句限制单个用户在单个接入节点上的最大连接数,如果实例有多个节点,则总的连接数上限为单个节点连接数 * 节点数。
-
语法示例
ALTER ROLE "云账号ID" CONNECTION LIMIT <number>; -
参数说明
参数
说明
云账号ID
需要限制的账号ID,如果为RAM用户,需要在账号UID前加p4_。
更多关于账号的说明,请参见账号概述。
number
限制的连接数个数。
取值范围为[-1 , N],-1表示取消用户的连接数限制。
-
使用示例
如下示例限制RAM用户283813xxxx一个节点最多只有一个连接。
ALTER ROLE "p4_283813xxxx" CONNECTION LIMIT 1;
查看每个用户限制的单节点连接数
通过执行如下语句查看当前已经为实例用户设置的单节点限制连接数。
SELECT rolname, rolconnlimit
FROM pg_roles
WHERE rolconnlimit <> -1;
查询示例结果如下:
rolname | rolconnlimit
---------------+--------------
p4_283813xxxx | 1
(1 row)
自动释放空闲连接
当实例存在连接数长期接近或达到上限值时,可能存在连接泄漏情况,可以开启自动释放空闲连接功能来释放长期不使用连接。当连接空闲时间(无SQL执行)超过设置时间时,连接会自动被断开。
-
使用限制
仅Hologres V0.10.25及以上版本支持自动释放空闲连接功能,如果您的实例是V0.10.25以下版本,请您使用常见升级准备失败报错或加入实时数仓Hologres交流群申请升级实例。加入在线支持钉钉群请参见如何获取更多的在线支持?
-
语法示例
-
session级别。
-- 连接在10分钟没有执行sql的情况,会自动断开,单位为毫秒。 SET idle_session_timeout = 600000; -
数据库级别。
-- 连接在10分钟没有执行sql的情况,会自动断开,单位为毫秒。 ALTER DATABASE <db_name> SET idle_session_timeout = 600000;db_name为要开启自动释放空闲连接功能的数据库名称。
-
连接数使用最佳实践
在使用Hologres连接数时的最佳实践建议如下所示。
-
善用Superuser账号
-
不建议使用Suerpser账号直接操作实例或者连接应用,否则当连接数超过实例默认连接数之后,账号将无法连接实例。
-
建议专门设置一个Superuser账号为运维账号,当出现连接数超过实例默认连接数、Query卡死等紧急情况时,使用该Superuser账号登录HoloWeb管理连接和Query。
-
-
设置合理的连接池
-
为了业务安全考虑,Hologres不会在后台自动释放连接(除非开启
idle_session_timeout),建议业务上给应用设置合理的连接池机制,让空闲连接及时释放。 -
定期清理空闲连接,防止空闲连接占用过多连接影响线上业务。
-
Fixed Plan客户端(如holo-client、Flink连接器)同样需要关注连接池大小。它们消耗的是FixedFE的6400每节点配额,连接泄漏同样会导致该链路不可用。
-
Binlog消费任务(自Hologres V2.1版本起默认走FixedFE轻量级连接)failover时,注意确认旧连接已释放,避免FixedFE配额被残留连接耗尽。若仍使用传统Walsender复制协议,则需关注
max_wal_senders配额。
-
-
分层监控连接资源
-
接入层(Gateway):观察管控台Gateway连接数使用率监控指标。
-
FE层:通过
hologres.hg_connections查看各FE节点连接水位,结合pg_stat_activity分析具体连接。 -
FixedFE层:通过
hg_fixed_fe_stat_activity视图统计Fixed Plan连接数。 -
Walsender:在
pg_stat_activity中筛选backend_type = 'walsender'查看Binlog消费连接。
-
常见报错
-
错误提示:执行sql时报错:
terminating connection due to idle state timeout。 -
可能原因:为实例设置了自动释放连接的超时,超过设置的超时时间后,连接就会自动断连,然后出现报错。
-
解决方案:重新连接,或者修改空闲连接超时时间为更大的数值,修改空闲连接超时时间操作请参见自动释放空闲连接。
更多连接数相关报错及对应处理建议,请参见连接数相关报错速查表。