这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

文件系统和对象存储

除了 Linux 文件系统之外,Vertica 还支持访问多个文件系统和对象存储。此部分中的参考页面提供有关 URI 语法、配置参数和身份验证的信息。

Vertica 通过以下两种方式之一访问此部分中的文件系统:

  • 如果存在用户提供的凭据,Vertica 将使用其访问存储。请注意,在 HDFS 上,始终存在用户凭据,因为 Vertica 使用 Vertica 用户身份访问 HDFS。

  • 如果用户提供的凭据不存在,或者设置了 UseServerIdentityOverUserIdentity 配置参数,Vertica 会检查配置的 USER 存储位置。通过 USER 存储位置管理访问时,Vertica 使用服务器凭据访问文件系统。有关 USER 存储位置的更多信息,请参阅 CREATE LOCATION

并非在所有上下文中都支持所有文件系统。请参阅特定功能的文档,了解这些功能支持的文件系统。

1 - Azure Blob 存储对象存储

Azure 有数个用于访问数据的界面。Vertica 在 Azure 存储中读取并始终写入块 Blob。Vertica 可以读取使用 ADLS Gen2 创建的外部数据,而 Vertica 导出的数据可以使用 ADLS Gen2 读取。

URI 格式

以下几项之一:

  • azb://account/container/path
  • azb://[account@]host[:port]/container/path

在第一个版本中,类似“azb://myaccount/mycontainer/path”的 URI 将“//”后面的第一个令牌视为帐户名。在第二个版本中,您可以指定帐户,并且必须显式指定主机。

以下规则适用于第二种形式:

  • 如果未指定 account,则使用主机的第一个标签。例如,如果 URI 是“azb://myaccount.blob.core.windows.net/mycontainer/my/object”,则“myaccount”用于 account
  • 如果未指定 accounthost 有一个标签并且没有端口,则端点是 host.blob.core.windows.net。否则,端点是 URI 中指定的主机和端口。

协议(HTTP 或 HTTPS)在 AzureStorageEndpointConfig 配置参数中指定。

身份验证

如果您使用的是 Azure 托管身份,则无需在 Vertica 中进一步配置。如果 Azure 存储使用多个托管身份,则必须标记要使用的身份。Vertica 查找键为 VerticaManagedIdentityClientId 的 Azure 标记,其值必须是要使用的托管身份的 client_id 属性。如果更新 Azure 标记,请调用 AZURE_TOKEN_CACHE_CLEAR

如果不使用托管身份,请使用 AzureStorageCredentials 配置参数向 Azure 提供凭据。如果加载数据,您可以在会话级别设置参数。如果在 Azure 上使用 Eon 模式公共存储,则必须在数据库级别设置此配置参数。

在 Azure 中,您还必须为 Vertica 中使用的身份授予对容器的访问权限。

配置参数

以下数据库配置参数适用于 Azure blob 文件系统。您可以使用适当的 ALTER 语句设置不同级别的参数,例如 ALTER SESSION...SET PARAMETER。 查询 CONFIGURATION_PARAMETERS 系统表以确定哪些级别(节点、会话、用户、数据库)对给定参数有效。

AzureStorageCredentials
JSON 对象的集合,其中每个对象指定一个端点的连接凭据。此参数优先于 Azure 托管标识。

该集合必须至少包含一个对象,并且可能会包含多个对象。每个对象必须至少指定 accountNameblobEndpoint 之一,并且至少指定 accountKeysharedAccessSignature 之一。

  • accountName:如果未指定,则使用 blobEndpoint 标签。
  • blobEndpoint:带有可选端口的主机名 (host:port)。如果未指定,则使用 account.blob.core.windows.net
  • accountKey:帐户或端点的访问密钥。
  • sharedAccessSignature:用于更精细访问控制的访问令牌(如果 Azure 端点正在使用)。
AzureStorageEndpointConfig
JSON 对象的集合,其中每个对象指定一个端点的配置元素。每个对象必须至少指定 accountNameblobEndpoint 之一。
  • accountName:如果未指定,则使用 blobEndpoint 标签。
  • blobEndpoint:带有可选端口的主机名 (host:port)。如果未指定,则使用 account.blob.core.windows.net
  • protocol:HTTPS(默认)或 HTTP。
  • isMultiAccountEndpoint:如果端点支持多个帐户,则为 true,否则为 false(默认为 false)。要使用多帐户访问权限,则必须在 URI 中包含帐户名称。如果 URI 路径包含帐户,则系统将假定此值为 true,但显式设置为 false 则除外。

示例

以下示例将这些值用于配置参数。AzureStorageCredentials 包含敏感信息,且此示例中在会话级别设置。

=> ALTER SESSION SET AzureStorageCredentials =
    '[{"accountName": "myaccount", "accountKey": "REAL_KEY"},
      {"accountName": "myaccount", "blobEndpoint": "localhost:8080", "accountKey": "TEST_KEY"}]';

=> ALTER DATABASE default SET AzureStorageEndpointConfig =
    '[{"accountName": "myaccount", "blobEndpoint": "localhost:8080", "protocol": "http"}]';

以下示例使用 Azure 中的数据创建一个外部表。URI 指定帐户名称“myaccount”。

=> CREATE EXTERNAL TABLE users (id INT, name VARCHAR(20))
    AS COPY FROM 'azb://myaccount/mycontainer/my/object/*';

Vertica 使用 AzureStorageEndpointConfig 和帐户名称为文件生成以下位置:

https://myaccount.blob.core.windows.net/mycontainer/my/object/*

使用 REAL_KEY 凭据访问数据。

如果 COPY 语句中的 URI 改为 azb://myaccount.blob.core.windows.net/mycontainer/my/object,则结果位置为 https://myaccount.blob.core.windows.net/mycontainer/my/object,同样使用 REAL_KEY 凭据。

但是,如果 COPY 语句中的 URI 是 azb://myaccount@localhost:8080/mycontainer/my/object,则主机和端口指定不同的端点:http://localhost:8080/myaccount/mycontainer/my/object。此端点配置为使用不同的凭据 TEST_KEY。

2 - Google Cloud Storage (GCS) 对象存储

使用 Google Cloud Storage 平台的文件系统。

URI 格式

gs://bucket/path

身份验证

要访问 Google Cloud Storage (GCS) 中的数据,您必须首先执行以下任务:

  • GCS 文档中所述,创建一个默认项目,获取开发人员密钥并启用 S3 互操作模式。

  • 设置 GCSAuth 配置参数,如下例所示。

    => ALTER SESSION SET GCSAuth='id:secret';
    

配置参数

以下数据库配置参数适用于 GCS 文件系统。您可以使用适当的 ALTER 语句设置不同级别的参数,例如 ALTER SESSION...SET PARAMETER。 查询 CONFIGURATION_PARAMETERS 系统表以确定哪些级别(节点、会话、用户、数据库)对给定参数有效。 有关与 GCS 相关的所有参数的信息,请参阅Google Cloud Storage 参数

GCSAuth
用于向 GCS 进行身份验证的 ID 和密钥。为了获得更高的安全性,请不要将凭据存储在数据库中;而是应当使用 ALTER SESSION...SET PARAMETER 仅为当前会话设置此值。
GCSEnableHttps
布尔值,连接 GCS 时是否使用 HTTPS 协议,只能在数据库级别用 ALTER DATABASE...SET PARAMETER 设置。

默认值: 1(启用)

GCSEndpoint
连接端点地址。

默认值: storage.googleapis.com

示例

以下示例从 GCS 加载数据:

=> ALTER SESSION SET GCSAuth='my_id:my_secret_key';

=> COPY t FROM 'gs://DataLake/clicks.parquet' PARQUET;

3 - HDFS 文件系统

HDFS 是 Hadoop 分布式文件系统。您可以使用 webhdfsswebhdfs 架构通过 WebHDFS 服务访问数据。Vertica 还支持 hdfs 架构,默认情况下使用 WebHDFS。要让 hdfs URI 使用已弃用的 LibHDFS++ 包,请将 HDFSUseWebHDFS 配置参数设置为 0(禁用)。

如果您指定 webhdfs URI,但 Hadoop HTTP 策略 (dfs.http.policy) 设置为 HTTPS_ONLY,Vertica 会自动使用 swebhdfs

如果您使用 LibHDFS++,则 WebHDFS 服务必须仍然可用,因为 Vertica 回退到 WebHDFS 以执行不受 LibHDFS++ 支持的操作。

URI 格式

webhdfsswebhdfshdfs 架构中的 URI 都有两种格式,具体取决于您是指定名称服务,还是指定主机和名称节点的端口:

  • [[s]web]hdfs://[nameservice]/path
  • [[s]web]hdfs://namenode-host:port/path

字符可以进行 URL 编码(%NN,其中 NN 是两位十六进制数),但不是必须的,除非必须对“%”字符进行编码。

要使用 HDFS 配置文件中指定的默认名称服务,请省略 nameservice。此速记仅用于读取外部数据,而不用于创建存储位置。

将 Vertica 与多个 HDFS 群集一起使用时,始终显式指定名称服务或主机。名称服务或主机名必须全局唯一。使用 [web]hdfs:/// 可能会产生意外结果,因为 Vertica 使用它找到的第一个 fs.defaultFS 值。

身份验证

Vertica 可以对 Cloudera 或 Hortonworks HDFS 群集使用 Kerberos 身份验证。请参阅访问已进行 Kerberize 的 HDFS 数据

对于加载和导出数据,Vertica 可以通过 swebhdfs 架构访问受 mTLS 保护的 HDFS 群集。您必须创建证书和密钥并设置 WebhdfsClientCertConf 配置参数。

如果指定 TEMPORARY 关键字,则可以使用 CREATE KEYCREATE CERTIFICATE 创建临时的会话范围值。临时密钥和证书存储在内存中,而不是磁盘上。

WebhdfsClientCertConf 配置参数保存一个或多个 HDFS 群集的客户端凭据。该值是一个 JSON 字符串,列出名称服务或权限及其对应的键。您可以在会话或数据库级别配置参数。在数据库级别设置参数有以下额外要求:

以下示例显示了 mTLS 的用法。密钥和证书值本身不会显示,只显示开始标记和结束标记:

=> CREATE TEMPORARY KEY client_key TYPE 'RSA'
   AS '-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----';

-> CREATE TEMPORARY CERTIFICATE client_cert
   AS '-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----' key client_key;

=> ALTER SESSION SET WebhdfsClientCertConf =
   '[{"authority": "my.hdfs.namenode1:50088", "certName": "client_cert"}]';

=> COPY people FROM 'swebhdfs://my.hdfs.namenode1:50088/path/to/file/1.txt';
Rows Loaded
-------------
1
(1 row)

要配置对多个 HDFS 群集的访问,请定义密钥和证书,然后在 WebhdfsClientCertConf 的值中为每个群集包括一个对象:

=> ALTER SESSION SET WebhdfsClientCertConf =
    '[{"authority" : "my.authority.com:50070", "certName" : "myCert"},
      {"nameservice" : "prod", "certName" : "prodCert"}]';

配置参数

以下数据库配置参数适用于 HDFS 文件系统。您可以使用适当的 ALTER 语句设置不同级别的参数,例如 ALTER SESSION...SET PARAMETER。 查询 CONFIGURATION_PARAMETERS 系统表以确定哪些级别(节点、会话、用户、数据库)对给定参数有效。 有关 Hadoop 相关的所有参数的信息,请参阅 Hadoop 参数

EnableHDFSBlockInfoCache
布尔值,是否将规划启动程序时收集的块位置元数据分发到所有数据库节点以便执行,减少名称节点争用现象。默认为已禁用。
HadoopConfDir
包含从 Hadoop 复制的 XML 配置文件的目录路径。相同的路径必须在每个 Vertica 节点上都有效。文件将由运行 Vertica 服务器进程的 Linux 用户进行访问。
HadoopImpersonationConfig
会话参数,用于指定 HDFS 访问的委派令牌或 Hadoop 用户。请参阅 HadoopImpersonationConfig 格式了解有关此参数值的信息,请参阅代理用户和委托令牌了解有关更一般的上下文。
HDFSUseWebHDFS
Boolean。如果为 true(默认值),则 hdfs 架构中的 URI 将被视为在 webhdfs 架构中。如果为 false,Vertica 会尽可能使用 LibHDFS++,但如果 LibHDFS++ 不支持,某些操作仍可使用 WebHDFS。
WebhdfsClientCertConf
一个 JSON 字符串,用于访问一个或多个 WebHDFS 服务器的 mTLS 配置。每个对象必须指定一个 nameserviceauthority 字段和一个 certName 字段。请参阅身份验证

配置文件

HadoopConfDir 中指定的路径必须包含下表中所列文件的目录。Vertica 将在数据库启动时读取这些文件。如果您未设置值,Vertica 会在 /etc/hadoop/conf 中查找文件。

如果未定义属性,Vertica 将使用表中显示的默认值。如果没有指定属性的默认值,则配置文件必须指定一个值。

如果使用高可用性 (HA) 名称节点,则还必须在 hdfs-site.xml 中定义单个名称节点。

要验证 Vertica 能否在 HadoopConfDir 中找到配置文件,请使用 VERIFY_HADOOP_CONF_DIR 函数。

要通过 hdfs 架构测试访问,请使用 HDFS_CLUSTER_CONFIG_CHECK 函数。

有关测试配置的详细信息,请参阅验证 HDFS 配置

要重新读取配置文件,请使用 CLEAR_HDFS_CACHES 函数。

名称节点和名称服务

您可以使用默认名称节点(不指定名称节点或名称服务)访问 HDFS 数据:

=> COPY users FROM 'webhdfs:///data/users.csv';

Vertica 使用 fs.defaultFS Hadoop 配置参数来查找名称节点。(然后,它使用该名称节点来查找数据。)您可以改为使用以下格式显式指定主机和端口:

webhdfs://nn-host:nn-port/

指定的主机是名称节点,而不是单个数据节点。如果您使用的是高可用性 (HA) 名称节点,则不应使用显式主机,因为高可用性是通过名称服务提供的。

如果 HDFS 群集使用高可用性名称节点或定义名称服务,请使用名称服务而不是主机和端口,格式为 webhdfs://nameservice/。您指定的名称服务必须在 hdfs-site.xml 中定义。

以下示例显示了如何使用名称服务 hadoopNS:

=> CREATE EXTERNAL TABLE users (id INT, name VARCHAR(20))
    AS COPY FROM 'webhdfs://hadoopNS/data/users.csv';

如果您使用 Vertica 从多个 HDFS 群集访问数据,请始终在 URL 中使用显式名称服务或主机。使用 /// 速记可能会产生意外结果,因为 Vertica 使用它找到的 fs.defaultFS 的第一个值。要访问多个 HDFS 群集,您必须使用全局唯一的主机名和服务名。有关详细信息,请参阅配置 HDFS 访问

4 - S3 对象存储

使用 S3 协议的文件系统,包括 AWS、Pure Storage 和 MinIO。

URI 格式

s3://bucket/path

对于 AWS,使用 AWSRegion 配置参数而不是 URI 指定区域。如果区域不正确,可能会在加载失败之前遇到延迟,因为 Vertica 在放弃之前会进行多次重试。默认区域为 us-east-1

身份验证

对于 AWS:

  • 要访问 S3,您必须创建一个 IAM 角色并向该角色授予访问 S3 资源的权限。

  • 默认情况下,存储桶访问仅限于公共存储桶。使用 AWS 访问密钥从非公共存储桶加载数据。

  • 设置 AWSAuth 配置参数以提供凭据或为 S3 路径创建 USER 存储位置(请参阅 CREATE LOCATION)并授予用户访问权限。

  • 您可以使用 AWS STS 临时会话令牌来加载数据。因为这些令牌是会话令牌,所以不要将其用于访问存储位置。

  • 您可以使用每个存储桶的参数 S3BucketConfig 和 S3BucketCredentials 单独配置 S3 存储桶。有关详细信息,请参阅每个存储桶 S3 配置

配置参数

以下数据库配置参数适用于 S3 文件系统。您可以使用适当的 ALTER 语句设置不同级别的参数,例如 ALTER SESSION...SET PARAMETER。 查询 CONFIGURATION_PARAMETERS 系统表以确定哪些级别(节点、会话、用户、数据库)对给定参数有效。

您可以使用 S3BucketConfig 和 S3BucketCredentials 参数而不是全局参数来配置单个存储桶。

有关与 S3 相关的所有参数的详细信息,请参阅S3 参数

AWSAuth
用于身份验证的 ID 和密钥。AWS 调用这些 AccessKeyID 和 SecretAccessKey。为了获得更高的安全性,请不要将凭据存储在数据库中;应当使用 ALTER SESSION...SET PARAMETER 仅为当前会话设置此值。
AWSCAFile
要使用的 TLS 服务器证书捆绑包的文件名。在 SUSE Linux Enterprise Server 上安装 CA 证书时必须设置一个值。
AWSCAPath
Vertica 用于查找 TLS 服务器证书的路径。在 SUSE Linux Enterprise Server 上安装 CA 证书时必须设置一个值。
AWSEnableHttps
布尔值,连接 S3 时是否使用 HTTPS 协议。只能在数据库级别设置。您可以使用 S3BucketConfig 为各个存储桶设置协议。

默认值: 1(启用)

AWSEndpoint
字符串,所有 S3 URL 的端点主机,设置如下:
  • AWS:hostname_or_IP:port。不要包括架构 (http(s))。

  • 具有符合 FIPS 规范的 S3 端点的 AWS:符合 FIPS 规范的 S3 端点的主机名。您还必须启用 S3EnableVirtualAddressing。

  • 本地/Pure:Pure Storage 服务器的 IP 地址。

如果未设置,Vertica 将使用虚拟托管的请求 URL。

默认值: “s3.amazonaws.com”

AWSLogLevel
日志级别,为以下之一:OFF、FATAL、ERROR、WARN、INFO、DEBUG 或 TRACE。

默认值: ERROR

AWSRegion
包含要从中读取文件的 S3 存储桶的 AWS 区域。此参数一次只能配置一个区域。未能设置正确的区域可能会导致在查询失败之前遇到延迟。

默认值: “us-east-1”

AWSSessionToken
通过运行 get-session-token 命令生成的临时安全令牌,用于配置多重身份验证。
AWSStreamingConnectionPercentage
在 Eon 模式下,用于流式读取的公共存储连接数。在云环境中,此设置有助于防止流式数据传输耗尽所有可用的文件句柄。使用本地对象存储时不需要此设置,因为其延迟较低。
S3BucketConfig
指定每个存储桶配置的 JSON 对象。除了存储桶名称之外的每个属性都有一个相应的配置参数。如果同时设置了数据库级别参数及其在 S3BucketConfig 中的等效项,则 S3BucketConfig 中的值优先。

属性:

  • bucket:存储桶名称

  • region (AWSRegion)

  • protocol:架构,httphttps 之一;覆盖 AWSEnableHttps

  • endpoint (AWSEndpoint)

  • enableVirtualAddressing:布尔值,是否重写 S3 URL 以使用虚拟托管路径 (S3BucketCredentials)

  • requesterPays (S3RequesterPays)

  • serverSideEncryption (S3ServerSideEncryption)

  • sseCustomerAlgorithm (S3SseCustomerAlgorithm)

  • sseCustomerKey (S3SseCustomerKey)

  • sseKmsKeyId (S3SseKmsKeyId)

S3BucketCredentials
指定每个存储桶凭据的 JSON 对象。除了存储桶名称之外的每个属性都有一个相应的配置参数。如果同时设置了数据库级参数及其在 S3BucketCredentials 中的等效项,则 S3BucketCredentials 中的值优先。

属性:

  • bucket:存储桶名称

  • accessKey:存储桶的访问密钥(AWSAuth 中的 ID

  • secretAccessKey:存储桶的私密访问密钥(AWSAuth 中的 secret

  • sessionToken:会话令牌,仅在会话级别设置 S3BucketCredentials 时使用 (AWSSessionToken)

此参数仅对超级用户可见。用户可以使用 ALTER SESSION 在会话级别设置此参数。

S3EnableVirtualAddressing
布尔值,是否重写 S3 URL 以使用虚拟托管路径(默认禁用)。此配置设置仅在您为 AWSEndpoint 指定值时生效。

如果您将 AWSEndpoint 设置为符合 FIPS 规范的 S3 端点,则必须启用 S3EnableVirtualAddressing。

此参数的值不会影响指定 S3 路径的方式。

S3RequesterPays
布尔值,请求者(而不是存储桶所有者)是否支付访问存储桶上的数据的费用。
S3ServerSideEncryption
字符串,读取或写入 S3 时使用的加密算法。支持的值为 AES256(对于 SSE-S3)、aws:kms(对于 SSE-KMS)和空字符串(对于不加密)。请参阅服务器端加密

默认值: ""(无加密)

S3SseCustomerAlgorithm
字符串,使用 SSE-C 加密读取或写入 S3 时使用的加密算法。支持的值仅包括 AES256""。对于 SSE-S3 和 SSE-KMS,请改用 S3ServerSideEncryption。

默认值: ""(无加密)

S3SseCustomerKey
如果使用 SSE-C 加密,则为 S3 访问的客户端密钥。
S3SseKmsKeyId
如果使用 SSE-KMS 加密,则将密钥标识符(不是密钥)传递给密钥管理服务。Vertica 必须有权使用通过 KMS 管理的密钥。

服务器端加密

默认情况下,Vertica 读取和写入未加密的 S3 数据。如果 S3 存储桶使用服务器端加密 (SSE),您可以配置 Vertica 来对其进行访问。S3 支持三种类型的服务器端加密:SSE-S3、SSE-KMS 和 SSE-C。

Vertica 还必须对存储桶具有读取或写入权限(取决于操作)。

SSE-S3

对于 SSE-S3,由 S3 服务管理加密密钥。读取不需要额外的配置。要写入 S3,客户端(在本例中为 Vertica)必须只指定加密算法。

如果 S3 存储桶配置了默认加密设置,Vertica 无需进一步更改即可对其读取和写入数据。如果存储桶不使用默认加密设置,请将 S3ServerSideEncryption 配置参数或 S3BucketConfig 中的 serverSideEncryption 字段设置为 AES256

SSE-KMS

对于 SSE-KMS,加密密钥由密钥管理服务 (KMS) 管理。客户端在写入数据时必须提供 KMS 密钥标识符(不是实际密钥)。对于所有操作,客户端必须有权使用 KMS 密钥。这些权限在 KMS 中进行管理,而不是在 Vertica 中。

要使用 SSE-KMS:

  • 将 S3ServerSideEncryption 配置参数或 S3BucketConfig 中的 serverSideEncryption 字段设置为 aws:kms

  • 将 S3SseKmsKeyId 配置参数或 S3BucketConfig 中的 sseKmsKeyId 字段设置为密钥 ID。

SSE-C

对于 SSE-C,由客户端管理加密密钥并将其提供给 S3 以进行每个操作。

要使用 SSE-C:

  • 将 S3SseCustomerAlgorithm 配置参数或 S3BucketConfig 中的 sseCustomerAlgorithm 字段设置为 AES256

  • 将 S3SseCustomerKey 配置参数或 S3BucketConfig 中的 sseCustomerKey 字段设置为访问密钥。该值可以是 32 个字符的纯文本密钥或 44 个字符的 base64 编码密钥。

示例

以下示例设置数据库范围的 AWS 区域和凭据:

=> ALTER DATABASE DEFAULT SET AWSRegion='us-west-1';
=> ALTER DATABASE DEFAULT SET AWSAuth = 'myaccesskeyid123456:mysecretaccesskey123456789012345678901234';

以下示例从 S3 加载数据。如果可以同时加载 glob 中的所有文件,则可以使用 glob。在以下示例中,AWS_DataLake 仅包含 ORC 文件。

=> COPY t FROM 's3://datalake/*' ORC;

您可以指定逗号分隔的 S3 存储桶列表,如下例所示。所有存储桶必须位于同一区域。要从多个区域加载,请使用单独的 COPY 语句并在调用之间更改 AWSRegion 的值。

=> COPY t FROM 's3://AWS_Data_1/sales.parquet', 's3://AWS_Data_2/sales.parquet' PARQUET;

以下示例创建用户存储位置和角色,以便没有自己的 S3 凭据的用户可以使用服务器凭据从 S3 中读取数据。

   --- 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;

给定存储桶的配置属性可能因其类型而异。以下 S3BucketConfig 设置适用于 AWS 存储桶 (AWSBucket) 和 Pure Storage 存储桶 (PureStorageBucket)。 AWSBucket 没有指定端点,因此 Vertica 使用 AWSEndpoint 配置参数,其默认为 s3.amazonaws.com

=> ALTER DATABASE DEFAULT SET S3BucketConfig=
'[
    {
        "bucket": "AWSBucket",
        "region": "us-east-2",
        "protocol": "https",
        "requesterPays": true,
        "serverSideEncryption": "aes256"
    },
    {
        "bucket": "PureStorageBucket",
        "endpoint": "pure.mycorp.net:1234",
        "protocol": "http",
        "enableVirtualAddressing": false
    }
]';

以下示例为这两个存储桶设置 S3BucketCredentials:

=> ALTER SESSION SET S3BucketCredentials='
[
    {
        "bucket": "AWSBucket",
        "accessKey": "<AK0>",
        "secretAccessKey": "<SAK0>",
        "sessionToken": "1234567890"
    },
    {
        "bucket": "PureStorageBucket",
        "accessKey": "<AK1>",
        "secretAccessKey": "<SAK1>"
    }
]';

以下示例设置 STS 临时会话令牌。Vertica 使用会话令牌通过指定凭据访问 S3,并绕过对 USER 存储位置的检查。

$ aws sts get-session-token
  {
    "Credentials": {
        "AccessKeyId": "ASIAJZQNDVS727EHDHOQ",
        "SecretAccessKey": "F+xnpkHbst6UPorlLGj/ilJhO5J2n3Yo7Mp4vYvd",
        "SessionToken": "FQoDYXdzEKv//////////wEaDMWKxakEkCyuDH0UjyKsAe6/3REgW5VbWtpuYyVvSnEK1jzGPHi/jPOPNT7Kd+ftSnD3qdaQ7j28SUW9YYbD50lcXikz/HPlusPuX9sAJJb7w5oiwdg+ZasIS/+ejFgCzLeNE3kDAzLxKKsunvwuo7EhTTyqmlLkLtIWu9zFykzrR+3Tl76X7EUMOaoL31HOYsVEL5d9I9KInF0gE12ZB1yN16MsQVxpSCavOFHQsj/05zbxOQ4o0erY1gU=",
        "Expiration": "2018-07-18T05:56:33Z"
    }
  }

$ vsql
=> ALTER SESSION SET AWSAuth = 'ASIAJZQNDVS727EHDHOQ:F+xnpkHbst6UPorlLGj/ilJhO5J2n3Yo7Mp4vYvd';
=> ALTER SESSION SET AWSSessionToken = 'FQoDYXdzEKv//////////wEaDMWKxakEkCyuDH0UjyKsAe6/3REgW5VbWtpuYyVvSnEK1jzGPHi/jPOPNT7Kd+ftSnD3qdaQ7j28SUW9YYbD50lcXikz/HPlusPuX9sAJJb7w5oiwdg+ZasIS/+ejFgCzLeNE3kDAzLxKKsunvwuo7EhTTyqmlLkLtIWu9zFykzrR+3Tl76X7EUMOaoL31HOYsVEL5d9I9KInF0gE12ZB1yN16MsQVxpSCavOFHQsj/05zbxOQ4o0erY1gU=';

另请参阅

每个存储桶 S3 配置

4.1 - 每个存储桶 S3 配置

您可以使用 S3BucketConfig 和 S3BucketCredentials 配置参数管理各个存储桶的配置和凭据。这些参数均采用 JSON 对象,其各自属性的行为类似于相关的 S3 配置参数。

例如,您可以通过在数据库级别使用 ALTER DATABASE 设置 S3BucketConfig 来为每个 S3 存储桶创建不同的配置。以下 S3BucketConfig 指定了几个常见的存储桶属性:

=> ALTER DATABASE DEFAULT SET S3BucketConfig='
[
    {
        "bucket": "exampleAWS",
        "region": "us-east-2",
        "protocol": "https",
        "requesterPays": true
    },
    {
        "bucket": "examplePureStorage",
        "endpoint": "pure.mycorp.net:1234",
        "protocol": "http",
        "enableVirtualAddressing": false
    }
]';

然后,用户可以通过在会话级别使用 ALTER SESSION 设置 S3BucketCredentials 来访问存储桶。以下 S3BucketCredentials 指定所有属性并同时对 exampleAWSexamplePureStorage 进行身份验证:

=> ALTER SESSION SET S3BucketCredentials='
[
    {
        "bucket": "exampleAWS",
        "accessKey": "<AK0>",
        "secretAccessKey": "<SAK0>",
        "sessionToken": "1234567890"
    },
    {
        "bucket": "examplePureStorage",
        "accessKey": "<AK1>",
        "secretAccessKey": "<SAK1>",
    }
]';

推荐用法

推荐用法如下:

  • 在您的 S3 存储系统中为每个主体、每个存储系统定义一组凭据。

  • 通常最方便的做法是在数据库级别设置一次 S3BucketConfig,并通过在会话级别设置 S3BucketCredentials 来对用户进行身份验证。

  • 要访问在数据库级别配置的存储桶之外的存储桶,请在会话级别设置 S3BucketConfig 和 S3BucketCredentials。

如果您无法为 S3 存储定义凭据,您可以使用 ALTER DATABASE 在数据库级别设置 S3BucketCredentials 或 AWSAuth,但这有一些缺点:

  • 将凭据静态存储在另一个位置(在这种情况下,在 Vertica 编录中)总是会带来其他风险。

  • 这增加了 dbadmin 的开销,他们需要创建用户存储位置并向每个用户或角色授予访问权限。

  • 用户共享一组凭据,如果凭据泄露,则会增加潜在影响。

每个存储桶和标准参数的优先级

Vertica 使用以下规则来确定 S3 连接的有效属性集:

  • 如果设置,则 S3BucketCredentials 将优先于其标准参数。S3BucketCredentials 首先在会话级别检查,然后在数据库级别检查。

  • S3 凭据参数的级别/来源决定了 S3 配置参数的来源:

    • 如果凭据来自会话级别,则配置可以来自会话级别或数据库级别(会话级别优先)。

    • 如果您的凭据来自数据库级别,那么配置只能来自数据库级别。

  • 如果设置了 S3BucketConfig,它将优先于其标准参数。如果未指定 S3BucketConfig 属性,则 Vertica 将回退到缺失属性的等效参数。例如,如果 S3BucketConfig 指定除 protocol 之外的所有属性,则 Vertica 将回退到标准参数 AWSEnableHttps

示例

多个存储桶

此示例使用 S3BucketConfig 配置一个实际的 Amazon S3 存储桶 AWSBucket 和一个 Pure Storage 存储桶 PureStorageBucket

AWSBucket 没有指定 endpoint 或协议,因此 Vertica 回退到 AWSEndpoint(默认为 s3.amazonaws.com)和 AWSEnableHttps(默认为 1)。

在此示例环境中,对 PureStorageBucket 的访问是通过安全网络进行的,因此 HTTPS 被禁用:

=> ALTER DATABASE DEFAULT SET S3BucketConfig='
[
    {
        "bucket": "AWSBucket",
        "region": "us-east-2"
    },
    {
        "bucket": "PureStorageBucket",
        "endpoint": "pure.mycorp.net:1234",
        "protocol": "http",
        "enableVirtualAddressing": false
    }
]';

然后 Bob 可以在会话级别设置 S3BucketCredentials 以向 AWSBucket 进行身份验证:

=> ALTER SESSION SET S3BucketCredentials='
[
    {
        "bucket": "AWSBucket",
        "accessKey": "<AK0>",
        "secretAccessKey": "<SAK0>",
        "sessionToken": "1234567890"
    }
]';

同样,Alice 可以向 PureStorageBucket 进行身份验证:

=> ALTER SESSION SET S3BucketCredentials='
[
    {
        "bucket": "PureStorageBucket",
        "accessKey": "<AK1>",
        "secretAccessKey": "<SAK1>"
    }
]';

Charlie 提供 AWSBucketPureStorageBucket 的凭据,并同时对其进行身份验证。这允许他执行跨端点联接、从一个存储桶导出到另一个存储桶等。

=> ALTER SESSION SET S3BucketCredentials='
[
    {
        "bucket": "AWSBucket",
        "accessKey": "<AK0>",
        "secretAccessKey": "<SAK0>",
        "sessionToken": "1234567890"
    },
    {
        "bucket": "PureStorageBucket",
        "accessKey": "<AK1>",
        "secretAccessKey": "<SAK1>"
    }
]';

S3 服务器端加密

S3 具有三种类型的服务器端加密:SSE-S3、SSE-KMS 和 SSE-C。以下示例使用 SSE-KMS 配置访问:

=> ALTER DATABASE DEFAULT SET S3BucketConfig='
[
    {
        "bucket": "AWSBucket",
        "region": "us-east-2",
        "serverSideEncryption": "aws:kms",
        "sseKmsKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
    }
]';

有关详细信息,请参阅服务器端加密

具有 AWSEndpoint 和 S3BucketConfig 的非 Amazon S3 存储

如果 AWSEndpoint 设置为 Pure Storage 或 MinIO 之类的非 Amazon S3 存储桶,并且您想要为实际的 Amazon S3 存储桶配置 S3BucketConfig,则适用以下要求:

  • 如果您实际的 Amazon S3 区域不是 us-east-1(默认值),则必须指定 region

  • endpoint 设置为空字符串 ("")。

在此示例中,AWSEndpoint 设置为 Pure Storage 存储桶。

=> ALTER DATABASE DEFAULT SET AWSEndpoint='pure.mycorp.net:1234';

要为区域“us-east-2”中的实际 Amazon S3 存储桶 realAmazonS3Bucket 配置 S3BucketConfig:

=> ALTER DATABASE DEFAULT SET S3BucketConfig='
[
    {
        "bucket": "realAmazonS3Bucket",
        "region": "us-east-2",
        "endpoint": ""
    },
]';