0%

如何基于Docker部署StarRocks

背景

近期我们的一个BI数据产品在合作伙伴的私有化部署实践中,我们遇到了一个具有代表性的技术挑战:合作伙伴的基础设施采用基于openEuler的一体机架构,需要将包含StarRocks的全套数据分析组件进行容器化封装部署。由于官方文档存在以下痛点:

  1. 服务组件说明分散(FE/BE节点配置分离)
  2. 容器化部署路径不明确
  3. 缺少典型问题解决方案

本文将通过完整的实战记录,详解基于Docker的企业级StarRocks部署方案。

容器化部署全流程

1. 镜像准备与优化

1.1 镜像加速配置(国内环境推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建或更新Docker守护进程配置
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.nju.edu.cn"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"insecure-registries": [],
"data-root": "/var/lib/docker"
}
EOF

1.2 镜像选择策略

在镜像选型过程中,观察到StarRocks官方推荐的allin1-ubuntu镜像具有最高下载量。针对Docker镜像的跨平台特性,了解到allin1-ubuntu的命名源于镜像内部集成的是Ubuntu用户空间环境(包含apt包管理、系统工具链等),而非要求必须部署在Ubuntu宿主机上。

这也就意味着CentOS/openEuler 操作系统上也可以采用starrocks/allin1-ubuntu,选对对应的tag即可.

1
2
docker pull starrocks/allin1-ubuntu:3.1.14

执行完毕,稍等一会,因为镜像本身比较大.

1
2
3
[root@iZ2ze8dvta0psx9lf45hk2Z]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
starrocks/allin1-ubuntu 3.1.14 b15dd4d85c19 9 months ago 4.36GB

2. 服务启动与验证

2.1 容器初始化命令

1
2
3
4
5
6
7
8
9
10
docker run -d --name starrocks \
-p 9030:9030 \ # FE查询服务端口
-p 8030:8030 \ # FE HTTP接口
-p 8040:8040 \ # BE HTTP服务端口
--security-opt seccomp=unconfined \
--ulimit nofile=65536:65536 \ # 文件描述符优化
-v /data/starrocks/fe:/data/deploy/starrocks/fe \ # 持久化存储:挂载数据卷保证容灾能力
-v /data/starrocks/be:/data/deploy/starrocks/be \
starrocks/allin1-ubuntu:3.1.14

2.2 服务健康检查

1
2
3
4
5
# 检查容器状态
docker ps -a --filter name=starrocks

# 实时查看启动日志
docker logs -f starrocks

启动完毕,尝试通过mysql客户端连接9030端口。

1
mysql -h 127.0.0.1 -P 9030 -uroot

3. 典型问题排查

3.1 服务端口不可用

启动过程中,日志一直提醒FE service query port:9030 is NOT alive.

1
2
3
4
5
6
7
8
9
10
11
2025-04-29 14:16:10 2025-04-29 05:16:10+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-04-29 14:16:12 2025-04-29 05:16:12,355 INFO exited: feservice (exit status 255; not expected)
2025-04-29 14:16:12 2025-04-29 05:16:12+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-04-29 14:16:12 2025-04-29 05:16:12,832 INFO gave up: feservice entered FATAL state, too many start retries too quickly
2025-04-29 14:16:14 2025-04-29 05:16:14+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-04-29 14:16:16 2025-04-29 05:16:16+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-04-29 14:16:18 2025-04-29 05:16:18+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-04-29 14:16:20 2025-04-29 05:16:20+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-04-29 14:16:22 2025-04-29 05:16:22+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-04-29 14:16:24 2025-04-29 05:16:24+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-04-29 14:16:27 2025-04-29 05:16:27+00:00 WARN FE service query port:9030 is NOT alive yet!

问题排查:

attach到 docker image 内部,看看具体fe服务启动发生了什么异常。

1
2
3
4
5
6
7
docker ps -a

# 进入容器调试环境
docker exec -it starrocks /bin/bash

# 查看FE日志(关键路径)
tail -n 100 /data/deploy/starrocks/fe/log/fe.log

果然发现问题,原来是磁盘空间不足。

磁盘日志异常

查看磁盘占用信息:
磁盘占用信息

3.2 常见问题根源:

  • 存储空间不足(日志文件路径:/data/deploy)
  • 内存分配异常(建议容器内存≥4GB)
  • 端口冲突(检查宿主机的8030/9030端口占用)

4. 安全加固与数据导入

4.1 账户安全配置:

默认StarRocks root用户是没有密码的,用起来会很不方便,也不安全。

1
2
3
4
5
宿主机执行:
mysql -h 127.0.0.1 -P9030 -uroot

然后将root用户密码设置一下:
alter USER 'root' IDENTIFIED BY 'root';

创建数据库和对应表后,就可以进行数据导入了。

4.2 高效数据加载方案

采用Stream Load实现TB级数据高效导入,不依赖外部组件。方便快捷。

https://docs.starrocks.io/zh/docs/3.2/loading/Stream_Load_transaction_interface/

1
2
3
4
5
6
7
8
curl --location-trusted -u root:root \
-H "Expect:100-continue" \
-H "timeout:100" \
-H "max_filter_ratio:0.2" \
-H "column_separator:," \
-H "skip_header:1" \
-T reviews.csv -XPUT \
http://${BE_IP}:8040/api/retail_online/reviews/_stream_load

注意,这里的端口8040为Be服务的Http端口.

关键参数说明:

参数名 功能说明 推荐值
max_filter_ratio 允许的数据过滤比例 0.1-0.3
timeout 超时控制(秒) ≥300
exec_mem_limit 单次导入内存限制(MB) ≥2048

成功后会输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"TxnId": 4,
"Label": "7a9798c6-b31c-41e4-a335-a3612e846ed0",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 8,
"NumberLoadedRows": 8,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 1483,
"LoadTimeMs": 32,
"BeginTxnTimeMs": 1,
"StreamLoadPlanTimeMs": 3,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 12,
"CommitAndPublishTimeMs": 16
}