创建存储位置

可以使用 CREATE LOCATION 添加和配置存储位置(不同于所需的默认值),以便提供用于以下用途的存储:

  • 将执行引擎临时文件与数据文件隔离开。

  • 创建 带标签的位置,以便在存储策略中使用。

  • 根据预测或测量的访问模式创建存储位置。

  • 为特定用户或用户组创建 USER 存储位置。

可以将新存储位置从一个节点添加到另一个节点,或从单个节点添加到所有群集节点。但是请勿在一个节点上使用供其他群集节点访问的共享目录。

计划存储位置

在添加存储位置之前,请执行以下步骤:

  1. 验证计划用于存储位置目标的目录是否是对 Vertica 进程具有写入权限的空目录。

  2. 规划标签,以便在创建位置时为位置添加标签时。

  3. 确定要在存储位置中存储的信息类型:

    • DATA,TEMP (默认值):存储位置可以存储 DML 生成的永久和临时数据,以及临时表的数据。

    • TEMPpath 指定的位置,用于存储 DML 生成的临时数据。如果 path 设置为 S3,则仅当 RemoteStorageForTemp 配置参数设置为 1 且 TEMP 必须使用 ALL NODES SHARED 加以限定。有关详细信息,请参阅临时数据的 S3 存储

    • DATA:存储位置只能存储永久数据。

    • USER:具有 READ 和 WRITE 权限的用户可以访问此存储位置的数据和外部表

    • DEPOT:该存储位置用于在 Eon 模式中存储存储库。仅在本地 Linux 文件系统上创建 DEPOT 存储位置。

      Vertica 允许每个节点有单个 DEPOT 存储位置。如果要将存储库移动到不同的位置(例如,在不同的文件系统上),您必须首先删除旧的存储库存储位置,然后创建新位置。

    在不同存储位置中存储临时和数据文件极为有利,因为两种数据类型具有不同的磁盘 I/O 访问模式。临时文件根据可用存储空间在各个位置中分布。但是,数据文件可以根据存储策略存储在不同的存储位置,以反映预测或测量的访问模式。

如果您计划在 HDFS 上放置存储位置,请参阅HDFS 存储位置的要求了解其他要求。

创建不带标签的本地存储位置

本示例显示了一个三节点群集,其中每个节点具有一个用于存储的 vertica/SSD 目录。

在群集中的每个节点上,创建供节点存储其数据的目录。例如:

$ mkdir /home/dbadmin/vertica/SSD

Vertica 建议在每个节点上创建相同的目录路径。在创建存储位置时使用此路径。

使用 CREATE LOCATION 语句添加存储位置。指定以下信息:

  • 节点上供 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)中的存储位置始终是本地位置。

Eon 模式下临时数据的 S3 存储

如果在 Eon 模式下使用 Vertica 并且本地磁盘空间有限,则该空间可能不足以处理某些 DML 操作可能生成的大量临时数据。对于大型加载操作和刷新操作尤其如此。

您可以利用 S3 存储来处理临时数据,如下所示:

  1. 使用 CREATE LOCATION 创建远程存储位置,其中 path 设置为 S3,如下所示:

    => CREATE LOCATION 's3://bucket/path' ALL NODES SHARED USAGE 'TEMP';
    
  2. 将 RemoteStorageForTemp 会话配置参数设置为 1:

    => ALTER SESSION SET RemoteStorageForTemp= 1;
    

    在将此参数设置为 1 之前,S3 上必须已经存在临时存储位置;否则,Vertica 会引发错误并提示创建存储位置。

  3. 运行需要额外临时存储的查询。

  4. 将 RemoteStorageForTemp 重置为其默认值:

    => ALTER SESSION DEFAULT CLEAR RemoteStorageForTemp;
    

当设置 RemoteStorageForTemp 时,Vertica 会将所有 DML 操作的临时数据重定向到指定的远程位置。在被显式重置为其默认值 (0) 或当前会话结束之前,该参数设置将一直有效。