前言
集群监控¶
可以用系统中包含的各种工具以及附加组件来监控一个SeaboxMPP数据库系统。
观察SeaboxMPP数据库系统日常的性能有助于管理员理解系统的行为、计划工作流以及故障排查问题。 本章讨论用于监控数据库性能和活动的工具。 监控活动来快速检测系统中问题的有关内容。
集群状态监控¶
作为一个SeaboxMPP数据库管理员,必须监控系统的问题事件,例如一个组件宕机或者组件所在的一台主机磁盘空间耗尽。下面的主题描述如何监控一个SeaboxMPP数据库系统的健康状况以及检查一个SeaboxMPP数据库系统的特定状态信息。
一个SeaboxMPP数据库系统由横跨多台机器的多个SeaboxSQL实例(coordinator和executor)构成。要监控一个SeaboxMPP数据库系统,需要了解整个系统的信息以及个体实例的状态信息。seabox status
工具提供有关一个SeaboxMPP数据库系统的状态信息。
查看集群整体状态¶
默认的seabox status
行为是检查集群状态。
例如,要快速查看SeaboxMPP数据库集群的整体状态:
$ seabox status
集群整体状态说明如下:
-
cluster status 有三种状态:perfect、unusable、usable,其中:
-
当所有组件都运行正常时,cluster status为perfect
-
当所有组件中关键组件掉线,无法对外提供服务时,cluster status为unusable
-
当集群中有组件掉线,但是依赖于集群的高可用配置,集群依然可以对外提供服务,cluster status为usable
-
-
module显示的组件类型:scdcs、gtm、monitor、coordinator、executor
-
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
(或系统列rowid
,ctid
,cmin
,cmax
,xmin
和xmax
)。
因为每个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)