自动化分区管理
前面讲过冷热分级存储,在生产环境中,按时间做数据分区。MatrixDB提供了一些用来管理分区的UDF,用户可以根据自己的需求手动做分区维护。如:每天一个分区,每8个小时一个分区等。
但时间是一个无限延伸的维度,在创建分区表的时候通常只是提前将未来一段时间内的分区创建好,然后定期增加新的时间段分区。这无疑增加了运维成本。
自动化分区管理就是将手动维护分区的工作自动化。包括:
- 分区自动创建与删除
- 分区数据热转冷
- 默认分区自动切分
自动化分区管理功能包含在matrixts
扩展中,所以首先要创建matrixts
扩展:
CREATE EXTENSION matrixts;
通过调用set_policy
,为目标表设置策略,来实现分区维护自动化:
目前包含如下3种policy:
- auto_partitioning
- mars_time_series
- auto_splitting
auto_partitioning
auto_partitioning
策略应用于普通分区表的自动化管理,实现了如下2种自动化功能:
- 新分区创建
- 过期分区清理
示例,创建测试分区表metrics,如下:
CREATE TABLE metrics(
time timestamp with time zone,
tag_id int,
read float,
write float
)
Distributed by (tag_id)
Partition by range(time);
为metrics表创建auto_partitioning
自动分区策略:
SELECT set_policy(
'metrics',
'auto_partitioning'
);
如果需要携带schema信息的话,传递参数schema_name.table_name即可。
设置好策略后,调用list_policy
查看策略:
SELECT * FROM list_policy('metrics');
reloid | relname | class_id | class_name | action | seq | disabled | check_func | check_args | act_func | act_args | version
--------+---------+----------+-------------------+-------------+-----+----------+----------------------------------------+----------------------+------------------------------------------------+-----------------------+---------
17798 | metrics | 2 | auto_partitioning | retention | 1 | t | matrixts_internal.apm_generic_expired | {"after": "1 year"} | matrixts_internal.apm_generic_drop_partition | {} | 1.0
17798 | metrics | 2 | auto_partitioning | auto_create | 2 | f | matrixts_internal.apm_generic_incoming | {"before": "3 days"} | matrixts_internal.apm_generic_append_partition | {"period": "8 hours"} | 1.0
(2 rows)
可以看到,auto_partitioning
总共包含两种操作:
- retention:过期分区删除
- auto_create:新分区创建
其中retention
的检测参数是{"after": "1 year"}
,即检测分区是否超过一年,然后删除。
auto_create
的检测参数是{"before": "3 days"}
,即提前3天检测是否需要创建新分区;执行参数为{"period": "8 hours"}
,即创建新分区的时间跨度为8小时。这是auto_partitioning
策略的默认设置。
如果要调整这些参数,需要调用set_policy_action
。
示例,将retention
调整为3个月后自动删除;auto_create
调整为提前2天,时间跨度为1天:
SELECT set_policy_action(
'metrics',
'retention',
'3 months'
);
SELECT set_policy_action(
'metrics',
'auto_create',
'{
"before": "2 days",
"period": "1 day"
}'
);
注意:对于只有一个参数的action来说,直接写目标值字符串即可,如retention。对于包含多个参数的action,目标值需要通过json拼接完成。
mars_time_series
mars_time_series
策略应用于时序分区表的自动化管理,实现了如下3种自动化功能:
- 新分区创建
- 过期分区清理
- 分区热转冷
在为分区创建mars_time_series
之前,首先要创建mars扩展,并为分区表建立模板:
CREATE EXTENSION mars;
SELECT mars.build_timeseries_table('metrics','tagkey="tag_id", timekey="time", timebucket="1 day"');
为metrics表创建mars_time_series
自动分区策略:
SELECT set_policy(
'metrics',
'mars_time_series'
);
设置好策略后,调用list_policy
查看策略:
SELECT * FROM list_policy('metrics');
reloid | relname | class_id | class_name | action | seq | disabled | check_func | check_args | act_func | act_args | version
--------+---------+----------+------------------+-------------+-----+----------+----------------------------------------+-----------------------------------------------+-----------------------------------------------+-----------------------+---------
17798 | metrics | 3 | mars_time_series | retention | 1 | t | matrixts_internal.apm_generic_expired | {"after": "1 year"} | matrixts_internal.apm_generic_drop_partition | {} | 1.0
17798 | metrics | 3 | mars_time_series | auto_create | 2 | f | matrixts_internal.apm_generic_incoming | {"before": "3 days"} | matrixts_internal.apm_mars_append_partition | {"period": "8 hours"} | 1.0
17798 | metrics | 3 | mars_time_series | compress | 3 | f | matrixts_internal.apm_expired_with_am | {"after": "7 days", "storage_is_not": "mars"} | matrixts_internal.apm_mars_compress_partition | {} | 1.0
(3 rows)
可以看到,mars_time_series
在auto_partitioning
基础上多了一种操作:compress
。用来做分区热转冷。检测参数为{"after": "7 days", "storage_is_not": "mars"}
,即7天后对存储引擎不是mars的分区做转换。
需要调整参数,同样调用set_policy_action
。
示例,将compress
调整为3天后转换:
SELECT set_policy_action(
'metrics',
'compress',
'{
"after": "3 days",
"storage_is_not": "mars"
}'
);
auto_splitting
auto_splitting
策略对包含默认分区的分区表,实现默认分区按时间切割操作。
示例,创建分区表,并为之创建默认分区:
CREATE TABLE metrics(
time timestamp with time zone,
tag_id int,
read float,
write float
)
Distributed by (tag_id)
Partition by range(time);
CREATE TABLE metrics_others PARTITION OF metrics DEFAULT;
设置auto_splitting
策略:
SELECT set_policy(
'metrics',
'auto_splitting'
);
查看策略:
SELECT * FROM list_policy('metrics');
reloid | relname | class_id | class_name | action | seq | disabled | check_func | check_args | act_func | act_args | version
--------+---------+----------+----------------+------------+-----+----------+------------------------------------------+--------------------------+-------------------------------------------------------+-----------------------+---------
17798 | metrics | 1 | auto_splitting | retention | 1 | t | matrixts_internal.apm_generic_expired | {"after": "1 year"} | matrixts_internal.apm_generic_drop_partition | {} | 1.0
17798 | metrics | 1 | auto_splitting | auto_split | 2 | f | matrixts_internal.apm_generic_older_than | {"age": "1 month 2days"} | matrixts_internal.apm_generic_split_default_partition | {"period": "1 month"} | 1.0
(2 rows)
可以看到,auto_splitting
策略包含2种操作,过期分区删除retention
和默认分区自动切割auto_split
。
其中,{"age": "1 month 2days"}
表示当默认分区中最老的数据早于当前时间1月零2天前的时候,进行切割。{"period": "1 month"}
表示切割后分区粒度为1个月。
操作状态设置
从上面list_policy
结果会注意到,包含一个叫做disabled
的列。该列用来设置操作生效状态。目前无论哪种策略,retention
操作的状态都是disabled。
如要开启该操作,请调用enable_policy_action
:
SELECT enable_policy_action('metrics', 'retention');
如要禁用一种操作,请调用disable_policy_action
:
SELECT disable_policy_action('metrics', 'auto_split');
删除策略
drop_policy
为分区表删除策略:
SELECT drop_policy('metrics');
注意:每个分区表只能设置一种分区策略,所以删除策略只提供分区表名即可。