打造次世代分析型数据库(五):复杂查询分析工具

c83a2b6877211ed7eb4ae36d66a9fa8e.gif

作者介绍

shuobjli(李硕),腾讯云数据库专家工程师,主要研究方向为数据库优化器、执行器、索引管理等,目前主要负责CDW PG优化器方面的研发工作。

背景介绍

本文主要介绍CDW PG全局视图工具的最佳实践。CDW PG作为分布式数据库,执行query需要多个CN和DN交互运行,对于复杂查询,甚至会出现多层调用的情况。CN和DN出现生产者以及消费者之间的依赖关系,问题相对比较复杂,例如死锁、程序挂起、节点报错等情况。在没有有力定位工具的情况,很难在运维过程中在短时间内定位相关问题。本工具适用于以下场景:

  1. 定位问题 Query 所在的 CN 节点

  2. 通过错误 ID 定位对应的 DN 节点

  3. 出现进程挂起的状况,定位相关的问题节点

总体介绍

CDW PG在运行过程中有多个节点参与,全局视图通过内部消息将所有节点的运行信息统一展示,并可以通过不同的过滤条件来定位相关的问题。每行显示一个服务器进程,同时详细描述与之关联的用户会话和查询,可以有效帮助用户分析排查当前运行的SQL任务以及异常问题。

全局视图表介绍

全局视图 pg_stat_cluster_activity 由以下各列构成:

1c4e4de3ebc4a086d02f94b22cae461a.png

注意事项

在使用全局视图的时候,以下问题需要注意:

  • 全局对内存表列以及系统视图进行了修改,因此需要修改每个节点的- postgresql.conf,然后重启集群,extension才可生效。

  • 只有superuser用户或者是正在报告的进程的拥有者,才可以使用pg_stat_activity视图。

使用场景

本节针对一些特定场景介绍全局视图的使用方法,用户可不局限于以下的介绍。

查看连接信息

通过下述SQL确认当前的连接用户和对应的连接机器。

SELECT datname,usename,client_addr,client_port
FROM pg_stat_cluster_activity
where client_addr is not null;

4f347ed986c9e9ab4728f1487534391e.png

查看SQL运行信息

获取当前用户执行SQL信息。

SELECT queryid, nodename, datname,pid,query
FROM pg_stat_cluster_activity
where query <> ''
order by queryid, nodename;

可以得到如下结果:

其中同一个 Query 在不同的 CN 以及 DN 上有相同的 queryid,其中列 query 可以表示 CN 或 DN 上正在执行的查询或者查询片段。

f0c63b2322c610079ddfb442d1007af1.png

查看耗时较长的查询

查看当前运行中的耗时较长的SQL语句。

select current_timestamp - query_start as runtime,
queryid, nodename, datname, state, query
from pg_stat_cluster_activity
where state != 'idle' and query <> ''
order by runtime desc;

其中 runtime 表示查询执行的时间,可以根据目前查询执行的时间进行排序,找出目前执行时间最长的查询。

4d530efa69f985886fa9598337f5a0e4.png

Query执行过程中挂起

Query在执行过程中挂起,定位出现问题的节点信息。利用前面的办法定位到挂起的Query的PID,然后利用下面的Query,把有问题Query的PID填到?处。

select queryid, nodename, datid AS datid, datname AS datname, pid,
wait_event_type, wait_event, wait_event_info, local_fid, state, query
from pg_stat_cluster_activity
where queryid = (select queryid
from pg_stat_cluster_activity
where pid= ? )

bc183f856051a01e59f14a9a1816baea.png

第一行表示 cn001 的数据,wait_event_type 为 FN 说明 cn001 在等待 FN 类型 event,wait_event 为 FnRecieveData 表 cn001 在等待数据,wait_event_info为40,说明在等待 FID40 的数据;

第三行表示dn001的数据,dn001的local_fid是40,且wait_event_type以及wait_event为空,说明dn001没有任何事件等待,所以dn001可能为有问题的节点。

第四行表示dn002的数据,dn002等待事件为ClientRead说明已经完成Fragment的执行正在等待新的命令,所以为正常节点。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值