本文将为您介绍如何对实例中的连接进行诊断和管理。

连接和Query管理概述

Hologres兼容PostgreSQL,可以通过查询pg_stat_activity视图信息来查看实例连接信息,以达到分析实例连接状态和诊断运行SQL的目的。具体涉及的操作内容如下所示:

查询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 当前连接的用户名。

holo_admin是Hologres内置的服务账号,运行结果显示为PSQL,该连接是必要的。如果您的连接数未超出当前实例的最大限度,不需要针对此连接进行优化。连接数查询方式,请参见通过SQL查询连接信息

application_name 客户端的应用类型。
client_addr 客户端的IP地址。

显示的IP地址可能是被解析过的,不保证一定是源端IP。

client_hostname 客户端的主机名。
client_port 客户端的端口。
backend_start 后台进程开始的时间。
xact_start 该进程的当前事务被启动的时间。
  • 如果没有活动事务,则为空。
  • 如果当前查询是该进程的第一个事务,这一列等于query_start
query_start 当前活动查询开始的时间,如果当前连接状态不是active,取值为上一个查询开始的时间。
state_change 连接的状态(state)上一次被改变的时间。
wait_event_type 后端正在等待的事件类型,如果不存在则为NULL。可能的取值有:
  • LWLock:后端正在等待一个轻量级锁。
  • Lock:后端正在等待一个重量级锁。wait_event将标识等待的锁的类型。
  • BufferPin:服务器进程正在等待访问一个数据缓冲区,而此时没有其他进程正在检查该缓冲区。
  • Activity:服务器进程处于闲置状态。被用于在其主处理循环中等待活动的系统进程。
  • Extension:服务器进程正在一个扩展模块中等待活动。
  • Client:服务器进程正在等待来自用户应用的某种查询,并且该服务器预期某种与其内部处理无关的事情发生。
  • PC:服务器进程正在等待来自服务器中另一个进程的某种活动。
  • Timeout:服务器进程正在等待一次超时发生。
  • IO:服务器进程正在等待一次IO完成。
wait_event 如果后端当前正在等待,则是等待事件的名称,否则为 NULL。
state 表示连接的状态。常见的状态如下:
  • active:活跃。
  • idle:空闲。
  • idle in transaction:长事务中的空闲状态。
  • idle in transaction(Aborted):已失败事务中的空闲状态。
backend_xid Hologres后端的顶层事务标识符。
backend_xmin 当前后端的xmin范围。
query 后端最近执行的查询。如果stateactive,将会显示当前正在执行的查询。在所有其他状态下,显示上一个被执行的查询。
backend_type 当前后端的类型。可能的类型为autovacuum launcher、autovacuum worker、logical replication launcher、logical replication worker、parallel worker、background writer、client backend、checkpointer、startup、walreceiver、walsender以及 walwriter。除此之外还包括后端的执行组件,例如PQE等。

查询实例的默认最大连接数

不同的实例规格对应不同的默认连接数,您可以通过以下命令查询当前实例规格的最大连接数。命令执行完成后显示结果为单个FrontEnd节点的连接数,总连接数需要乘实例的FrontEnd节点数,不同实例的Frontend节点数请参见实例规格概述
--查看单接入节点的最大连接数。
show max_connections;

HoloWeb可视化管理连接

您可以通过HoloWeb可视化查看活跃连接并进行管理。
  1. 登录HoloWeb控制台,详情请参见HoloWeb快速入门
  2. 单击顶部导航栏的诊断与优化
  3. 在左侧导航栏单击活跃连接管理
  4. 进入活跃连接管理页面,查看当前实例的活跃连接及对连接进行管理,例如执行Kill操作。活跃连接管理

通过SQL查询连接信息

若您更倾向于使用SQL的方式查询连接信息,可以通过以下方式操作。

  1. 查询当前数据库的连接数。
    您可以通过如下命令查看当前数据库的连接数,更多关于参数的说明,请参见参数说明
    • Hologres V1.1及以上版本
      SELECT  datname::TEXT
              ,COUNT(1) AS COUNT
      FROM    pg_stat_activity
      WHERE   backend_type = 'client backend'
      AND     application_name != 'hologres'
      AND     usename != 'holo_admin'
      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'
      AND     usename != 'holo_admin'
      GROUP BY datname;
  2. 查看每个连接的状态。
    您可以在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):表示进程处于一个事务中,该事务存在语句错误,并且进程当前没有执行查询操作。
    例如,您可以执行如下命令查询当前实例的空闲连接。
    select * from pg_stat_activity where backend_type = 'client backend' and state = 'idle';

    Holoweb等Hologres周边组件会通过JDBC的方式占用一定的连接数,如果您的连接数满足需求,无需关心此类连接数的占用。当SQL连接数长期接近或达到max_connections时,意味着您需要检查您的应用是否存在连接数泄漏情况,需要在应用端合理设置连接池大小,或者您也可以根据下面章节释放空闲连接。

  3. 终止连接。
    如果您遇到如下情况,则说明系统连接数已经达到上限:
    • 连接数达到甚至超出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';

管理员预留连接

Hologres会为Superuser预留连接,不同的实例规格预留的连接数不同,详情请参见实例规格概述。Superuser预留连接用于在连接数达到最大时对连接进行管理操作(如终止idle连接),普通用户的连接数最大为max_connections减去预留连接。在实践中,不建议普通用户使用Superuser账号操作数据库,否则会导致连接全部占满,且无法通过管理渠道释放连接。

单个用户连接数限制

由于Hologres兼容PostgreSQL,因此支持为单个用户设置连接数上限,以防止某个用户占用过多连接造成资源浪费。

  1. 限制单个用户在单个接入节点上的最大连接数。
    • 语法示例
      ALTER ROLE "云账号ID" CONNECTION LIMIT <number>; 
    • 参数说明
      参数 说明
      云账号ID 需要限制的账号ID,如果为RAM用户,需要在账号UID前加p4_。更多关于账号的说明,请参见账号概述
      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)

自动释放空闲连接(Beta)

当实例存在连接数长期接近或达到上限值时,可能存在连接泄漏情况,可以开启自动释放空闲连接功能来释放长期不使用连接。当连接空闲时间(无SQL执行)超过设置时间时,连接会自动被断开。

  • 使用限制

    仅Hologres V0.10.25及以上版本支持自动释放空闲连接功能,如果您的实例是V0.10.25以下版本,请您提交工单或加入在线支持钉钉群申请升级实例,加入在线支持钉钉群请参见如何获取更多的在线支持?

  • 语法示例
    • 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不会在后台自动释放连接,建议业务上给应用设置合理的连接池机制,让空闲连接及时释放。
    • 定期清理空闲连接,防止空闲连接占用过多连接影响线上业务。
    • Hologres连接中,名称为holo_admin的连接为后台运维连接,会定期清理,可以忽略。