创建存储策略

Vertica 元函数 SET_OBJECT_STORAGE_POLICY 可以创建 存储策略,将数据库对象与带标签的存储位置相关联。当对象具有存储策略时,Vertica 使用带标签的位置作为对象数据的默认存储位置。

可以为任何数据库、架构、表和分区范围创建存储策略。每个对象都可以与一个存储策略相关联。每次加载和更新数据时,Vertica 都会检查对象是否具有存储策略。如果有,Vertica 将自动使用带标签的存储位置。如果对象或其父代实体没有存储策略,数据存储处理将在可用的存储位置上使用标准存储算法继续。如果所有存储位置都带标签,Vertica 将使用其中之一。

存储策略可用于确定存储重要数据的位置。例如,可以创建带标签 SSD 的存储位置,用以表示群集节点上最快可用的存储位置。随后可以创建存储策略以将表与此带标签的位置相关联。例如,下面的 SET_OBJECT_STORAGE_POLICY 语句将 test 表上的存储策略设置为使用带有 SSD 标签的存储作为其默认位置:

=>  SELECT SET_OBJECT_STORAGE_POLICY('test','ssd', true);
            SET_OBJECT_STORAGE_POLICY
--------------------------------------------------
Object storage policy set.
Task: moving storages
(Table: public.test) (Projection: public.test_b0)
(Table: public.test) (Projection: public.test_b1)

(1 row)

创建一个或多个存储策略并不需要所有数据库对象都存在策略。站点可以支持具有或不具有存储策略的对象。可以为离散的优先级对象集添加存储策略,同时允许存在其他没有策略的对象,以便其使用可用的存储空间。

基于存储性能创建策略

可以测量任何磁盘存储位置的性能(请参阅测量存储性能)。然后使用性能测量值设置存储位置性能。Vertica 使用您设置的性能测量值为其存储位置排名,并通过排名确定哪些键投影列存储在性能更高的位置,如设置存储性能中所述。

如果已设置站点存储位置的性能,并决定使用存储策略,则具有关联策略的任何存储位置的优先级都高于存储排名设置。

您可以使用存储策略将旧数据移至成本较低的存储位置,同时保持其可用于查询。请参阅为低优先级数据创建存储策略

存储层次结构和优先级

Vertica 根据下面的存储策略层次结构确定对象数据的存储位置,下面列出的存储位置按优先级升序排列:

  1. 数据库

  2. 架构

  3. 表分区

如果对象缺少自己的存储策略,它将使用其父对象的存储策略。例如,数据库 Sales 中的表 Region.Income 按月分区。带标签的存储策略 FASTSTANDARD 分别分配给表和数据库。没有为表的分区或其父架构分配存储策略,因此这些分区或架构分别使用其父对象 FASTSTANDARD 的存储策略:

当发生 Tuple Mover 操作(如合并)时,所有 Income 数据都会移至 FAST 存储位置。Region 架构中的其他表使用其各自的存储策略。如果 Region 表缺少自己的存储策略,Tuple Mover 将使用它上面的下一个存储策略 — 在这种情况下,它使用数据库存储策略并将表数据移至 STANDARD

查询现有存储策略

可以查询在 STORAGE_CONTAINERS 系统表的 location_label 列中列出的现有存储策略:

=> SELECT node_name, projection_name, location_label FROM v_monitor.storage_containers;
    node_name     |   projection_name    | location_label
------------------+----------------------+----------------
 v_vmart_node0001 | states_p             |
 v_vmart_node0001 | states_p             |
 v_vmart_node0001 | t1_b1                |
 v_vmart_node0001 | newstates_b0         | LEVEL3
 v_vmart_node0001 | newstates_b0         | LEVEL3
 v_vmart_node0001 | newstates_b1         | LEVEL3
 v_vmart_node0001 | newstates_b1         | LEVEL3
 v_vmart_node0001 | newstates_b1         | LEVEL3
 v_vmart_node0001 | states_p_v1_node0001 | LEVEL3
 v_vmart_node0001 | states_p_v1_node0001 | LEVEL3
 v_vmart_node0001 | states_p_v1_node0001 | LEVEL3
 v_vmart_node0001 | states_p_v1_node0001 | LEVEL3
 v_vmart_node0001 | states_p_v1_node0001 | LEVEL3
 v_vmart_node0001 | states_p_v1_node0001 | LEVEL3
 v_vmart_node0001 | states_b0            | SSD
 v_vmart_node0001 | states_b0            | SSD
 v_vmart_node0001 | states_b1            | SSD
 v_vmart_node0001 | states_b1            | SSD
 v_vmart_node0001 | states_b1            | SSD
...

将现有数据存储强制移动到新存储位置

默认情况下,Tuple Mover 在所有挂起的合并操作完成后强制执行对象存储策略。 SET_OBJECT_STORAGE_POLICY 立即将现有数据存储移至新位置,但前提是它的 enforce-storage-move 参数设置为 true。如果要移动的数据是旧数据,您可能需要强制移动,即使这意味着需要等待操作完成才能继续也是如此。Tuple Mover 在旧数据上的运行频率较低。