StarRocks × MinIO:打造灵活高效的存算分离方案

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: “存算分离”(Decoupled Storage and Compute)是一种在现代数据系统中被广泛采用的架构设计。它将计算和存储解耦,使二者可以独立扩展,提升资源利用率并降低运维成本。StarRocks 从 3.0 版本开始支持这一架构,允许用户将数据存储从计算节点中剥离,实现更灵活、弹性的系统部署。

StarRocks × MinIO:打造灵活高效的存算分离方案.png

“存算分离”(Decoupled Storage and Compute)是一种在现代数据系统中被广泛采用的架构设计。它将计算和存储解耦,使二者可以独立扩展,提升资源利用率并降低运维成本。StarRocks 从 3.0 版本开始支持这一架构,允许用户将数据存储从计算节点中剥离,实现更灵活、弹性的系统部署。

在这种架构中,计算层由数据库引擎负责,存储则交由对象存储系统承担。对象存储的实现方式有很多,包括各大公有云厂商提供的服务以及一些开源方案。我们在本文中选择 MinIO 作为示例,是因为它开源、高性能、支持 S3 协议,并且非常适合用于本地测试或私有部署。


MinIO 和 StarRocks 的组合正是存算分离架构的一个实践案例。MinIO 提供可靠的对象存储能力,StarRocks 专注于查询加速与计算优化,二者结合,在实时和离线分析场景下都能提供良好的性能表现与灵活性。


此外,两者都支持 Kubernetes 原生部署,可以轻松集成到现代云原生平台中。用户无需绑定特定云厂商,也可以通过简单的 YAML 文件,在本地或云上快速搭建和演进整个数据平台。这种部署模式对于开发测试、混合云、边缘计算等场景尤其友好。

下面我们将提供一份实践教程,介绍如何使用 MinIO 作为主存储,配合 StarRocks 构建起一套完整的数据分析环境。如需详细的配置说明,可参考文末链接至 StarRocks 官方文档。

存算分离架构的优势

在引入存算分离架构的同时,StarRocks 也提供了本地缓存机制,用于降低远程对象存储访问频次,从而提高数据读取性能,缓解网络瓶颈。整体优势包括:

  • 成本控制:计算和存储资源可独立扩展,按需配置,避免资源浪费;
  • 部署灵活:可根据业务场景自由组合不同的计算与存储系统;
  • 弹性扩展:适配动态负载需求,计算与存储节点可分别扩容;
  • 查询性能优化:结合本地缓存机制,提升对热点数据的访问效率;
  • 可维护性更高:工作负载可在不同资源池之间迁移,方便运维管理;
  • 资源隔离更清晰:适用于多租户、不同业务线的资源划分需求。

快速开始

接下来你将学到如何在 Docker 容器中运行 StarRocks 和 MinIO,配置 StarRocks 以使用共享存储,加载两个公开数据集,并使用 SQL 进行数据探索。

前置条件

你需要安装:

  • curl:用于下载 YAML 和数据文件;
  • Docker Compose:推荐直接安装 Docker Desktop,它包含了 Docker Engine 和 Compose;
  • 验证安装情况:
docker compose version
  • SQL 客户端:比如 DBeaverMySQL CLI

本教程中的 MySQL 实例可以通过 MySQL CLI 访问,因此不需要额外依赖。当然,你也可以下载 DBeaver 或 MySQL Workbench 来获得更好的使用体验。

开始使用

  1. 创建工作目录并下载 Docker Compose 文件:
mkdir sr-quickstart
cd sr-quickstart
curl -O https://raw.githubusercontent.com/StarRocks/demo/master/documentation-samples/quickstart/docker-compose.yml
  1. 使用以下命令让 Docker Compose 在后台启动 docker-compose.yml 文件中定义的所有容器:
docker compose up -d

MinIO 设置

你可以通过 MinIO 控制台或使用 mc 来操作 MinIO。以下截图和说明基于 MinIO 控制台。

打开浏览器访问:http://localhost:9001/access-keys。用户名和密码在 Docker Compose 文件中已配置,默认是 minioadmin:minioadmin

点击 “Create access key +”,然后点击 “Create”。

连接 SQL 客户端(以 DBeaver 为例)

你需要连接到一个 SQL 客户端来操作数据。你可以选择使用 DBeaver。在 DBeaver 中创建一个新的数据库连接,然后选择 MySQL 数据库驱动:

  • 端口:9030
  • 地址:localhost
  • 用户名:root

测试连接成功后点击 Finish。

或者你更习惯使用命令行,也可以在 starrocks-fe 容器中使用 MySQL CLI。要连接到 StarRocks,请进入包含 docker-compose.yml 的目录,并运行以下命令:

docker compose exec starrocks-fe \
mysql -P9030 -h127.0.0.1 -uroot --prompt="StarRocks > "

创建 Bucket

在你的 SQL 客户端中运行以下命令,确保使用你之前在 MinIO 控制台中创建的 Access Key 和 Secret:

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" = "{你的 Access Key}",
   "aws.s3.secret_key"= "{你的 Secret Key}"
);
SET shared AS DEFAULT STORAGE VOLUME;

访问 http://localhost:9001/buckets,确认名为 starrocks 的 bucket 是否已成功创建。

下载数据

在终端中运行以下命令,打开 starrocks-fe 容器中的 Bash shell,这样你就可以访问容器的文件系统并在其中执行命令:

docker compose exec starrocks-fe bash

运行以下命令,在容器内创建一个 quickstart 目录:

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

创建数据库与表

在使用 SQL 客户端连接到 StarRocks 的终端窗口中,看到 StarRocks > 提示符后,运行以下命令。

CREATE DATABASE IF NOT EXISTS quickstart;
USE quickstart;

你的终端应该类似如下所示:

StarRocks > CREATE DATABASE IF NOT EXISTS quickstart;
Query OK, 0 rows affected (0.02 sec)
StarRocks > USE quickstart;
Database changed
StarRocks >

在 SQL 客户端中创建表

返回 DBeaver 或你选择的其他 SQL 客户端,执行以下命令为数据创建表:

USE quickstart;
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
);
CREATE TABLE IF NOT EXISTS weatherdata (
   DATE DATETIME,
   NAME STRING,
   HourlyDewPointTemperature STRING,
   HourlyDryBulbTemperature STRING,
   HourlyPrecipitation STRING,
   HourlyPresentWeatherType STRING,
   HourlyPressureChange STRING,
   HourlyPressureTendency STRING,
   HourlyRelativeHumidity STRING,
   HourlySkyConditions STRING,
   HourlyVisibility STRING,
   HourlyWetBulbTemperature STRING,
   HourlyWindDirection STRING,
   HourlyWindGustSpeed STRING,
   HourlyWindSpeed STRING
);

加载数据

切换到你之前下载数据集的终端,在 starrocks-fe 容器中的 shell 中执行以下 curl 命令。当提示输入密码时,直接按回车键即可。

curl --location-trusted -u root             \
    -T ./NYPD_Crash_Data.csv                \
    -H "label:crashdata-0"                  \
    -H "column_separator:,"                 \
    -H "skip_header:1"                      \
    -H "enclose:\""                         \
    -H "max_filter_ratio:1"                 \
    -H "columns:tmp_CRASH_DATE, tmp_CRASH_TIME, CRASH_DATE=str_to_date(concat_ws(' ', tmp_CRASH_DATE, tmp_CRASH_TIME), '%m/%d/%Y %H:%i'),BOROUGH,ZIP_CODE,LATITUDE,LONGITUDE,LOCATION,ON_STREET_NAME,CROSS_STREET_NAME,OFF_STREET_NAME,NUMBER_OF_PERSONS_INJURED,NUMBER_OF_PERSONS_KILLED,NUMBER_OF_PEDESTRIANS_INJURED,NUMBER_OF_PEDESTRIANS_KILLED,NUMBER_OF_CYCLIST_INJURED,NUMBER_OF_CYCLIST_KILLED,NUMBER_OF_MOTORIST_INJURED,NUMBER_OF_MOTORIST_KILLED,CONTRIBUTING_FACTOR_VEHICLE_1,CONTRIBUTING_FACTOR_VEHICLE_2,CONTRIBUTING_FACTOR_VEHICLE_3,CONTRIBUTING_FACTOR_VEHICLE_4,CONTRIBUTING_FACTOR_VEHICLE_5,COLLISION_ID,VEHICLE_TYPE_CODE_1,VEHICLE_TYPE_CODE_2,VEHICLE_TYPE_CODE_3,VEHICLE_TYPE_CODE_4,VEHICLE_TYPE_CODE_5" \
    -XPUT http://localhost:8030/api/quickstart/crashdata/_stream_load
curl --location-trusted -u root             \
    -T ./72505394728.csv                    \
    -H "label:weather-0"                    \
    -H "column_separator:,"                 \
    -H "skip_header:1"                      \
    -H "enclose:\""                         \
    -H "max_filter_ratio:1"                 \
    -H "columns: STATION, DATE, LATITUDE, LONGITUDE, ELEVATION, NAME, REPORT_TYPE, SOURCE, HourlyAltimeterSetting, HourlyDewPointTemperature, HourlyDryBulbTemperature, HourlyPrecipitation, HourlyPresentWeatherType, HourlyPressureChange, HourlyPressureTendency, HourlyRelativeHumidity, HourlySkyConditions, HourlySeaLevelPressure, HourlyStationPressure, HourlyVisibility, HourlyWetBulbTemperature, HourlyWindDirection, HourlyWindGustSpeed, HourlyWindSpeed, Sunrise, Sunset, DailyAverageDewPointTemperature, DailyAverageDryBulbTemperature, DailyAverageRelativeHumidity, DailyAverageSeaLevelPressure, DailyAverageStationPressure, DailyAverageWetBulbTemperature, DailyAverageWindSpeed, DailyCoolingDegreeDays, DailyDepartureFromNormalAverageTemperature, DailyHeatingDegreeDays, DailyMaximumDryBulbTemperature, DailyMinimumDryBulbTemperature, DailyPeakWindDirection, DailyPeakWindSpeed, DailyPrecipitation, DailySnowDepth, DailySnowfall, DailySustainedWindDirection, DailySustainedWindSpeed, DailyWeather, MonthlyAverageRH, MonthlyDaysWithGT001Precip, MonthlyDaysWithGT010Precip, MonthlyDaysWithGT32Temp, MonthlyDaysWithGT90Temp, MonthlyDaysWithLT0Temp, MonthlyDaysWithLT32Temp, MonthlyDepartureFromNormalAverageTemperature, MonthlyDepartureFromNormalCoolingDegreeDays, MonthlyDepartureFromNormalHeatingDegreeDays, MonthlyDepartureFromNormalMaximumTemperature, MonthlyDepartureFromNormalMinimumTemperature, MonthlyDepartureFromNormalPrecipitation, MonthlyDewpointTemperature, MonthlyGreatestPrecip, MonthlyGreatestPrecipDate, MonthlyGreatestSnowDepth, MonthlyGreatestSnowDepthDate, MonthlyGreatestSnowfall, MonthlyGreatestSnowfallDate, MonthlyMaxSeaLevelPressureValue, MonthlyMaxSeaLevelPressureValueDate, MonthlyMaxSeaLevelPressureValueTime, MonthlyMaximumTemperature, MonthlyMeanTemperature, MonthlyMinSeaLevelPressureValue, MonthlyMinSeaLevelPressureValueDate, MonthlyMinSeaLevelPressureValueTime, MonthlyMinimumTemperature, MonthlySeaLevelPressure, MonthlyStationPressure, MonthlyTotalLiquidPrecipitation, MonthlyTotalSnowfall, MonthlyWetBulb, AWND, CDSD, CLDD, DSNW, HDSD, HTDD, NormalsCoolingDegreeDay, NormalsHeatingDegreeDay, ShortDurationEndDate005, ShortDurationEndDate010, ShortDurationEndDate015, ShortDurationEndDate020, ShortDurationEndDate030, ShortDurationEndDate045, ShortDurationEndDate060, ShortDurationEndDate080, ShortDurationEndDate100, ShortDurationEndDate120, ShortDurationEndDate150, ShortDurationEndDate180, ShortDurationPrecipitationValue005, ShortDurationPrecipitationValue010, ShortDurationPrecipitationValue015, ShortDurationPrecipitationValue020, ShortDurationPrecipitationValue030, ShortDurationPrecipitationValue045, ShortDurationPrecipitationValue060, ShortDurationPrecipitationValue080, ShortDurationPrecipitationValue100, ShortDurationPrecipitationValue120, ShortDurationPrecipitationValue150, ShortDurationPrecipitationValue180, REM, BackupDirection, BackupDistance, BackupDistanceUnit, BackupElements, BackupElevation, BackupEquipment, BackupLatitude, BackupLongitude, BackupName, WindEquipmentChangeDate" \
    -XPUT http://localhost:8030/api/quickstart/weatherdata/_stream_load

完成后,返回浏览器访问 http://localhost:9001,确认数据是否已成功上传到 MinIO。

查询数据

回到你的 SQL 客户端,我们来对刚才加载的数据运行一些查询。首先,我们通过查询来了解降水、交通事故与星期几/时间之间的关系:

SELECT COUNT(DISTINCT c.COLLISION_ID) AS Crashes,
       TRUNCATE(AVG(w.HourlyDryBulbTemperature), 1) AS Temp_F,
       MAX(w.HourlyPrecipitation) AS Precipitation,
       DATE_FORMAT(c.CRASH_DATE, '%d %b %Y %H:00') AS Hour
FROM crashdata c
LEFT JOIN weatherdata w
ON DATE_FORMAT(c.CRASH_DATE, '%Y-%m-%d %H:00:00') = DATE_FORMAT(w.DATE, '%Y-%m-%d %H:00:00')
WHERE DAYOFWEEK(c.CRASH_DATE) BETWEEN 2 AND 6
GROUP BY Hour
ORDER BY Crashes DESC
LIMIT 200;

开放表格式+对象存储实践

最后,我们再放上 StarRocks x Apache Iceberg/Hudi x MinIO 的视频 demo,只要短短几分钟就可以完成数据入湖到可视化:

相关文章
|
存储 SQL 缓存
StarRocks常见面试问题(一)
StarRocks常见面试问题(一)
|
存储 分布式计算 并行计算
计算存储分离架构
计算存储分离架构
|
4月前
|
存储 缓存 分布式计算
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
本文将深入探讨基于 StarRocks 和 Iceberg 构建的云原生湖仓分析技术,详细解析两者结合如何实现高效的查询性能优化。内容涵盖 StarRocks Lakehouse 架构、与 Iceberg 的性能协同、最佳实践应用以及未来的发展规划,为您提供全面的技术解读。 作者:杨关锁,北京镜舟科技研发工程师
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
|
27天前
|
SQL 关系型数据库 Apache
从 Flink 到 Doris 的实时数据写入实践 —— 基于 Flink CDC 构建更实时高效的数据集成链路
本文将深入解析 Flink-Doris-Connector 三大典型场景中的设计与实现,并结合 Flink CDC 详细介绍了整库同步的解决方案,助力构建更加高效、稳定的实时数据处理体系。
584 0
从 Flink 到 Doris 的实时数据写入实践 —— 基于 Flink CDC 构建更实时高效的数据集成链路
|
4月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
本文介绍了阿里集团A+流量分析平台的日志查询优化方案,针对万亿级日志数据的写入与查询挑战,提出基于Flink、Paimon和StarRocks的技术架构。通过Paimon存储日志数据,结合StarRocks高效计算能力,实现秒级查询性能。具体包括分桶表设计、数据缓存优化及文件大小控制等措施,解决高并发、大数据量下的查询效率问题。最终,日志查询耗时从分钟级降至秒级,显著提升业务响应速度,并为未来更低存储成本、更高性能及更多业务场景覆盖奠定基础。
|
8月前
|
存储 缓存 数据挖掘
StarRocks 原理详解:探索高效 OLAP 的奥秘
StarRocks 是一款高性能分析型数据仓库,采用向量化、MPP架构、CBO等技术,实现多维、实时、高并发的数据分析。它支持从各类数据源高效导入数据,兼容MySQL协议,并具备水平扩展、高可用等特性,广泛应用于实时数仓、OLAP报表等场景。StarRocks 解决了传统数仓在查询性能、数据导入、扩展性和灵活性等方面的挑战,助力企业实现数据驱动的决策。其分布式架构和智能物化视图等功能显著提升了查询效率,适用于大数据生态中的各种复杂需求。
1352 15
|
Java 测试技术 Python
Python:Flask使用ThreadPoolExecutor执行异步任务
Python:Flask使用ThreadPoolExecutor执行异步任务
830 0
|
1月前
|
存储 人工智能 安全
Airtable 如何用 StarRocks 构建数据验证系统
开源无国界,在本期“StarRocks 全球用户精选案例”专栏中,我们将介绍总部位于旧金山的云端协作服务公司 Airtable。作为一家致力于让用户像操作表格一样轻松构建数据应用的企业,Airtable 在 2025 年完成了向 AI 原生应用平台 的转型,平台同时支持企业级安全与治理能力,并与外部系统集成,实现复杂业务流程的自动化。
Airtable 如何用 StarRocks 构建数据验证系统
|
存储 Cloud Native 数据处理
Flink 2.0 状态管理存算分离架构演进
本文整理自阿里云智能 Flink 存储引擎团队负责人梅源在 Flink Forward Asia 2023 的分享,梅源结合阿里内部的实践,分享了状态管理的演进和 Flink 2.0 存算分离架构的选型。
1489 1
Flink 2.0 状态管理存算分离架构演进
|
存储 安全 数据挖掘
性能30%↑|阿里云AnalyticDB*AMD EPYC,数据分析步入Next Level
第4代 AMD EPYC加持,云原生数仓AnalyticDB分析轻松提速。
性能30%↑|阿里云AnalyticDB*AMD EPYC,数据分析步入Next Level