当您查询yugabytedb中的pg_stat_activity
或pg_stat_statements
(例如pg_stat_activity
或pg_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_activity
和pg_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_activity
和gv$pg_stat_statements
,该列有一个额外的列gv$host
,gv$zone
,gv$region
,gv$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
;
我还添加了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;
yugabytedb是弹性和弹性的。添加或删除节点时,您应该再次运行上面的脚本。请注意,这是一个临时解决方案,将来可能会实现此类观点。从REST API和用户界面(托管服务的托管托管门户)也可以看到全局统计信息,开源的yugabyted
UI)。