跳转至

Vertica 监控最佳实践

原文:Best Practices for Monitoring Vertica

关联:Vertica 维护前准备 Checklist(监控发现问题后的执行动作)| K-Safety 最佳实践

概述

本文档帮助监控 Vertica 数据库,按查询执行类别分类,覆盖以下 10 大领域:

  1. 系统健康
  2. 资源使用
  3. 活跃会话
  4. 活跃事务/查询
  5. 恢复
  6. 重平衡
  7. 历史活动
  8. 对象统计
  9. 查询性能
  10. Data Collector 表

1. 系统健康

监控节点状态

节点处于 DOWN 状态时,不参与该时间点之后提交的任何事务。务必持续监控节点状态。

SELECT node_name, node_state FROM nodes ORDER BY 1;

输出示例:

node_name      | node_state
---------------+------------
v_demo_node0001 | UP
v_demo_node0002 | INITIALIZING
v_demo_node0003 | UP
(3 rows)

也可以通过 Management Console 查看可视化概览:

MonitoringVertica MC View

如果节点 DOWN,先尝试重启。排查参考 KB 文章「Database Node is DOWN checklist」和「Node Recovery in Vertica」。

监控 Epoch 状态

AHM(Ancient History Mark)指向可被物理清除的历史数据的时间点。Epoch 状态反映集群健康度。

SELECT current_epoch, ahm_epoch, last_good_epoch,
       designed_fault_tolerance, current_fault_tolerance,
       wos_used_bytes, ros_used_bytes
FROM system;

或简化版:

SELECT get_ahm_time(), get_ahm_epoch(), get_last_good_epoch(),
       get_current_epoch(), sysdate;

关注要点:

  • designed_fault_tolerancecurrent_fault_tolerance 是否一致?
  • ahm_epoch 是否接近 last_good_epoch?如果相差很远 → AHM 未推进
  • WOS/ROS 使用量
  • 默认 AHM 尽可能靠近当前时间;如果 AHM 时间超过 14 天前,联系 Vertica 技术支持

监控 Delete Vector

DELETE 或 UPDATE 语句会创建 delete vector。数量过多会严重影响性能。

-- 系统级总数
SELECT COUNT(*) FROM v_monitor.delete_vectors;

-- 按投影看哪些表的删除行比例 > 5%
SELECT node_name, schema_name, projection_name,
       total_row_count, deleted_row_count, delete_vector_count
FROM storage_containers
WHERE deleted_row_count > total_row_count * 0.05
ORDER BY deleted_row_count DESC;

大量 delete vector 表示集群处于异常状态。处理参考「Best Practices for Deleting Data」。

监控 ROS Container 数量

Vertica 每个投影的 ROS container 上限为 1024。数量过大会影响性能。

SELECT node_name, projection_schema, projection_name,
       SUM(ros_count) AS ros_count
FROM v_monitor.projection_storage
GROUP BY node_name, projection_schema, projection_name
ORDER BY ros_count DESC;

超过 500 通常意味着 PARTITION BY 设计有问题,或 merge 过程未正常运作。详见「Vertica Partitions: The FAQs」。


2. 资源使用

监控 Resource Pool

SELECT sysdate AS current_time, node_name, pool_name,
       memory_inuse_kb, general_memory_borrowed_kb, running_query_count
FROM resource_pool_status
WHERE pool_name IN ('general')
ORDER BY 1, 2, 3;

查看哪个节点慢、哪些查询在运行或停止。也可查内存消耗大的查询:

SELECT * FROM resource_acquisitions
ORDER BY memory_inuse_kb DESC LIMIT X;

监控资源队列

SELECT * FROM v_monitor.resource_queues;

显示各资源池的待处理请求,position_in_queue 表示排队位置。

监控资源请求拒绝

SELECT * FROM v_monitor.resource_rejections;

记录 Resource Manager 拒绝的资源请求。计数器在节点重启时归零。用于诊断资源空间不足及受影响的用户/池。

监控系统资源

SELECT * FROM v_monitor.system_resource_usage
ORDER BY end_time DESC;

提供内存、CPU、网络、磁盘 I/O 等系统资源的历史数据。

监控磁盘空间

Vertica 建议保留 40% 空闲空间以确保平稳运行。

SELECT * FROM v_monitor.storage_usage
ORDER BY poll_timestamp DESC;

3. 活跃会话

查看当前会话

SELECT user_name, session_id, current_statement, statement_start
FROM v_monitor.sessions;

用这个表可以:

  • 识别运行长查询的用户
  • 识别因未提交事务而持有锁的用户
  • 确定关闭数据库前需要断开哪些用户
  • 查看会话是否使用 SSL 或客户端认证
  • 识别客户端版本

关闭会话

SELECT close_session('session_id');

关闭会话会中断连接、回滚当前事务并关闭 socket。只能关闭自己的会话。


4. 活跃查询

监控正在运行的查询

SELECT node_name, query, query_start, user_name, is_executing
FROM v_monitor.query_profiles
WHERE is_executing = 't';

监控加载状态

SELECT table_name, read_bytes, input_file_size_bytes,
       accepted_row_count, rejected_row_count,
       parse_complete_percent, sort_complete_percent
FROM load_streams
WHERE is_executing = 't'
ORDER BY table_name;

查看历史加载记录:改为 WHERE is_executing = 'f'

监控锁状态

SELECT locks.lock_mode, locks.lock_scope,
       substr(locks.transaction_description, 1, 100) AS "left",
       locks.request_timestamp, locks.grant_timestamp
FROM v_monitor.locks;

无结果 = 当前没有锁。用于分析批处理问题和慢查询原因。


5. 恢复(Recovery)

节点从 DOWN 恢复时,需要从 buddy 节点同步缺失数据才能回到 UP 状态。

SELECT node_name, recover_epoch, recovery_phase,
       current_completed, current_total, is_running
FROM v_monitor.recovery_status
ORDER BY 1;

字段含义:

字段 含义
is_running 恢复是否进行中
current_completed 已完成恢复的投影数
current_total 需要恢复的投影总数

6. 重平衡(Rebalance)

检查节点依赖

SELECT GET_NODE_DEPENDENCIES();

清理的节点依赖列表应显示 (节点数 + 1) 行。每行显示分段投影数,最后一行是非分段投影数。位图中 bit=1 表示该节点有数据 segment。

监控重平衡进度

SELECT rebalance_method AS "方法", Status, COUNT(*) AS Count
FROM (
  SELECT rebalance_method,
    CASE
      WHEN (separated_percent = 100 AND transferred_percent = 100) THEN 'Completed'
      WHEN (separated_percent <> 0 AND separated_percent <> 100)
        OR (transferred_percent <> 0 AND transferred_percent <> 100) THEN 'In Progress'
      ELSE 'Queued'
    END AS Status
  FROM v_monitor.rebalance_projection_status
  WHERE is_latest
) AS tab
GROUP BY 1, 2 ORDER BY 1, 2;

重平衡方法:

  • ELASTIC_CLUSTER — 弹性集群
  • REPLICATE — 复制
  • REFRESH — 刷新

7. 历史活动

按执行时间查 Top N 慢查询

SELECT user_name, start_timestamp, request_duration_ms,
       transaction_id, statement_id,
       substr(request, 0, 1000) AS request
FROM v_monitor.query_requests
WHERE transaction_id > 0
ORDER BY request_duration_ms DESC
LIMIT 10;

request_duration_ms 单位是毫秒。

查看查询的内存使用

SELECT node_name, transaction_id, statement_id, user_name,
       start_timestamp, request_duration_ms, memory_acquired_mb,
       substr(request, 1, 100) AS request
FROM v_monitor.query_requests
WHERE transaction_id = <txn_id> AND statement_id = <stmt_id>;

根据结果可以优化查询、修改表/投影设计或减少数据量。


8. 对象统计

监控分区数

SELECT node_name, projection_name, count(partition_key)
FROM v_monitor.partitions
GROUP BY node_name, projection_name
ORDER BY node_name, projection_name;

分区过多说明需要用 ALTER TABLE 调整分区策略。

监控数据倾斜

SELECT ps.node_name, ps.projection_schema, ps.projection_name, ps.row_count
FROM v_monitor.projection_storage ps
INNER JOIN v_catalog.projections p
  ON ps.projection_schema = p.projection_schema
  AND ps.projection_name = p.projection_name
WHERE p.is_segmented
ORDER BY ps.projection_schema, ps.projection_name, ps.node_name;

各节点上同一投影的行数应接近。差异过大说明存在数据倾斜,需优化投影设计。


9. 查询性能

查询执行事件

-- query_events 表提供查询计划、优化及执行事件
SELECT * FROM v_monitor.query_events;

查询性能会随数据增长而退化,需持续监控高频和大数据量查询。

加载流统计

SELECT schema_name, table_name, load_start, load_duration_ms,
       is_executing, parse_complete_percent, sort_complete_percent,
       accepted_row_count, rejected_row_count
FROM v_monitor.load_streams;

记录每次加载的接受/拒绝行数,按来源分组可追踪数据来源。


10. Data Collector 表速查

类别 组件 DC 表 说明
Query RequestsIssued dc_requests_issued 所有 SQL 请求历史
Query RequestsCompleted dc_requests_completed 所有完成的 SQL 请求
Query ExecutionEngineProfiles dc_execution_engine_profiles EE 分析历史
Query QueryExecutions dc_query_executions 查询执行各步骤
Resource ResourceAcquisitions dc_resource_acquisitions 资源获取历史
Resource ResourcePoolStatus dc_resource_pool_status 资源池状态
Event OptimizerEvents dc_optimizer_events 优化器重要事件
Event ExecutionEngineEvents dc_execution_engine_events 本地规划与执行事件
Session SessionStarts dc_session_starts 会话启动
Session SessionEnds dc_session_ends 会话结束
Lock LockAttempts dc_lock_attempts 锁尝试历史
Lock LockReleases dc_lock_releases 锁释放历史

关键 SQL 速查

监控目标 SQL
节点状态 SELECT node_name, node_state FROM nodes;
Epoch/AHM SELECT * FROM system;
Delete Vector SELECT COUNT(*) FROM v_monitor.delete_vectors;
ROS Container v_monitor.projection_storage GROUP BY
资源池 SELECT * FROM resource_pool_status;
资源队列 SELECT * FROM v_monitor.resource_queues;
系统资源 SELECT * FROM v_monitor.system_resource_usage;
磁盘 SELECT * FROM v_monitor.storage_usage;
活跃会话 SELECT * FROM v_monitor.sessions;
关闭会话 SELECT close_session('session_id');
运行中查询 v_monitor.query_profiles WHERE is_executing='t'
加载进度 load_streams WHERE is_executing='t'
锁状态 SELECT * FROM v_monitor.locks;
恢复状态 v_monitor.recovery_status
重平衡进度 v_monitor.rebalance_projection_status
慢查询 Top N v_monitor.query_requests ORDER BY request_duration_ms DESC
查询内存 memory_acquired_mb FROM v_monitor.query_requests
分区数 v_monitor.partitions GROUP BY
数据倾斜 projection_storage JOIN projections
节点依赖 SELECT GET_NODE_DEPENDENCIES();

扩展阅读