创建存储位置
可以使用 CREATE LOCATION 添加和配置存储位置(不同于所需的默认值),以便提供用于以下用途的存储:
-
将执行引擎临时文件与数据文件隔离开。
-
创建 带标签的位置,以便在存储策略中使用。
-
根据预测或测量的访问模式创建存储位置。
-
为特定用户或用户组创建 USER 存储位置。
重要
重要
如果没有技术问题阻止您使用 CREATE LOCATION 添加一个或多个网络文件系统 (NFS) 存储位置,则 Vertica 不支持 NFS 数据或编录存储,MapR 挂载点除外。您将无法对任何其他 NFS 数据运行查询。在 MapR 文件系统上创建位置时,您必须指定 ALL NODES SHARED。可以将新存储位置从一个节点添加到另一个节点,或从单个节点添加到所有群集节点。但是请勿在一个节点上使用供其他群集节点访问的共享目录。
计划存储位置
在添加存储位置之前,请执行以下步骤:
-
验证计划用于存储位置目标的目录是否是对 Vertica 进程具有写入权限的空目录。
-
规划标签,以便在创建位置时为位置添加标签时。
-
确定要在存储位置中存储的信息类型:
-
DATA,TEMP
(默认值):存储位置可以存储 DML 生成的永久和临时数据,以及临时表的数据。 -
TEMP
:path 指定的位置,用于存储 DML 生成的临时数据。如果 path 设置为 S3,则仅当 RemoteStorageForTemp 配置参数设置为 1 且TEMP
必须使用 ALL NODES SHARED 加以限定。有关详细信息,请参阅临时数据的 S3 存储。 -
DATA
:存储位置只能存储永久数据。 -
DEPOT
:该存储位置用于在 Eon 模式中存储存储库。仅在本地 Linux 文件系统上创建DEPOT
存储位置。Vertica 允许每个节点有单个
DEPOT
存储位置。如果要将存储库移动到不同的位置(例如,在不同的文件系统上),您必须首先删除旧的存储库存储位置,然后创建新位置。
在不同存储位置中存储临时和数据文件极为有利,因为两种数据类型具有不同的磁盘 I/O 访问模式。临时文件根据可用存储空间在各个位置中分布。但是,数据文件可以根据存储策略存储在不同的存储位置,以反映预测或测量的访问模式。
-
如果您计划在 HDFS 上放置存储位置,请参阅HDFS 存储位置的要求了解其他要求。
创建不带标签的本地存储位置
本示例显示了一个三节点群集,其中每个节点具有一个用于存储的 vertica/SSD
目录。
在群集中的每个节点上,创建供节点存储其数据的目录。例如:
$ mkdir /home/dbadmin/vertica/SSD
Vertica 建议在每个节点上创建相同的目录路径。在创建存储位置时使用此路径。
使用 CREATE LOCATION 语句添加存储位置。指定以下信息:
-
节点上供 Vertica 存储数据的路径
重要
Vertica 不会验证您指定的路径。请确认路径值指向有效位置。 -
在上面有位置可用的节点,或 ALL NODES。如果指定 ALL NODES,该语句将在单个事务中在群集的所有节点上创建存储位置。
-
要存储的信息的类型。
要授予非特权(非 dbadmin)Linux 用户对数据的访问权限,您必须创建一个 USER 存储位置。还可以使用 USER 存储位置为没有自己凭据的用户提供对共享文件系统和对象存储(如 HDFS 和 S3)的访问权限。请参阅创建供 USER 访问的存储位置。
以下示例显示了如何添加在所有节点上可用的位置以仅存储数据:
=> CREATE LOCATION '/home/dbadmin/vertica/SSD/' ALL NODES USAGE 'DATA';
以下示例显示了如何添加 v_vmart_node0001 节点上可用于存储数据和临时文件的位置:
=> CREATE LOCATION '/home/dbadmin/vertica/SSD/' NODE 'v_vmart_node0001';
假设您正在使用适用于数据文件的存储位置,且要创建排名的存储位置。在此排名中,列根据其测量的性能存储在不同磁盘上。要创建带排名的存储位置,请参阅测量存储性能和设置存储性能。
创建存储位置之后,可以使用一些限制,更改其存储的信息类型。请参阅更改位置用途。
存储位置子目录
不能在现有存储位置的子目录中创建存储位置。这样做会导致出现与以下内容类似的错误:
=> CREATE LOCATION '/tmp/myloc' ALL NODES USAGE 'TEMP';
CREATE LOCATION
=> CREATE LOCATION '/tmp/myloc/ssd' ALL NODES USAGE 'TEMP';
ERROR 5615: Location [/tmp/myloc/ssd] conflicts with existing location
[/tmp/myloc] on node v_vmart_node0001
创建带标签的存储位置
可以使用 CREATE LOCATION 语句的 LABEL 关键字添加带描述性标签的存储位置。可以使用带标签的位置设置存储策略。请参阅创建存储策略。
以下示例显示了如何在 v_mart_node0002 上创建带标签 SSD 的存储位置:
=> CREATE LOCATION '/home/dbadmin/SSD/schemas' NODE 'v_vmart_node0002'
USAGE 'DATA' LABEL 'SSD';
以下示例显示了如何在所有节点上创建存储位置。指定 ALL NODES 关键字可通过单个事务将存储位置添加到所有节点:
=> CREATE LOCATION '/home/dbadmin/SSD/schemas' ALL NODES
USAGE 'DATA' LABEL 'SSD';
新存储位置列在 DISK_STORAGE 系统表中:
=> SELECT * FROM v_monitor.disk_storage;
.
.
-[ RECORD 7 ]-----------+-----------------------------------------------------
node_name | v_vmart_node0002
storage_path | /home/dbadmin/SSD/schemas
storage_usage | DATA
rank | 0
throughput | 0
latency | 0
storage_status | Active
disk_block_size_bytes | 4096
disk_space_used_blocks | 1549437
disk_space_used_mb | 6053
disk_space_free_blocks | 13380004
disk_space_free_mb | 52265
disk_space_free_percent | 89%
...
创建供 USER 访问的存储位置
要授予非特权(非 dbadmin)Linux 用户对数据的访问权限,您必须创建一个 USER 存储位置。
默认情况下,Vertica 使用用户提供的凭据来访问外部文件系统,例如 HDFS 和云对象存储。您可以覆盖此默认设置并创建一个 USER 存储位置来管理对这些位置的访问。要覆盖默认设置,请设置 UseServerIdentityOverUserIdentity 配置参数。
创建 USER 存储位置之后,可以授予一个或多个用户访问该位置的权限。USER 存储位置仅授予对数据文件的访问权限,而不授予对临时文件的访问权限。不能将 USER 存储位置指定给存储策略。不能将现有存储位置更改为具有 USER 访问权限。
以下示例显示了如何在特定节点上创建 USER 存储位置:
=> CREATE LOCATION '/home/dbadmin/UserStorage/BobStore' NODE
'v_mcdb_node0007' USAGE 'USER';
以下示例显示了如何为特定用户授予对该位置的读写权限:
=> GRANT ALL ON LOCATION '/home/dbadmin/UserStorage/BobStore' TO Bob;
GRANT PRIVILEGE
以下示例显示了如何使用 USER 存储位置授予对 S3 上位置的访问权限。Vertica 使用服务器凭据来访问该位置:
--- set database-level credential (once):
=> ALTER DATABASE DEFAULT SET AWSAuth = 'myaccesskeyid123456:mysecretaccesskey123456789012345678901234';
=> CREATE LOCATION 's3://datalake' SHARED USAGE 'USER' LABEL 's3user';
=> CREATE ROLE ExtUsers;
--- Assign users to this role using GRANT (Role).
=> GRANT READ ON LOCATION 's3://datalake' TO ExtUsers;
有关配置用户权限的详细信息,请参阅数据库用户和权限,以及 GRANT(存储位置)和 REVOKE(存储位置)参考页面。
共享存储与本地存储
SHARED 关键字指示该位置被所有节点共享。大多数远程文件系统(如 HDFS 和 S3)都是共享的。对于这些文件系统,path 实参表示远程文件系统中供所有节点存储数据的单个位置。每个节点在共享存储位置中为其各自的文件创建一个相应的子目录。这样做可以防止一个节点覆盖属于其他节点的文件。
如果使用远程文件系统,必须指定 SHARED,即使对于单节点群集也是如此。如果位置被声明为 USER,Vertica 不会为每个节点都创建子目录。USER 的设置优先于 SHARED。
如果在创建位置时省略此关键字,则新存储位置将被视为本地位置。每个节点都必须具有对指定路径的唯一访问权限。该位置通常是节点自己的文件系统中的一个路径。位于每个节点本地的文件系统(如 Linux)中的存储位置始终是本地位置。
已弃用
SHARED DATA 存储位置已弃用。Eon 模式下临时数据的 S3 存储
如果在 Eon 模式下使用 Vertica 并且本地磁盘空间有限,则该空间可能不足以处理某些 DML 操作可能生成的大量临时数据。对于大型加载操作和刷新操作尤其如此。
您可以利用 S3 存储来处理临时数据,如下所示:
-
使用 CREATE LOCATION 创建远程存储位置,其中 path 设置为 S3,如下所示:
=> CREATE LOCATION 's3://bucket/path' ALL NODES SHARED USAGE 'TEMP';
-
将 RemoteStorageForTemp 会话配置参数设置为 1:
=> ALTER SESSION SET RemoteStorageForTemp= 1;
在将此参数设置为 1 之前,S3 上必须已经存在临时存储位置;否则,Vertica 会引发错误并提示创建存储位置。
-
运行需要额外临时存储的查询。
-
将 RemoteStorageForTemp 重置为其默认值:
=> ALTER SESSION DEFAULT CLEAR RemoteStorageForTemp;
当设置 RemoteStorageForTemp 时,Vertica 会将所有 DML 操作的临时数据重定向到指定的远程位置。在被显式重置为其默认值 (0) 或当前会话结束之前,该参数设置将一直有效。