从存算一体到存算分离:在单机上用Docker体验StarRocks 3.2新架构(含MinIO对象存储)
从存算一体到存算分离:在单机上用Docker体验StarRocks 3.2新架构(含MinIO对象存储)
当数据仓库技术演进到云原生时代,存算分离架构正成为新一代分析型数据库的核心设计范式。StarRocks作为国产MPP数据库的佼佼者,在3.x版本中实现了存算分离架构的重大升级。本文将带您通过Docker Compose在单机环境下,快速搭建包含MinIO对象存储的StarRocks 3.2迷你集群,亲身体验存算分离架构的技术魅力。
1. 环境准备与架构解析
在开始部署之前,我们需要理解存算分离架构的核心价值。传统存算一体架构中,计算节点和存储节点紧密耦合,导致扩缩容成本高、资源利用率低。而存算分离架构通过将数据持久化到对象存储(如S3),实现了计算资源的弹性伸缩和存储资源的独立扩展。
本次实验环境需要以下组件:
- Docker Engine 20.10+
- Docker Compose v2.15+
- 至少8GB可用内存
- 50GB磁盘空间
关键配置检查清单:
# 验证Docker版本 docker --version docker-compose --version # 检查系统资源 free -h df -h提示:如果是在Linux环境下,建议关闭Swap分区以获得更稳定的性能表现:
sudo swapoff -a sudo sed -i '/swap/s/^/#/' /etc/fstab
2. 基础设施部署:MinIO对象存储
我们选择MinIO作为S3兼容的对象存储服务,它完美模拟了云上S3存储的行为模式。以下是docker-compose.yml中MinIO服务的配置片段:
services: minio: image: minio/minio:latest environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin volumes: - ./minio/data:/data ports: - "9000:9000" # API端口 - "9001:9001" # 控制台端口 command: server /data --console-address ":9001"启动后可以通过http://localhost:9001访问MinIO控制台(账号minioadmin/minioadmin),需要手动创建名为starrocks的存储桶。
对象存储关键参数对比:
| 参数项 | 存算一体架构 | 存算分离架构 |
|---|---|---|
| 数据持久化位置 | 本地SSD/HDD | 对象存储(S3协议) |
| 存储扩展方式 | 增加BE节点 | 无限扩展存储桶容量 |
| 数据冗余策略 | 多副本 | 存储层EC编码 |
| 典型延迟 | 微秒级 | 毫秒级 |
3. StarRocks 3.2集群部署
完整的docker-compose.yml应包含FE(前端)、CN(计算节点)和MinIO三个服务。以下是关键配置说明:
3.1 FE节点配置
starrocks-fe: image: starrocks/fe-ubuntu:3.2-latest environment: RUN_MODE: shared_data AWS_S3_ENDPOINT: http://minio:9000 AWS_S3_ACCESS_KEY: minioadmin AWS_S3_SECRET_KEY: minioadmin AWS_S3_PATH: starrocks volumes: - ./fe/meta:/opt/starrocks/fe/meta - ./fe/log:/opt/starrocks/fe/log ports: - 8030:8030 # HTTP服务 - 9030:9030 # MySQL协议3.2 CN节点配置
starrocks-cn: image: starrocks/cn-ubuntu:3.2-latest depends_on: - starrocks-fe environment: CN_AUTO_JOIN: "true" volumes: - ./cn/log:/opt/starrocks/cn/log启动集群:
docker-compose up -d验证服务状态:
# 检查容器运行状态 docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # 连接FE执行SQL验证 mysql -h127.0.0.1 -P9030 -uroot -e "SHOW FRONTENDS; SHOW COMPUTE NODES;"4. 存算分离特性深度体验
4.1 数据导入性能测试
创建一个测试表并导入数据:
-- 创建测试数据库 CREATE DATABASE test_db; USE test_db; -- 建表语句(使用存算分离特有的存储介质配置) CREATE TABLE lineorder_flat ( lo_orderdate DATE, lo_orderkey INT, lo_linenumber TINYINT ) ENGINE=OLAP DUPLICATE KEY(lo_orderdate, lo_orderkey) PARTITION BY RANGE(lo_orderdate) ( START ("1992-01-01") END ("1999-01-01") EVERY (INTERVAL 1 YEAR) ) DISTRIBUTED BY HASH(lo_orderkey) PROPERTIES ( "storage_medium" = "S3", "storage_cooldown_time" = "9999-12-31 23:59:59" ); -- 使用Stream Load导入示例数据 curl --location-trusted -u root: \ -H "label:lineorder_1" \ -H "column_separator:|" \ -T lineorder.tbl \ http://127.0.0.1:8030/api/test_db/lineorder_flat/_stream_load4.2 弹性扩缩容演示
存算分离架构的最大优势在于计算资源的弹性伸缩。我们可以动态添加CN节点:
-- 查看现有计算节点 SHOW COMPUTE NODES; -- 动态扩容(实际生产中通过k8s或docker-compose scale实现) docker-compose up -d --scale starrocks-cn=2 -- 在新CN启动后自动注册到集群 SHOW PROC '/compute_nodes';4.3 存储成本优化
存算分离架构下,可以通过以下方式优化存储成本:
-- 冷热数据分层存储 ALTER TABLE lineorder_flat SET ( "storage_cooldown_time" = "7 DAY" ); -- 数据压缩算法选择 ALTER TABLE lineorder_flat SET ( "storage_format" = "zstd" );5. 架构对比与选型建议
存算一体 vs 存算分离关键指标对比:
| 维度 | 存算一体(v2.5) | 存算分离(v3.2) |
|---|---|---|
| 部署复杂度 | 中等(需3BE+3FE) | 简单(1FE+1CN起步) |
| 存储成本 | 较高(3副本) | 较低(EC编码) |
| 计算弹性 | 分钟级 | 秒级 |
| 典型查询延迟 | 亚秒级 | 毫秒级 |
| 适用场景 | 高性能OLAP | 云原生+弹性需求 |
对于技术选型,建议考虑以下因素:
- 选择存算一体当:需要极致查询性能、已有稳定物理服务器资源
- 选择存算分离当:云环境部署、需要频繁扩缩容、有显著成本优化需求
在单机Docker环境中体验完整流程后,可以明显感受到3.2版本在运维便捷性和架构灵活性上的提升。特别是在进行计算节点扩缩容操作时,存算分离架构几乎可以实现"即时生效",而传统架构需要重新平衡数据分片。
