创建存储策略
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)
注意
不能在存储策略中包含临时文件。存储策略仅适用于 DATA 存储位置上的数据文件。存储策略对 USER 位置无效。创建一个或多个存储策略并不需要所有数据库对象都存在策略。站点可以支持具有或不具有存储策略的对象。可以为离散的优先级对象集添加存储策略,同时允许存在其他没有策略的对象,以便其使用可用的存储空间。
基于存储性能创建策略
可以测量任何磁盘存储位置的性能(请参阅测量存储性能)。然后使用性能测量值设置存储位置性能。Vertica 使用您设置的性能测量值为其存储位置排名,并通过排名确定哪些键投影列存储在性能更高的位置,如设置存储性能中所述。
如果已设置站点存储位置的性能,并决定使用存储策略,则具有关联策略的任何存储位置的优先级都高于存储排名设置。
您可以使用存储策略将旧数据移至成本较低的存储位置,同时保持其可用于查询。请参阅为低优先级数据创建存储策略。
存储层次结构和优先级
Vertica 根据下面的存储策略层次结构确定对象数据的存储位置,下面列出的存储位置按优先级升序排列:
-
数据库
-
架构
-
表
-
表分区
如果对象缺少自己的存储策略,它将使用其父对象的存储策略。例如,数据库 Sales
中的表 Region.Income
按月分区。带标签的存储策略 FAST
和 STANDARD
分别分配给表和数据库。没有为表的分区或其父架构分配存储策略,因此这些分区或架构分别使用其父对象 FAST
和 STANDARD
的存储策略:
当发生 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 在旧数据上的运行频率较低。
注意
如果 enforce-storage-move 参数设置为true
,SET_OBJECT_STORAGE_POLICY
将执行群集范围的操作。如果任意节点上出现错误,该函数将显示警告消息并跳过此节点。然后在剩余节点上继续执行操作。