跳转至

前言

集群监控

可以用系统中包含的各种工具以及附加组件来监控一个SeaboxMPP数据库系统。

观察SeaboxMPP数据库系统日常的性能有助于管理员理解系统的行为、计划工作流以及故障排查问题。 本章讨论用于监控数据库性能和活动的工具。 监控活动来快速检测系统中问题的有关内容。

集群状态监控

作为一个SeaboxMPP数据库管理员,必须监控系统的问题事件,例如一个组件宕机或者组件所在的一台主机磁盘空间耗尽。下面的主题描述如何监控一个SeaboxMPP数据库系统的健康状况以及检查一个SeaboxMPP数据库系统的特定状态信息。

一个SeaboxMPP数据库系统由横跨多台机器的多个SeaboxSQL实例(coordinator和executor)构成。要监控一个SeaboxMPP数据库系统,需要了解整个系统的信息以及个体实例的状态信息。seabox status工具提供有关一个SeaboxMPP数据库系统的状态信息。

查看集群整体状态

默认的seabox status行为是检查集群状态。

例如,要快速查看SeaboxMPP数据库集群的整体状态:

$ seabox status

集群整体状态说明如下:

  1. cluster status 有三种状态:perfect、unusable、usable,其中:

    • 当所有组件都运行正常时,cluster status为perfect

    • 当所有组件中关键组件掉线,无法对外提供服务时,cluster status为unusable

    • 当集群中有组件掉线,但是依赖于集群的高可用配置,集群依然可以对外提供服务,cluster status为usable

  2. module显示的组件类型:scdcs、gtm、monitor、coordinator、executor

  3. offline/total显示各个组件掉线实例数和总实例数

查看集群各组件的状态

要查看SeaboxMPP数据库所有组件状态,使用seabox status

$ seabox status -a
$ seabox status --all

查询gtm的状态

$ seabox status -a -m gtm
$ seabox status --all --module gtm

查询coordinator的状态

$ seabox status -a -m coordinator
$ seabox status --all --module coordinator

查询executor的状态

$ seabox status -a -m executor 
$ seabox status --all --module executor 

查询monitor的状态

$ seabox status -a -m monitor
$ seabox status --all --module monitor

查询单个节点的状态

$ seabox status -a -n node1
$ seabox status --all --host node1

检查磁盘空间使用

一个数据库管理员最重要的监控任务是确保coor和executor数据目录所在的文件系统的使用率不会超过70%的。完全占满的数据磁盘不会导致数据损坏,但是可能会妨碍数据库的正常操作。如果磁盘占用得太满,可能会导致数据库服务器关闭。

可以使用sc_toolkit管理模式中的sc_disk_free外部表该视图显示数据库的总大小(以KB为计量单位)。例如:

=> SELECT * FROM sc_toolkit.sc_disk_free ORDER BY dfspace;
检查分布式数据库和表的大小

sc_toolkit管理模式包含几个可以用来判断SeaboxMPP数据库的分布式数据库、 模式、表或索引磁盘空间使用的视图。

用于检查数据库对象尺寸和磁盘空间的视图列表,请见《SeaboxMPP数据库参考手册》。

查看数据库的磁盘空间使用情况

要查看一个数据库的总大小(以字节计),使用sc_toolkit管理模式中的sc_size_of_database视图。例如:

=> SELECT * FROM sc_toolkit.sc_size_of_database ORDER BY sodddatname;
查看表的磁盘空间使用情况

sc_toolkit管理模式包含几个检查表大小的视图。表大小视图根据对象ID(而不是名称)列出表。要根据一个表的名称检查其尺寸,必须在pg_class表中查找关系名称(relname)。例如:

=# select relname as name,sotdsize as size,sotdtoastsize as toast,sotdadditionalsize as other from sc_toolkit.sc_size_of_table_disk 		a,pg_class  where a.sotdoid=pg_class.oid order by relname;

可用的表大小视图的列表请见《SeaboxMPP数据库参考手册》。

查看索引的磁盘空间使用情况

sc_toolkit管理模式包含几个用于检查索引大小的视图。要查看一个表上所有索引的总大小,使用sc_size_of_all_table_indexes视图。要查看一个特定索引的大小,使用sc_size_of_index视图。 该索引大小视图根据对象ID(而不是名称)列出表和索引。要根据一个索引的名称查看其尺寸,必须在pg_class表中查找关系名称(relname)。例如:

=# select soisize,relname as indexname from pg_class,sc_toolkit.sc_size_of_index where pg_class.oid=sc_size_of_index.soioid and pg_class.relkind='i';

检查数据分布倾斜

SeaboxMPP数据库中所有的表都是分布式的,意味着它们的数据被按规则划分到系统中的所有Executor上。不均匀分布的数据可能会削弱查询处理性能。一个表的分布策略在表创建时被确定。有关选择表分布策略的信息,请见下列主题。

  • [查看一个表的分布键]

  • [查看数据分布]

  • [检查查询过程倾斜]

sc_toolkit管理模式还包含一些用于检查表上数据分布倾斜的视图。有关如何检查非均匀数据分布的信息, 请见《SeaboxMPP数据库参考手册》。

查看表的分布键

要查看一个表中被用作数据分布键的列,可以使用ssql中的\d+ 元命令来检查表的定义。例如:

## \d+ sales
                                       Table "public.sales"
 Column |       Type       | Collation | Nullable | Default | Storage | Stats target | Description 
--------+------------------+-----------+----------+---------+---------+--------------+-------------
 id     | integer          |           |          |         | plain   |              | 
 amt    | double precision |           |          |         | plain   |              | 
 date   | date             |           |          |         | plain   |              | 
Distributed by: (id)
Access method: heap

当创建复制表时,SeaboxMPP数据库会在每个executor上都存储一份完整的表数据。复制表没有分布键。

\d+元命令会展示分布表的分布键,复制表展示状态为Distributed Replicated

查看数据分布情况

要查看一个表中行的数据分布(每个executor上的行数),可以运行一个这样的查询:

=# SELECT sc_dbindex_id, count(*) 
   FROM table_name GROUP BY sc_dbindex_id;

如果所有的executor都有大致相同的行数,一个表就可以被认为是分布均匀的。

注意:

如果在复制表上运行此查询,则失败,因为SeaboxMPP数据库不允许用户查询引用系统列sc_dbindex_id(或系统列rowidctidcmincmaxxminxmax)。

因为每个executor都具有表的所有行,所以复制表按定义均匀分布。

检查查询过程倾斜

当一个查询被执行时,所有的executor应该具有等量的负载来保证最好的性能。如果发现了一个执行性能低下的查询,可能需要使用EXPLAIN命令进行深入研究。有关使用EXPLAIN命令和查询分析的信息,请见查询分析.

如果表的数据分布策略与查询谓词没有很好地匹配,查询执行负载可能会倾斜。要检查执行倾斜,可以运行一个这样 的查询:

=# SELECT sc_dbindex_id, count(*) FROM sales
   WHERE column='value' GROUP BY sc_dbindex_id;

这将显示对于给定的WHERE谓词,executor会返回的行数。

查看数据分布所说的, 该查询在复制表上运行时也会报错,因为在复制表上查询的sc_dbindex_id列不具有参考价值。

查看数据库元数据信息

SeaboxMPP数据库在其系统目录中跟踪各种有关存储在数据库中对象(例如表、视图、索引等等)和 全局对象(例如角色和表空间)的元数据信息。

查看对象的定义

要查看一个对象(例如表或者视图)的定义,在ssql中可以使用\d+元命令。 例如,要查看一个表的定义:

=> \d+ mytable

查看会话内存使用信息

可以创建并且使用session_level_memory_consumption视图来查看正在SeaboxMPP数据库上运行查询的会话的当前内存利用信息。该视图包含会话信息以及该会话连接到的数据库、该会话当前运行的查询和会话处理所消耗的内存等信息。

创建session_level_memory_consumption视图

要在SeaboxMPP数据库中创建session_level_memory_consumption视图,为每一个数据库运行一次扩展创建语句CREATE EXTENSION sc_internal_tools;。 例如,要在数据库testdb中安装该视图,可使用这个命令:

$ ssql -d testdb -c "CREATE EXTENSION sc_internal_tools;"
session_level_memory_consumption视图

session_level_memory_consumption视图提供有关正在运行SQL查询的会话的内存消耗以及闲置时间的信息。

在该视图中,列is_runaway表示是否SeaboxMPP数据库认为该会话是一个失控会话,这种判断基于该会话的查询的vmem内存消耗来做出。当查询消耗过多内存时,SeaboxMPP数据库认为该会话处于失控状态。SeaboxMPP数据库的服务器配置参数runaway_detector_activation_percent控制SeaboxMPP数据库什么时候会认为一个会话是失控会话。

在该视图中,当基于组的资源管理方式启用时,列is_runaway, runaway_vmem_mb,和runaway_command_cnt功能失效。

datname

类型
name
描述
该会话连接到的数据库名。

sess_id

类型
integer
描述
会话ID。

usename

类型
name
描述
会话用户的用户名。

query

类型
text
描述
该会话正在运行的当前SQL查询。

executorid

类型
integer
描述
executorid ID。

vmem_mb

类型
integer
描述
该会话的总vmem内存使用,以MB计。

is_runaway

类型
boolean
描述
会话被标记为在Segment上失控。

qe_count

类型
integer
描述
该会话的查询处理数量。

active_qe_count

类型
integer
描述
该会话的活动查询处理数量。

dirty_qe_count

类型
integer
描述
还没有释放其内存的查询处理的数量。对于没有运行的会话该值为-1。

runaway_vmem_mb

类型
integer
描述
当会话被标记为失控会话时消耗的vmem内存量。

runaway_command_cnt

类型
integer
描述
当会话被标记为失控会话时的命令计数。

idle_start

类型
timestamptz
描述
这个会话中上一次一个查询处理变成空闲的时间。

查看数据库服务器日志文件

SeaboxMPP数据库中的每一个数据库实例(coordinator和executor)都运行着一个有着自己的服务器日志文件的SeaboxSQL数据库服务器。日常的日志文件被创建在coordinator和每个executor的数据目录中的sd_log目录下。

使用sc_toolkit

使用SeaboxMPP数据库的管理方案sc_toolkit来查询系统目录、日志文件和操作系统环境以得到系统状态信息。 sc_toolkit方案包含一些可以用SQL命令访问的视图。sc_toolkit方案对所有数据库用户都可以访问。一些对象要求超级用户权限。用与下面类似的命令把sc_toolkit方案增加到用户的方案搜索路径中:

=> ALTER ROLE myrole SET search_path TO myschema,sc_toolkit;

有关可用的管理方案视图及其用法的描述,请见《SeaboxMPP数据库参考手册》。

拓展的语法-指定查询执行的节点

SeaboxMPP数据库对 表,视图以及函数的查询指定查询范围

语法格式为

select ... from table{指定范围};
select ... from view{指定范围};
select ... from function(){指定范围};
范围 NOTE
{} 在所有节点(executor或coordinator实例)执行
{executor} 在所有executor节点执行
{coordinator} 在所有coordinator节点执行
{'hostname'} 在指定的主机名上的所有节点执行
{int} 在指定id的节点执行
{{}} 每个主机随机选一个节点执行(优先选executor)
{{executor}} 每个包含executor的主机随机选一个节点执行(优先选executor)
{{coordinator}} 每个包含coordinator的主机随机选一个节点执行(优先选executor)
{{'hostname'}} 在指定的主机名上的随机选一节点执行(优先选executor)

返回的结果会增加三列

列名 含义
sc_hostname 主机名
sc_dbindex_id 执行节点id,一般coordinator<0, executor>=0
sc_port 端口号

例:查询t1表在各个executor上的分布

create table t1 ( a int );
insert into t1 values(1),(2),(3),(4),(5);
select * from t1{executor};
 a | sc_hostname | sc_dbindex_id | sc_port 
---+-------------+---------------+---------
 2 | test-4      |             0 | 5225
 3 | test-4      |             0 | 5225
 4 | test-4      |             0 | 5225
 1 | test-4      |             1 | 5226
 5 | test-4      |             2 | 5227
(5 rows)

select sc_dbindex_id,count(*) from t1{executor} group by sc_dbindex_id;
 sc_dbindex_id | count 
---------------+-------
             0 |     3
             2 |     1
             1 |     1
(3 rows)