自动化分区管理

前面讲过冷热分级存储,在生产环境中,按时间做数据分区。MatrixDB提供了一些用来管理分区的UDF,用户可以根据自己的需求手动做分区维护。如:每天一个分区,每8个小时一个分区等。

但时间是一个无限延伸的维度,在创建分区表的时候通常只是提前将未来一段时间内的分区创建好,然后定期增加新的时间段分区。这无疑增加了运维成本。

自动化分区管理就是将手动维护分区的工作自动化。包括:

  1. 分区自动创建与删除
  2. 分区数据热转冷
  3. 默认分区自动切分

自动化分区管理功能包含在matrixts扩展中,所以首先要创建matrixts扩展:

CREATE EXTENSION matrixts;

通过调用set_policy,为目标表设置策略,来实现分区维护自动化:

目前包含如下3种policy:

  1. auto_partitioning
  2. mars_time_series
  3. auto_splitting

auto_partitioning

auto_partitioning策略应用于普通分区表的自动化管理,实现了如下2种自动化功能:

  1. 新分区创建
  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总共包含两种操作:

  1. retention:过期分区删除
  2. 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种自动化功能:

  1. 新分区创建
  2. 过期分区清理
  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_seriesauto_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');

注意:每个分区表只能设置一种分区策略,所以删除策略只提供分区表名即可。