查询yugabytedb中所有服务器的pg_stat_activity
#sql #database #yugabytedb #distributed

当您查询yugabytedb中的pg_stat_activitypg_stat_statements(例如pg_stat_activitypg_stat_statements)时,您只会从您所连接的当前节点中看到视图。如果您想对集群的全局视图,则需要查询所有这些群集。

这是如何使用PostgreSQL外国数据包装器创建全局视图的方法。

请注意,我将所有对象都带有gv$,意思是“全局视图”(Oracle RAC用户很熟悉)。以下脚本通过丢弃对象来重新创建对象,因此,如果您已经使用gv$名称空间,请小心。我使用Generate SQL Script in PostgreSQL

中描述的format()\gexec

对于yb_servers()中可见的每个平板电脑服务器,我创建了FDW服务器和用户映射,以便当前用户能够连接到它:

create extension if not exists postgres_fdw;

select format('
 create server if not exists "gv$%1$s"
 foreign data wrapper postgres_fdw
 options (host %2$L, port %3$L, dbname %4$L)
 ', host, host, port, 'yugabyte') from yb_servers();
\gexec

select format('
 drop user mapping if exists for admin
 server "gv$%1$s"
 ',host) from yb_servers();
\gexec

select format('
 create user mapping if not exists for current_user
 server "gv$%1$s"
 --options ( user %2$L, password %3$L ) 
 ',host, 'admin', 'bsky-social-axqcu-h6eed')
 from yb_servers();
\gexec

在这里,由于我连接为超级用户,因此我不需要提供密码,这就是为什么options在评论中。如果您在Yugabytedb管理中使用此此功能,则需要提供admin密码。

i从每个服务器导入pg_stat_activitypg_stat_statements到自己的架构中:

select format('
 drop schema if exists "gv$%1$s" cascade
 ',host) from yb_servers();
\gexec

select format('
 create schema if not exists "gv$%1$s"
 ',host) from yb_servers();
\gexec

select format('
 import foreign schema "pg_catalog"
 limit to ("pg_stat_activity","pg_stat_statements","pg_stat_database")
 from server "gv$%1$s" into "gv$%1$s"
 ', host) from yb_servers();
\gexec

您可以列出创建的视图:\d gv$*.*

对于每个人,我创建了一个全局视图来串联它们:

with views as (
select distinct foreign_table_name
from information_schema.foreign_tables t, yb_servers() s
where foreign_table_schema = format('gv$%1$s',s.host)
)
select format('drop view if exists "gv$%1$s"', foreign_table_name) from views
union all
select format('create or replace view "gv$%2$s" as %1$s',
 string_agg(
 format('
 select %2$L as gv$host, %3$L as gv$zone, %4$L as gv$region, %5$L as gv$cloud,
 * from "gv$%2$s".%1$I
 ', foreign_table_name, host, zone, region, cloud)
 ,' union all '), foreign_table_name
) from views, yb_servers() group by views.foreign_table_name ;
\gexec

仅此而已。现在,我可以查询gv$pg_stat_activitygv$pg_stat_statements,该列有一个额外的列gv$hostgv$zonegv$regiongv$cloud来识别服务器,区域,区域和云提供商。

例如:

select now()-query_start "start",state, substr(query, 1, 30),
 gv$host, gv$zone, datname, application_name, usename, client_hostname
from gv$pg_stat_activity where state is not null
order by now()-query_start
;

Image description

我还添加了pg_stat_databases,其中并非所有列都与yugabytedb相关,但是每个云区域和区域的提交和回滚总和可能很有趣:

 select sum(xact_commit) commits,sum(xact_rollback) rollbacks,
  gv$cloud, gv$region, gv$zone, gv$host
from gv$pg_stat_database
group by
 gv$cloud, gv$region, gv$zone, gv$host
order by 1;

Image description

yugabytedb是弹性和弹性的。添加或删除节点时,您应该再次运行上面的脚本。请注意,这是一个临时解决方案,将来可能会实现此类观点。从REST API和用户界面(托管服务的托管托管门户)也可以看到全局统计信息,开源的yugabyted UI)。