存算分离
在 StarRocks 存算分离架构中,数据存储在成本更低且更可靠的远程存储系统中,例如 Amazon S3、Google Cloud Storage、Azure Blob Storage 以及其他支持 S3 协议的存储,如 MinIO。热数据会被缓存到本地,在查询命中缓存的前提下,存算分离集群的查询性能与存算一体集群相当。同时,在存算分离架构下,计算节点(CN)可以在几秒内根据需要实现扩缩容。因此,StarRocks 的存算分离架构不仅降低了存储成本,保证了资源隔离性能,还提供了计算资源的弹性和可扩展性。
本教程涵盖以下内容:
- 使用 Docker Compose 部署 StarRocks 存算分离集群以及 MinIO 作为对象存储。
- 导入数据集,并在导入过程中进行基本的数据转换。
- 查询分析数据。
本教程中使用的数据由 NYC OpenData 和 NOAA 的 National Centers for Environmental Information 提供。教程仅截取了数据集的部分字段。
前提条件
Docker
- 安装 Docker。
- 为 Docker 分配 4 GB RAM。
- 为 Docker 分配 10 GB 的空闲磁盘空间。
SQL 客户端
您可以使用 Docker 环境中提供的 MySQL Client,也可以使用其他兼容 MySQL 的客户端,包括本教程中涉及的 DBeaver 和 MySQL Workbench。
curl
curl 命令用于向 StarRocks 中导入数据以及下载数据集。您可以通过在终端运行 curl 或 curl.exe 来检查您的操作系统是否已安装 curl。如果未安装 curl,请点击此处获取 curl。
术语
FE
FE 节点负责元数据管理、客户端连接管理、查询计划和查询调度。每个 FE 在其内存中存储和维护完整的元数据副本,确保每个 FE 都能提供无差别的服务。
CN
CN 节点在存算分离或存算一体集群中负责执行查询。
BE
BE 节点在存算一体集群中负责数据存储和执行查询。
当前教程不包含 BE 节点,以上内容仅供您了解 BE 和 CN 之间的区别。
启动 StarRocks
要基于对象存储部署 StarRocks 存算分离集群,您需要部署以下服务:
- 一个 FE 节点
- 一个 CN 节点
- 对象存储
本教程使用 MinIO 作为对象存储。
StarRocks 提供了一个 Docker Compose 文件,用于搭建包含以上三个必要容器的环境。
下载 Docker Compose 文件。
mkdir quickstart
cd quickstart
curl -O https://raw.githubusercontent.com/StarRocks/demo/master/documentation-samples/quickstart/docker-compose.yml
启动容器。
docker compose up -d
检查环境状态
成功启动后,FE 和 CN 节点大约需要 30 秒才能部署完成。需要通过 docker compose ps 命令检查服务的运行状态,直到 starrocks-fe 和 starrocks-cn 的状态变为 healthy。
docker compose ps
返回:
SERVICE CREATED STATUS PORTS
starrocks-cn 25 seconds ago Up 24 seconds (healthy) 0.0.0.0:8040->8040/tcp
starrocks-fe 25 seconds ago Up 24 seconds (healthy) 0.0.0.0:8030->8030/tcp, 0.0.0.0:9020->9020/tcp, 0.0.0.0:9030->9030/tcp
minio 25 seconds ago Up 24 seconds 0.0.0.0:9000-9001->9000-9001/tcp
以上返回不会显示 MinIO 容器的健康状态,您需要在下一步中通过使用 MinIO Web UI 验证其健康状态。
生成 MinIO 认证凭证
要访问 MinIO,您需要生成一个 访问密钥。
打开 MinIO Web UI
从浏览器进入 http://localhost:9001/access-keys。登录用的用户名和密码已经在 Docker Compose 文件中指定,分别为 miniouser 和 miniopassword。UI 中将显示存在一对访问密钥 AAAAAAAAAAAAAAAAAAAA,其密钥值已在 Docker Compose 文件中指定,为BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB。

如果 MinIO Web UI 中未显示访问密钥,你可以检查 minio_mc 服务的日志:
docker compose logs minio_mc
尝试重新运行 minio_mc Pod:
docker compose run minio_mc
SQL 客户端
当前教程可以使用以下三个客户端进行测试,您只需选择其中一个:
- MySQL CLI:您可以从 Docker 环境或您的本机运行此客户端。
- DBeaver(社区版或专业版)
- MySQL Workbench
配置客户端
- mysql CLI
- DBeaver
- MySQL Workbench
您可以从 StarRocks FE 节点容器 starrocks-fe 中直接运行 MySQL Client:
docker compose exec starrocks-fe \
mysql -P 9030 -h 127.0.0.1 -u root --prompt="StarRocks > "
所有 docker compose 命令必须从包含 docker-compose.yml 文件的目录中运行。
如果您需要安装 MySQL Client,请点击展开以下 安装 MySQL 客户端 部分:
安装 MySQL 客户端
- macOS:如果您使用 Homebrew 并且不需要安装 MySQL 服务器,请运行
brew install mysql-client@8.0安装 MySQL Client。 - Linux:请检查您的
mysql客户端的 Repository。例如,运行yum install mariadb。 - Microsoft Windows:安装 MySQL Community Server 后,运行提供的客户端,或在 WSL 中运行
mysql。
- 安装 DBeaver 并连接 StarRocks。

- 配置端口、IP 地址和用户名,并点击 Test Connection 测试连接。如果测试成功,请点击 Finish 完成配置。

- 安装 MySQL Workbench 并连接 StarRocks。
- 配置端口、IP 地址和用户名,并点击 Test Connection 测试连接。

- 在 Workbench 检查 MySQL 版本时,会弹出以下警告。您可以忽略这些警告,并选择不再提示:

下载数据
将教程所需的数据集下载到 FE 容器中。
在 容器中启动 Shell。
docker compose exec starrocks-fe bash
创建用于存放数据集文件的路径。
mkdir quickstart
cd quickstart
下载交通事故数据集。
curl -O https://raw.githubusercontent.com/StarRocks/demo/master/documentation-samples/quickstart/datasets/NYPD_Crash_Data.csv
下载天气数据集。
curl -O https://raw.githubusercontent.com/StarRocks/demo/master/documentation-samples/quickstart/datasets/72505394728.csv
配置 StarRocks 存算分离集群
启动 StarRocks 以及 MinIO 后,您需要连接并配置 StarRocks 存算分离集群。
使用 SQL 客户端连接到 StarRocks
-
如果您使用 StarRocks 容器中的 MySQL Client,需要从包含
docker-compose.yml文件的路径运行以下命令。docker compose exec starrocks-fe \
mysql -P9030 -h127.0.0.1 -uroot --prompt="StarRocks > " -
如果您使用其他客户端,请打开客户端并连接至 StarRocks。
创建存储卷
StarRocks 存算分离集群需要通过存储卷将数据持久化到对象存储中。
以下为创建存储卷时需要用到的信息:
- MinIO 服务器 URL 为
http://minio:9000。 - 集群中的数据将通过存储卷持久化在
starrocks存储桶中的shared的文件夹下。请注意,shared文件夹将在数据第一次导入集群 时自动创建。 - MinIO 服务器未使用 SSL。
- 连接 MinIO 需要 Access Key 和 Secret Key 即为 MinIO Web UI 中创建的访问密钥。
- 您需要将该存储卷设置为默认存储卷。
运行以下命令之前,您需要将 aws.s3.access_key 和 aws.s3.secret_key 配置项的值替换为您在 MinIO 中创建的 Access Key 和 Secret Key。
CREATE STORAGE VOLUME shared
TYPE = S3
LOCATIONS = ("s3://starrocks/shared/")
PROPERTIES
(
"enabled" = "true",
"aws.s3.endpoint" = "http://minio:9000",
"aws.s3.use_aws_sdk_default_behavior" = "false",
"aws.s3.enable_ssl" = "false",
"aws.s3.use_instance_profile" = "false",
"aws.s3.access_key" = "AAAAAAAAAAAAAAA",
"aws.s3.secret_key" = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
);
SET shared AS DEFAULT STORAGE VOLUME;
创建成功后,查看该存储卷。
DESC STORAGE VOLUME shared\G
\G 表示将查询结果按列打印。如果您的 SQL 客户端不支持垂直格式输出,则需要将 \G 替换为 ;。
返回:
*************************** 1. row ***************************
Name: shared
Type: S3
IsDefault: true
Location: s3://starrocks/shared/
Params: {"aws.s3.access_key":"******","aws.s3.secret_key":"******","aws.s3.endpoint":"http://minio:9000","aws.s3.region":"us-east-1","aws.s3.use_instance_profile":"false","aws.s3.use_aws_sdk_default_behavior":"false"}
Enabled: true
Comment:
1 row in set (0.03 sec)
建表
创建数据库
执行以下语句创建数据库 quickstart,并切换到该数据库下。
CREATE DATABASE IF NOT EXISTS quickstart;
USE quickstart;
建表
crashdata 表
创建 crashdata 表,用于存储交通事故数据集中的数据。该表的字段经过裁剪,仅包含与该教程相关字段。
CREATE TABLE IF NOT EXISTS crashdata (
CRASH_DATE DATETIME,
BOROUGH STRING,
ZIP_CODE STRING,
LATITUDE INT,
LONGITUDE INT,
LOCATION STRING,
ON_STREET_NAME STRING,
CROSS_STREET_NAME STRING,
OFF_STREET_NAME STRING,
CONTRIBUTING_FACTOR_VEHICLE_1 STRING,
CONTRIBUTING_FACTOR_VEHICLE_2 STRING,
COLLISION_ID INT,
VEHICLE_TYPE_CODE_1 STRING,
VEHICLE_TYPE_CODE_2 STRING
);