配置数据保留策略
数据收集器为其监控的每个 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_POLICY 和 SET_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)
注意
设置组件策略的 INTERVAL_TIME 属性不会影响数据收集器在磁盘上为该组件保留的数据存储量。最大磁盘存储容量由 DISK_SIZE_KB 属性确定。设置 INTERVAL_TIME 属性仅影响数据在组件的数据收集器表中保留的时间。元函数 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)