使用 MinIO 进行共享数据
本主题介绍如何部署和使用共享数据 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 集群的查询性能与 Shared-Nothing StarRocks 集群的查询性能一致。
在 3.1 及更高版本中,StarRocks 共享数据集群由前端引擎(FE)和计算节点(CN)组成。CN 代替了共享数据集群中的经典后端引擎(BE)。
与经典的共享存储 StarRocks 架构相比,存储和计算分离提供了广泛的优势。通过分离这些组件,StarRocks 提供了
- 经济高效且无缝可扩展的存储。
- 弹性可扩展的计算。由于数据不存储在计算节点(CN)中,因此无需跨节点进行数据迁移或混洗即可进行扩展。
- 用于热数据的本地磁盘缓存,以提高查询性能。
- 异步数据摄取到对象存储,从而显着提高加载性能。
架构

部署共享数据 StarRocks 集群
共享数据 StarRocks 集群的部署与 Shared-Nothing StarRocks 集群的部署类似。唯一的区别是,在共享数据集群中,您需要部署 CN 而不是 BE。本节仅列出了您在部署共享数据 StarRocks 集群时需要在 FE 和 CN 的配置文件 fe.conf 和 cn.conf 中添加的额外 FE 和 CN 配置项。有关部署 StarRocks 集群的详细说明,请参阅部署 StarRocks。
注意
在本文档的下一节中配置为共享存储之前,请勿启动集群。
配置共享数据 StarRocks 的 FE 节点
在启动 FE 之前,请在 FE 配置文件 fe.conf 中添加以下配置项。
MinIO 的 FE 配置示例
以下是您在每个 FE 节点的 fe.conf 文件中添加的共享数据示例。这些参数使用前缀 aws_s3。
run_mode = shared_data
cloud_native_meta_port = <meta_port>
cloud_native_storage_type = S3
# Example: testbucket/subpath
aws_s3_path = <s3_path>
# Example: us-east1
aws_s3_region = <region>
# Example: http://172.26.xx.xxx:39000
aws_s3_endpoint = <endpoint_url>
aws_s3_access_key = <minio_access_key>
aws_s3_secret_key = <minio_secret_key>
与 MinIO 共享存储相关的所有 FE 参数
run_mode
StarRocks 集群的运行模式。有效值
shared_datashared_nothing(默认)
注意
- 您不能同时为 StarRocks 集群采用
shared_data和shared_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(默认)AZBLOBHDFS
注意
- 如果您将此参数指定为
S3,则必须添加以aws_s3为前缀的参数。- 如果您将此参数指定为
AZBLOB,则必须添加以azure_blob为前缀的参数。- 如果您将此参数指定为
HDFS,则必须添加参数cloud_native_hdfs_url。
aws_s3_path
用于存储数据的 S3 路径。它由您的 S3 存储桶的名称以及其下的子路径(如果有)组成,例如 testbucket/subpath。
aws_s3_endpoint
用于访问您的 S3 bucket 的端点,例如,https://s3.us-west-2.amazonaws.com。
aws_s3_region
您的 S3 存储桶所在的区域,例如 us-west-2。
aws_s3_use_aws_sdk_default_behavior
是否使用 AWS SDK 默认凭据提供程序链。有效值
truefalse(默认)
aws_s3_use_instance_profile
是否使用实例配置文件和承担角色作为访问 S3 的凭据方法。有效值
truefalse(默认)
如果您使用基于 IAM 用户的凭证(Access Key 和 Secret Key)访问 S3,则必须将此项指定为 false,并指定 aws_s3_access_key 和 aws_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),则必须先定义一个默认存储卷,然后才能在该集群中创建数据库和表。
以下示例为 MinIO bucket defaultbucket 创建一个存储卷 def_volume,其中包含 Access Key 和 Secret Key 凭据,启用分区前缀功能,并将其设置为默认存储卷
CREATE STORAGE VOLUME def_volume
TYPE = S3
LOCATIONS = ("s3://defaultbucket")
PROPERTIES
(
"enabled" = "true",
"aws.s3.region" = "us-west-2",
"aws.s3.endpoint" = "https://hostname.domainname.com:portnumber",
"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 VOLUME 和 SET 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 不会将其加载到缓存中。此属性是一个字符串值,可以使用以下单位指定:YEAR、MONTH、DAY 和 HOUR,例如,7 DAY 和 12 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 集群中表的 Type 为 CLOUD_NATIVE。在字段 StoragePath 中,StarRocks 返回表存储的对象存储目录。
将数据加载到共享数据 StarRocks 集群中
共享数据 StarRocks 集群支持 StarRocks 提供的所有加载方法。有关更多信息,请参阅 加载选项。
在共享数据 StarRocks 集群中查询
共享数据 StarRocks 集群中的表支持 StarRocks 提供的所有类型的查询。有关更多信息,请参阅 StarRocks SELECT。
注意
共享数据 StarRocks 集群从 v3.4.0 开始支持 同步物化视图。