跳到主要内容
版本: 最新版本-3.5

使用 S3 进行共享数据

本主题介绍如何部署和使用共享数据 StarRocks 集群。此功能从 v3.0 开始支持 S3 兼容存储,v3.1 支持 Azure Blob Storage,v3.4.1 支持 Azure Data Lake Storage Gen2。

注意

  • StarRocks 3.1 版本对共享数据部署和配置进行了一些更改。如果您运行的是 3.1 或更高版本,请使用本文档。
  • 如果您运行的是 3.0 版本,请使用 3.0 文档
  • 共享数据 StarRocks 集群不支持数据 BACKUP 和 RESTORE。

共享数据 StarRocks 集群专门为云环境设计,基于存储和计算分离的架构。它允许将数据存储在对象存储中(例如,AWS S3、Google GCS、Azure Blob Storage、Azure Data Lake Storage Gen2 和 MinIO)。您不仅可以实现更便宜的存储和更好的资源隔离,还可以实现集群的弹性扩展。当本地磁盘缓存命中时,共享数据 StarRocks 集群的查询性能与共享存储 StarRocks 集群的查询性能一致。

在 3.1 及更高版本中,StarRocks 共享数据集群由前端引擎(FE)和计算节点(CN)组成。CN 代替了共享数据集群中的经典后端引擎(BE)。

与经典的共享存储 StarRocks 架构相比,存储和计算分离提供了广泛的优势。通过分离这些组件,StarRocks 提供了

  • 经济高效且无缝可扩展的存储。
  • 弹性可扩展的计算。由于数据不存储在计算节点(CN)中,因此无需跨节点进行数据迁移或混洗即可进行扩展。
  • 用于热数据的本地磁盘缓存,以提高查询性能。
  • 异步数据摄取到对象存储,从而显着提高加载性能。

架构

Shared-data Architecture

部署共享数据 StarRocks 集群

共享数据 StarRocks 集群的部署与共享存储 StarRocks 集群的部署类似。唯一的区别是,在共享数据集群中,您需要部署 CN 而不是 BE。本节仅列出在部署共享数据 StarRocks 集群时需要在 FE 和 CN 的配置文件 fe.confcn.conf 中添加的额外 FE 和 CN 配置项。有关部署 StarRocks 集群的详细说明,请参阅部署 StarRocks

注意

在本文档的下一节中配置为共享存储之前,请勿启动集群。

为共享数据 StarRocks 配置 FE 节点

在启动集群之前,请配置 FE 和 CN。下面提供了示例配置,然后提供了每个参数的详细信息。

S3 的 FE 示例配置

这些是您在每个 FE 节点上的 fe.conf 文件中添加的共享数据的示例。这些示例因使用的 AWS 身份验证方法而异。

默认身份验证凭据

run_mode = shared_data
cloud_native_meta_port = <meta_port>
cloud_native_storage_type = S3

# For example, testbucket/subpath
aws_s3_path = <s3_path>

# For example, us-west-2
aws_s3_region = <region>

# For example, https://s3.us-west-2.amazonaws.com
aws_s3_endpoint = <endpoint_url>

aws_s3_use_aws_sdk_default_behavior = true

# Set this to false if you do not want default
# storage created in the object storage using
# the details provided above
enable_load_volume_from_conf = true

基于 IAM 用户的凭据

run_mode = shared_data
cloud_native_meta_port = <meta_port>
cloud_native_storage_type = S3

# For example, testbucket/subpath
aws_s3_path = <s3_path>

# For example, us-west-2
aws_s3_region = <region>

# credentials for S3 object read/write
aws_s3_access_key = <access_key>
aws_s3_secret_key = <secret_key>

# Set this to false if you do not want default
# storage created in the object storage using
# the details provided above
enable_load_volume_from_conf = true

实例配置文件

run_mode = shared_data
cloud_native_meta_port = <meta_port>
cloud_native_storage_type = S3

# For example, testbucket/subpath
aws_s3_path = <s3_path>

# For example, us-west-2
aws_s3_region = <region>

# For example, https://s3.us-west-2.amazonaws.com
aws_s3_endpoint = <endpoint_url>

aws_s3_use_instance_profile = true

# Set this to false if you do not want default
# storage created in the object storage using
# the details provided above
enable_load_volume_from_conf = true
注意

请确保您已授予集群中 FE 和 CN 节点的访问权限。 FE 节点不能委托对 CN 节点的访问。

扮演角色

run_mode = shared_data
cloud_native_meta_port = <meta_port>
cloud_native_storage_type = S3

# For example, testbucket/subpath
aws_s3_path = <s3_path>

# For example, us-west-2
aws_s3_region = <region>

# For example, https://s3.us-west-2.amazonaws.com
aws_s3_endpoint = <endpoint_url>

aws_s3_use_instance_profile = true
aws_s3_iam_role_arn = <role_arn>

# Set this to false if you do not want default
# storage created in the object storage using
# the details provided above
enable_load_volume_from_conf = true
注意

请确保您已授予集群中 FE 和 CN 节点的访问权限。 FE 节点不能委托对 CN 节点的访问。

从外部帐户扮演角色

run_mode = shared_data
cloud_native_meta_port = <meta_port>
cloud_native_storage_type = S3

# For example, testbucket/subpath
aws_s3_path = <s3_path>

# For example, us-west-2
aws_s3_region = <region>

# For example, https://s3.us-west-2.amazonaws.com
aws_s3_endpoint = <endpoint_url>

aws_s3_use_instance_profile = true
aws_s3_iam_role_arn = <role_arn>
aws_s3_external_id = <external_id>

# Set this to false if you do not want default
# storage created in the object storage using
# the details provided above
enable_load_volume_from_conf = true
注意

请确保您已授予集群中 FE 和 CN 节点的访问权限。 FE 节点不能委托对 CN 节点的访问。

run_mode

StarRocks 集群的运行模式。有效值

  • shared_data
  • shared_nothing (默认)

注意

  • 您不能同时为 StarRocks 集群采用 shared_datashared_nothing 模式。不支持混合部署。
  • 部署集群后,请勿更改 run_mode。否则,集群将无法重新启动。不支持从共享存储集群转换为共享数据集群,反之亦然。

cloud_native_meta_port

云原生元服务 RPC 端口。

  • 默认值:6090

enable_load_volume_from_conf

是否允许 StarRocks 使用 FE 配置文件中指定的对象存储相关属性创建默认存储卷。有效值

  • true 如果您在创建新的共享数据集群时将此项指定为 true,则 StarRocks 会使用 FE 配置文件中的对象存储相关属性创建内置存储卷 builtin_storage_volume,并将其设置为默认存储卷。但是,如果您未指定对象存储相关属性,则 StarRocks 无法启动。
  • false(默认)如果您在创建新的共享数据集群时将此项指定为 false,则 StarRocks 将直接启动而不创建内置存储卷。您必须手动创建一个存储卷并将其设置为默认存储卷,然后才能在 StarRocks 中创建任何对象。有关更多信息,请参阅创建默认存储卷

从 v3.1.0 开始支持。

注意

强烈建议您在将现有共享数据集群从 v3.0 升级时将此项保留为 true。如果您将此项指定为 false,则您在升级之前创建的数据库和表将变为只读,并且您无法将数据加载到其中。

cloud_native_storage_type

您使用的对象存储的类型。在共享数据模式下,StarRocks 支持将数据存储在 Azure Blob 中(从 v3.1.1 开始支持)以及与 S3 协议兼容的对象存储(例如 AWS S3、Google GCP 和 MinIO)。有效值

  • S3 (默认)
  • AZBLOB
  • HDFS

注意

  • 如果您将此参数指定为 S3,则必须添加以 aws_s3 为前缀的参数。
  • 如果您将此参数指定为 AZBLOB,则必须添加以 azure_blob 为前缀的参数。
  • 如果您将此参数指定为 HDFS,则必须添加参数 cloud_native_hdfs_url

aws_s3_path

用于存储数据的 S3 路径。它由您的 S3 存储桶的名称以及其下的子路径(如果有)组成,例如 testbucket/subpath

aws_s3_endpoint

用于访问您的 S3 存储桶的端点,例如 https://s3.us-west-2.amazonaws.com

aws_s3_region

您的 S3 存储桶所在的区域,例如 us-west-2

aws_s3_use_aws_sdk_default_behavior

是否使用 AWS SDK 默认凭据提供程序链。有效值

  • true
  • false(默认)

aws_s3_use_instance_profile

是否使用实例配置文件和扮演角色作为访问 S3 的凭据方法。有效值

  • true
  • false(默认)

如果您使用基于 IAM 用户的凭证(Access Key 和 Secret Key)访问 S3,则必须将此项指定为 false,并指定 aws_s3_access_keyaws_s3_secret_key

如果您使用 Instance Profile 访问 S3,则必须将此项指定为 true

如果您使用 Assumed Role 访问 S3,则必须将此项指定为 true,并指定 aws_s3_iam_role_arn

如果您使用外部 AWS 账户,您还必须指定 aws_s3_external_id

aws_s3_access_key

用于访问您的 S3 存储桶的访问密钥 ID。

aws_s3_secret_key

用于访问您的 S3 存储桶的秘密访问密钥。

aws_s3_iam_role_arn

在其中存储数据文件的 S3 存储桶上具有权限的 IAM 角色的 ARN。

aws_s3_external_id

用于跨帐户访问您的 S3 存储桶的 AWS 帐户的外部 ID。

注意

创建共享数据 StarRocks 集群后,只能修改与凭据相关的配置项。如果您更改了原始的存储路径相关配置项,则您在更改之前创建的数据库和表将变为只读,并且您无法将数据加载到其中。

如果您想在集群创建后手动创建默认存储卷,则只需添加以下配置项

run_mode = shared_data
cloud_native_meta_port = <meta_port>

为共享数据 StarRocks 配置 CN 节点

在启动 CN 之前,请在 CN 配置文件 cn.conf 中添加以下配置项

starlet_port = <starlet_port>
storage_root_path = <storage_root_path>

starlet_port

StarRocks 共享数据集群的 CN 心跳服务端口。默认值:9070

storage_root_path

本地缓存数据所依赖的存储卷目录。多个卷用分号 (;) 分隔。示例:/data1;/data2

storage_root_path 的默认值为 ${STARROCKS_HOME}/storage

当查询频繁且查询的数据是最近的数据时,本地缓存有效,但在某些情况下,您可能希望完全关闭本地缓存。

  • 在 Kubernetes 环境中,CN pod 的数量可以按需向上和向下扩展,pod 可能没有附加存储卷。
  • 当查询的数据位于远程存储的数据湖中,并且大部分是归档(旧)数据时。如果查询不频繁,则数据缓存的命中率会很低,并且收益可能不值得拥有缓存。

要关闭数据缓存,请设置

storage_root_path =

注意

数据缓存在目录 <storage_root_path>/starlet_cache 下。

使用您的共享数据 StarRocks 集群

共享数据 StarRocks 集群的用法也类似于经典的共享存储 StarRocks 集群,不同之处在于共享数据集群使用存储卷和云原生表将数据存储在对象存储中。

创建默认存储卷

您可以使用 StarRocks 自动创建的内置存储卷,也可以手动创建和设置默认存储卷。本节介绍如何手动创建和设置默认存储卷。

注意

如果您的共享数据 StarRocks 集群是从 v3.0 升级的,则您不需要定义默认存储卷,因为 StarRocks 使用您在 FE 配置文件 fe.conf 中指定的对象存储相关属性创建了一个存储卷。您仍然可以使用其他对象存储资源创建新的存储卷,并以不同的方式设置默认存储卷。

要授予您的共享数据 StarRocks 集群在您的对象存储中存储数据的权限,您必须在创建数据库或云原生表时引用存储卷。存储卷由远程数据存储的属性和凭据信息组成。如果您已部署新的共享数据 StarRocks 集群,并且不允许 StarRocks 创建内置存储卷(通过将 enable_load_volume_from_conf 指定为 false),则您必须先定义一个默认存储卷,然后才能在集群中创建数据库和表。

以下示例为具有基于 IAM 用户的凭据(访问密钥和秘密密钥)的 AWS S3 存储桶 defaultbucket 创建一个存储卷 def_volume,启用 分区前缀 功能,并将其设置为默认存储卷

CREATE STORAGE VOLUME def_volume
TYPE = S3
LOCATIONS = ("s3://defaultbucket")
PROPERTIES
(
"enabled" = "true",
"aws.s3.region" = "us-west-2",
"aws.s3.endpoint" = "https://s3.us-west-2.amazonaws.com",
"aws.s3.use_aws_sdk_default_behavior" = "false",
"aws.s3.use_instance_profile" = "false",
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.enable_partitioned_prefix" = "true"
);

SET def_volume AS DEFAULT STORAGE VOLUME;

有关如何为其他对象存储创建存储卷和设置默认存储卷的更多信息,请参阅CREATE STORAGE VOLUMESET DEFAULT STORAGE VOLUME

创建数据库和云原生表

创建默认存储卷后,您可以使用此存储卷创建数据库和云原生表。

共享数据 StarRocks 集群支持所有 StarRocks 表类型

以下示例创建一个数据库 cloud_db 和一个基于 Duplicate Key 表类型的表 detail_demo,启用本地磁盘缓存,将热数据有效期设置为一个月,并禁用将数据异步摄取到对象存储中

CREATE DATABASE cloud_db;
USE cloud_db;
CREATE TABLE IF NOT EXISTS detail_demo (
recruit_date DATE NOT NULL COMMENT "YYYY-MM-DD",
region_num TINYINT COMMENT "range [-128, 127]",
num_plate SMALLINT COMMENT "range [-32768, 32767] ",
tel INT COMMENT "range [-2147483648, 2147483647]",
id BIGINT COMMENT "range [-2^63 + 1 ~ 2^63 - 1]",
password LARGEINT COMMENT "range [-2^127 + 1 ~ 2^127 - 1]",
name CHAR(20) NOT NULL COMMENT "range char(m),m in (1-255) ",
profile VARCHAR(500) NOT NULL COMMENT "upper limit value 65533 bytes",
ispass BOOLEAN COMMENT "true/false")
DUPLICATE KEY(recruit_date, region_num)
DISTRIBUTED BY HASH(recruit_date, region_num)
PROPERTIES (
"storage_volume" = "def_volume",
"datacache.enable" = "true",
"datacache.partition_duration" = "1 MONTH"
);

注意

如果在共享数据 StarRocks 集群中创建数据库或云原生表时未指定存储卷,则使用默认存储卷。

除了常规的表 PROPERTIES 之外,在为共享数据 StarRocks 集群创建表时,您还需要指定以下 PROPERTIES

datacache.enable

是否启用本地磁盘缓存。

  • true (默认) 当此属性设置为 true 时,要加载的数据会同时写入对象存储和本地磁盘(作为查询加速的缓存)。
  • false 当此属性设置为 false 时,数据仅加载到对象存储中。

注意

在 3.0 版本中,此属性名为 enable_storage_cache

要启用本地磁盘缓存,您必须在 CN 配置项 storage_root_path 中指定磁盘的目录。

datacache.partition_duration

热数据的有效期。启用本地磁盘缓存后,所有数据都将加载到缓存中。当缓存已满时,StarRocks 会从缓存中删除最近较少使用的数据。当查询需要扫描已删除的数据时,StarRocks 会检查数据是否在从当前时间开始的有效期内。如果数据在有效期内,则 StarRocks 会再次将数据加载到缓存中。如果数据不在有效期内,则 StarRocks 不会将其加载到缓存中。此属性是一个字符串值,可以使用以下单位指定:YEARMONTHDAYHOUR,例如 7 DAY12 HOUR。如果未指定,则所有数据都将缓存为热数据。

注意

在 3.0 版本中,此属性名为 storage_cache_ttl

仅当 datacache.enable 设置为 true 时,此属性才可用。

查看表信息

您可以使用 SHOW PROC "/dbs/<db_id>" 查看特定数据库中的表信息。有关更多信息,请参阅 SHOW PROC

示例

mysql> SHOW PROC "/dbs/xxxxx";
+---------+-------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+------------------------------+
| TableId | TableName | IndexNum | PartitionColumnName | PartitionNum | State | Type | LastConsistencyCheckTime | ReplicaCount | PartitionType | StoragePath |
+---------+-------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+------------------------------+
| 12003 | detail_demo | 1 | NULL | 1 | NORMAL | CLOUD_NATIVE | NULL | 8 | UNPARTITIONED | s3://xxxxxxxxxxxxxx/1/12003/ |
+---------+-------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+------------------------------+

共享数据 StarRocks 集群中表的 TypeCLOUD_NATIVE。在字段 StoragePath 中,StarRocks 返回表存储的对象存储目录。

将数据加载到共享数据 StarRocks 集群中

共享数据 StarRocks 集群支持 StarRocks 提供的所有加载方法。有关更多信息,请参阅 加载选项

在共享数据 StarRocks 集群中查询

共享数据 StarRocks 集群中的表支持 StarRocks 提供的所有类型的查询。有关更多信息,请参阅 StarRocks SELECT

注意

共享数据 StarRocks 集群从 v3.4.0 开始支持 同步物化视图