这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

数据收集器实用程序

数据收集器收集并保留重要系统活动的历史记录,并记录基本性能和资源利用率计数器。

数据收集器以最小的开销扩展系统表功能,它执行以下任务:

  • 提供一个用于记录事件的框架

  • 将信息传播到系统表。

您可以通过查询数据收集器信息来获取系统表的过去状态并提取聚合信息。它还可以帮助您:

  • 查看用户已采取哪些操作。

  • 找出性能瓶颈。

  • 确定 Vertica 配置的潜在改进领域。

数据收集器与工作负载分析器搭配使用,后者是一款工具,可智能监控 SQL 查询和工作负载的性能,并通过观察实际工作负载的历史记录来建议优化操作。

配置和访问数据收集器信息

数据收集器根据可配置的保留策略保留它收集的数据。数据收集器在默认情况下处于启用状态;您可以禁用数据收集器,方法是使用 ALTER DATABASEALTER NODE 分别在数据库级别和节点级别将配置参数 EnableDataCollector 设置为 0。

您可以通过系统表 DATA_COLLECTOR 访问有关所有组件的收集数据的元数据。此表包含有关该组件的当前收集策略以及在内存和磁盘中保留了多少数据的信息。

收集的数据记录在磁盘 Vertica /catalog 路径下的 DataCollector 目录中。您可以从特定于组件的数据收集器表中查询所记录的数据。您还可以使用 Vertica 元函数管理所记录的数据;有关详细信息,请参阅管理数据收集日志

1 - 配置数据保留策略

数据收集器为其监控的每个 Vertica 组件(例如 TupleMoverEvents 或 DepotEvictions)维护保留策略。您可以通过查询 DATA_COLLECTOR 系统表来识别受监控的组件。例如,以下查询返回分区活动组件:

=> SELECT DISTINCT component FROM data_collector WHERE component ILIKE '%partition%';
      component
----------------------
 HiveCustomPartitions
 CopyPartitions
 MovePartitions
 SwapPartitions
(4 rows)

每个组件都有自己的保留策略,保留策略由几个属性组成:

  • MEMORY_BUFFER_SIZE_KB 指定数据收集器在将收集的数据移至磁盘之前,在内存中缓冲的最大数据量(以千字节为单位)。

  • DISK_SIZE_KB 指定为该组件的数据收集器表分配的最大磁盘空间(以千字节为单位)。

  • INTERVAL_TIME 是一种 INTERVAL 数据类型,用于指定给定组件的数据在该组件的数据收集器表中保留多长时间。

Vertica 为所有属性设置默认值,您可以使用元函数 SET_DATA_COLLECTOR_POLICYSET_DATA_COLLECTOR_TIME_POLICY 更改默认值。

您可以通过调用 GET_DATA_COLLECTOR_POLICY 来查看保留策略设置。例如,以下语句返回 TupleMoverEvents 组件的保留策略:

=> SELECT get_data_collector_policy('TupleMoverEvents');
                          get_data_collector_policy
-----------------------------------------------------------------------------
 1000KB kept in memory, 15000KB kept on disk. Time based retention disabled.
(1 row)

设置保留内存和磁盘存储

通过结合使用保留策略属性 MEMORY_BUFFER_SIZE_KB 和 DISK_SIZE_KB 来确定在任何给定时间可用的收集数据量。这两个属性具有以下依赖关系:如果 MEMORY_BUFFER_SIZE_KB 设置为 0,则数据收集器不会在内存或磁盘上保留此组件的任何数据;如果 DISK_SIZE_KB 设置为 0,则数据收集器仅保留它可以缓冲的最大组件数据量(由 MEMORY_BUFFER_SIZE_KB 设置)。

例如,以下语句将 ResourceAcquisitions 组件的内存和磁盘设置从 1,000 KB 内存和 10,000 KB 磁盘空间的当前设置分别更改为 1500 KB 和 25000 KB:

=> SELECT set_data_collector_policy('ResourceAcquisitions', '1500', '25000');
 set_data_collector_policy
---------------------------
 SET
(1 row)

在以下情况下,您应该考虑将 MEMORY_BUFFER_SIZE_KB 设置为较高的值:

  • 数据收集量异常高。如果 MEMORY_BUFFER_SIZE_KB 设置得太低,数据收集器将缓冲的数据刷新到磁盘的速度可能不够快,无法跟上活动级别,这可能导致内存中的数据丢失。

  • 数据收集器记录非常大 — 例如,记录中包含非常长的查询字符串。数据收集器使用双重缓冲,因此它在内存中不能保留比 MEMORY_BUFFER_SIZE_KB 大 50% 以上的记录。

设置基于时间的保留

默认情况下,给定组件的所有收集数据都保留在磁盘上,并且可以在组件的数据收集器表中进行访问,直至达到该组件的保留策略的磁盘存储限值(由其 DISK_SIZE_KB 属性设置)。您可以调用 SET_DATA_COLLECTOR_POLICY 来限制数据在组件的数据收集器表中保留的时间。在以下示例中,对组件 TupleMoverEvents 调用 SET_DATA_COLLECTOR_POLICY 并将其 INTERVAL_TIME 属性设置为 30 分钟间隔:

SELECT set_data_collector_policy('TupleMoverEvents ', '30 minutes'::interval);
set_data_collector_time_policy
--------------------------------
SET
(1 row)

在此调用之后,数据收集器表 dc_tuple_mover_events 仅保留过去 30 分钟内发生的 Tuple Mover 活动的记录。旧 Tuple Mover 数据会自动从该表中删除。例如,在上一次调用 SET_DATA_COLLECTOR_POLICY 之后,查询 dc_tuple_mover_events 会返回过去 30 分钟(在本例中,是从 07:58:21 开始)内收集的 Tuple Mover 活动的数据:

=> SELECT current_timestamp(0)  - '30 minutes'::interval AS '30 minutes ago';
   30 minutes ago
---------------------
 2020-08-13 07:58:21
(1 row)

=> SELECT time, node_name, session_id, user_name, transaction_id, operation FROM dc_tuple_mover_events WHERE node_name='v_vmart_node0001' ORDER BY transaction_id;
             time              |    node_name     |           session_id            | user_name |  transaction_id   | operation
-------------------------------+------------------+---------------------------------+-----------+-------------------+-----------
 2020-08-13 08:16:54.360597-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807826 | Mergeout
 2020-08-13 08:16:54.397346-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807826 | Mergeout
 2020-08-13 08:16:54.424002-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807826 | Mergeout
 2020-08-13 08:16:54.425989-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807829 | Mergeout
 2020-08-13 08:16:54.456829-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807829 | Mergeout
 2020-08-13 08:16:54.485097-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807829 | Mergeout
 2020-08-13 08:19:45.8045-04   | v_vmart_node0001 | v_vmart_node0001-190508:0x37b08 | dbadmin   | 45035996273807855 | Mergeout
 2020-08-13 08:19:45.742-04    | v_vmart_node0001 | v_vmart_node0001-190508:0x37b08 | dbadmin   | 45035996273807855 | Mergeout
 2020-08-13 08:19:45.684764-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x37b08 | dbadmin   | 45035996273807855 | Mergeout
 2020-08-13 08:19:45.799796-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807865 | Mergeout
 2020-08-13 08:19:45.768856-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807865 | Mergeout
 2020-08-13 08:19:45.715424-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807865 | Mergeout
 2020-08-13 08:25:20.465604-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807890 | Mergeout
 2020-08-13 08:25:20.497266-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807890 | Mergeout
 2020-08-13 08:25:20.518839-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807890 | Mergeout
 2020-08-13 08:25:20.52099-04  | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807893 | Mergeout
 2020-08-13 08:25:20.549075-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807893 | Mergeout
 2020-08-13 08:25:20.569072-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807893 | Mergeout
(18 rows)

25 分钟过去后,这些记录中有 12 条超出了为 TupleMoverEvents 设置的 30 分钟间隔,将从 dc_tuple_mover_events 中删除:

=> SELECT current_timestamp(0)  - '30 minutes'::interval AS '30 minutes ago';
   30 minutes ago
---------------------
 2020-08-13 08:23:33
(1 row)


=> SELECT time, node_name, session_id, user_name, transaction_id, operation FROM dc_tuple_mover_events WHERE node_name='v_vmart_node0001' ORDER BY transaction_id;
             time              |    node_name     |           session_id            | user_name |  transaction_id   | operation
-------------------------------+------------------+---------------------------------+-----------+-------------------+-----------
 2020-08-13 08:25:20.465604-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807890 | Mergeout
 2020-08-13 08:25:20.497266-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807890 | Mergeout
 2020-08-13 08:25:20.518839-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807890 | Mergeout
 2020-08-13 08:25:20.52099-04  | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807893 | Mergeout
 2020-08-13 08:25:20.549075-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807893 | Mergeout
 2020-08-13 08:25:20.569072-04 | v_vmart_node0001 | v_vmart_node0001-190508:0x375db | dbadmin   | 45035996273807893 | Mergeout
(6 rows)

元函数 SET_DATA_COLLECTOR_TIME_POLICY 也设置保留策略的 INTERVAL_TIME 属性。与 SET_DATA_COLLECTOR_POLICY 不同,此元函数仅设置 INTERVAL_TIME 属性。不同之处还在于,您可以使用此元函数通过省略组件实参来更新所有组件上的 INTERVAL_TIME。例如:

SELECT set_data_collector_time_policy('1 day'::interval);
set_data_collector_time_policy
--------------------------------
SET
(1 row)

=> SELECT DISTINCT component, INTERVAL_SET, INTERVAL_TIME FROM DATA_COLLECTOR WHERE component ILIKE '%partition%';
      component       | INTERVAL_SET | INTERVAL_TIME
----------------------+--------------+---------------
 HiveCustomPartitions | t            | 1
 MovePartitions       | t            | 1
 CopyPartitions       | t            | 1
 SwapPartitions       | t            | 1
(4 rows)

要清除 INTERVAL_TIME 策略属性,请调用带有负整数实参的 SET_DATA_COLLECTOR_TIME_POLICY。例如:

=> SELECT set_data_collector_time_policy('-1');
 set_data_collector_time_policy
--------------------------------
 SET
(1 row)

=> SELECT DISTINCT component, INTERVAL_SET, INTERVAL_TIME FROM DATA_COLLECTOR WHERE component ILIKE '%partition%';
      component       | INTERVAL_SET | INTERVAL_TIME
----------------------+--------------+---------------
 MovePartitions       | f            | 0
 SwapPartitions       | f            | 0
 HiveCustomPartitions | f            | 0
 CopyPartitions       | f            | 0
(4 rows)

2 - 查询数据收集器表

您可以从数据收集器表中获取特定于组件的数据。数据收集器将其日志文件中的组件数据编译为可以通过标准 SQL 查询进行查询的表格式。您可以通过数据收集器系统表识别特定组件的数据收集器表名。例如:

=> SELECT distinct component, table_name FROM data_collector where component ILIKE 'lock%';
  component   |    table_name
--------------+------------------
 LockRequests | dc_lock_requests
 LockReleases | dc_lock_releases
 LockAttempts | dc_lock_attempts
(3 rows)

然后,您可以查询所需的数据收集器表 — 例如,检查 dc_lock_attempts 中的锁定延迟:

=> SELECT * from dc_lock_attempts WHERE description != 'Granted immediately';
-[ RECORD 1 ]------+------------------------------
time               | 2020-08-17 00:14:07.187607-04
node_name          | v_vmart_node0001
session_id         | v_vmart_node0001-319647:0x1d
user_id            | 45035996273704962
user_name          | dbadmin
transaction_id     | 45035996273819050
object             | 0
object_name        | Global Catalog
mode               | X
promoted_mode      | X
scope              | TRANSACTION
start_time         | 2020-08-17 00:14:07.184663-04
timeout_in_seconds | 300
result             | granted
description        | Granted after waiting

3 - 管理数据收集日志

启动时,Vertica 在每个节点的数据库编录目录下创建一个 DataCollector 目录。对于各个组件,此目录包含一个或多个日志。例如:

[dbadmin@doch01 DataCollector]$ pwd
/home/dbadmin/VMart/v_vmart_node0001_catalog/DataCollector
[dbadmin@doch01 DataCollector]$ ls -1 -g Lock*
-rw------- 1 verticadba 2559879 Aug 17 00:14 LockAttempts_650572441057355.log
-rw------- 1 verticadba  614579 Aug 17 05:28 LockAttempts_650952885486175.log
-rw------- 1 verticadba 2559895 Aug 14 18:31 LockReleases_650306482037650.log
-rw------- 1 verticadba 1411127 Aug 17 05:28 LockReleases_650759468041873.log

对于每个组件,DataCollector 目录还包含一对 SQL 模板文件:

  • CREATE_component_TABLE.sql 提供用于创建表的 DDL,您可以在其中加载给定组件的数据收集器日志 — 例如,LockAttempts:

    [dbadmin@doch01 DataCollector]$ cat CREATE_LockAttempts_TABLE.sql
    \set dcschema 'echo ${DCSCHEMA:-dc}'
    CREATE TABLE :dcschema.dc_lock_attempts(
      "time" TIMESTAMP WITH TIME ZONE,
      "node_name" VARCHAR(128),
      "session_id" VARCHAR(128),
      "user_id" INTEGER,
      "user_name" VARCHAR(128),
      "transaction_id" INTEGER,
      "object" INTEGER,
      "object_name" VARCHAR(128),
      "mode" VARCHAR(128),
      "promoted_mode" VARCHAR(128),
      "scope" VARCHAR(128),
      "start_time" TIMESTAMP WITH TIME ZONE,
      "timeout_in_seconds" INTEGER,
      "result" VARCHAR(128),
      "description" VARCHAR(64000)
    );
    
  • COPY_component_TABLE.sql 包含用于(通过 COPY)将数据日志文件加载到 CREATE 脚本所创建的表中的 SQL。例如:

    [dbadmin@doch01 DataCollector]$ cat COPY_LockAttempts_TABLE.sql
    \set dcpath 'echo ${DCPATH:-$PWD}'
    \set dcschema 'echo ${DCSCHEMA:-dc}'
    \set logfiles '''':dcpath'/LockAttempts_*.log'''
    COPY :dcschema.dc_lock_attempts(
      LockAttempts_start_filler FILLER VARCHAR(64) DELIMITER E'\n',
      "time_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "time" FORMAT '_internal' DELIMITER E'\n',
      "node_name_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "node_name" ESCAPE E'\001' DELIMITER E'\n',
      "session_id_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "session_id" ESCAPE E'\001' DELIMITER E'\n',
      "user_id_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "user_id" FORMAT 'd' DELIMITER E'\n',
      "user_name_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "user_name" ESCAPE E'\001' DELIMITER E'\n',
      "transaction_id_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "transaction_id" FORMAT 'd' DELIMITER E'\n',
      "object_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "object" FORMAT 'd' DELIMITER E'\n',
      "object_name_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "object_name" ESCAPE E'\001' DELIMITER E'\n',
      "mode_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "mode" ESCAPE E'\001' DELIMITER E'\n',
      "promoted_mode_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "promoted_mode" ESCAPE E'\001' DELIMITER E'\n',
      "scope_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "scope" ESCAPE E'\001' DELIMITER E'\n',
      "start_time_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "start_time" FORMAT '_internal' DELIMITER E'\n',
      "timeout_in_seconds_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "timeout_in_seconds" FORMAT 'd' DELIMITER E'\n',
      "result_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "result" ESCAPE E'\001' DELIMITER E'\n',
      "description_nfiller" FILLER VARCHAR(32) DELIMITER ':',
      "description" ESCAPE E'\001'
    )  FROM :logfiles RECORD TERMINATOR E'\n.\n' DELIMITER E'\n';
    

日志管理元函数

您可以使用 Vertica 元函数 FLUSH_DATA_COLLECTORCLEAR_DATA_COLLECTOR 管理数据收集器日志。这两个函数都可以指定单个组件,也可以对所有组件执行:

  • FLUSH_DATA_COLLECTOR 等待内存日志移至磁盘后,刷新数据收集器,同时将日志与磁盘存储同步。例如,对所有组件执行以下语句:

    => SELECT flush_data_collector();
     flush_data_collector
    ----------------------
     FLUSH
    (1 row)
    
  • CLEAR_DATA_COLLECTOR 清除数据收集器表和日志中的所有内存及磁盘记录,并重置 DATA_COLLECTOR 系统表中的收集统计信息。例如,对为 ResourceAcquisitions 组件收集的数据执行以下语句:

    => SELECT clear_data_collector('ResourceAcquisitions');
     clear_data_collector
    ----------------------
     CLEAR
    (1 row)