0198SK8s上部署StarRocksv315存算分离验证环境
存算分离的S3存储验证与K8s部署SR
概述
存算分离的S3存储(由Rook提供)已提前就绪。本文主要验证在K8s部署SR,并与S3进行对接。部署了组件FE、CN、fe-proxy单副本,没有BE组件。

注:存算分离K8s是可选的,选择K8s是因为Rook是基于K8s的存储系统,另外当前架构计划将StarRocks部署到K8s。
环境准备
- 操作系统: CentOS 7.6 (5.4.261-1.el7.elrepo.x86_64)
- Kubernetes: 1.27.6
- Rook-Ceph: v1.12.8(与StarRocks在同一个K8s集群部署)
- StarRocks Operator: 1.8.7
- StarRocks FE: 3.1.5
- StarRocks CN: 3.1.5
- StarRocks FE-proxy: nginx:1.21.5
存算分离及资源准备
StarRocks存算分离功能从3.0版本开始支持,但存算分离集群需要部署CN节点而非BE节点。CN和BE可以理解为同一个组件,BE存算分离后变为CN(Compute Node),CN只提供计算,而BE既有计算又有存储。
部署StarRocks存算分离集群时,需要添加到FE和CN配置文件fe.conf和cn.conf中的额外配置项。
1.1 官方存算分离说明
StarRocks存算分离集群采用了存储计算分离架构,特别为云存储设计。在存算分离的模式下,StarRocks将数据存储在兼容S3协议的对象存储(例如AWS S3、OSS以及MinIO)或HDFS中,而本地盘作为热数据缓存,用以加速查询。
通过存储计算分离架构,您可以降低存储成本并且优化资源隔离。除此之外,集群的弹性扩展能力也得以加强。在查询命中缓存的情况下,存算分离集群的查询性能与存算一体集群性能一致。
相对存算一体架构,StarRocks的存储计算分离架构提供以下优势:
- 廉价且可无缝扩展的存储。
- 弹性可扩展的计算能力。由于数据不存储在CN节点中,因此集群无需进行跨节点数据迁移或Shuffle即可完成扩缩容。
- 热数据的本地磁盘缓存,用以提高查询性能。
- 可选异步导入数据至对象存储,提高导入效率。
通过官方说明来看,存算分离主要是作为云端部署而提供,云端存储数据相对是安全有保障的。

1.2 本次验证说明
存算分离需要的基础环境:S3协议对象存储(或HDFS)、StarRocks,缺一不可。
可以在K8s上部署,也可在非K8s上部署,只是将数据存储于S3或HDFS上。当前演示环境在K8s(云原生)上部署,如果非云原生部署,则在原有架构上将S3或HDFS配置写入fe.conf,也可实现存算分离。
- 本次是对StarRocks存算分离的私有化部署进行验证,未在云厂商及云端产品中部署,验证后,可采购数台硬件进行物理支撑。
- FE meta、FE log也需要数据持久化,同样使用CN相同方法。如果不做持久化,重启FE后,因元数据丢失,不能访问到S3数据。
- 验证了本地盘作为CN热数据缓存,可以使用StorageClass或LocalPath实现,本次使用LocalPath实现,后续可在生产环境使用该架构进行部署,生产环境可以考虑使用1-2T NvMe SSD同时作为FE meta、log及CN cache磁盘使用。
- 生产环境如果具有高可用StorageClass,可以使用StorageClass替换LocalPath,使用LocalPath作为生产也是可以的,FE采用3副本,CN也建议多个节点部署,使用LocalPath自动扩缩容功能受限。
- S3存储的信息配置在
fe.conf中,而数据的读写是由CN根据FE广播S3配置,将读写到S3中,cn.conf中没有S3配置。
1.3 资源说明
- 采用3节点主机,安装K8s,1个master,3个node,其中主节点同时充当node节点。
- rook-ceph采用RGW(对象存储)实现S3功能,每个节点2空闲块外置磁盘,充当rook-ceph osd使用。
- StarRocks和rook-ceph部署在同一套K8s集群中。
- 外加1台作为单节点伪分布式HDFS,用于StarRocks备份,采用1副本,较大利用磁盘。
- 同时可以考虑外加3台作为rook-ceph RGW容灾使用,验证未涉及这部分,生产环境可以考虑规划。
- 每台K8s/存储节点两块网卡,一个为public网络,作为业务使用,一块cluster网络,作为rook-ceph内部数据同步使用。
资源清单:
| 序号 | 主机名 | CPU | 内存 | 本地磁盘 | 外接磁盘 | 网卡 | 功能描述 |
|---|---|---|---|---|---|---|---|
| 1 | k8s-sr1 | 4c | 16G | 200G | 10G*2 | 1G*2块 | K8s-master/K8s-node1 |
| 2 | k8s-sr2 | 4c | 16G | 200G | 10G*2 | 1G*2块 | K8s-node2 |
| 3 | k8s-sr3 | 4c | 16G | 200G | 10G*2 | 1G*2块 | K8s-node3 |
| 4 | sr-bak | 4c | 16G | 200G | 10G*3 | 1G*2块 | 单机伪分布式,HDFS共300G容量 |
2. rook-ceph S3存储验证及fe.conf配置
部署StarRocks前,确保rook-ceph S3存储已就绪,S3作为StarRocks对接的存储,如果未能就绪,后续数据读写会有问题。
验证后根据rook-ceph S3参数准备fe.conf共享存储内容。
2.1 验证rook-ceph S3可用性(rook-ceph知识)
可通过关键参数在toolbox-operator-image中设置变量值。这部分为rook-ceph知识,对此不熟悉内容,可在我rook-ceph RGW对象创建部分了解。
1) 登录toolbox-operator-image
bash
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools-operator-image -- bash
2) 设置环境变量
每个人环境变量不尽相同,当前是我rook-ceph部署的环境信息:
bash
export AWS_HOST=rook-ceph-rgw-my-store.rook-ceph.svc # 如果使用K8s内地址,可以使用该地址,如果使用是外部rook-ceph,可以使用IP或域名
export PORT=800
export BUCKET_NAME=ceph-bkt-8c8cfba0-e4f4-4302-a2e5-d693d243e948
export AWS_ACCESS_KEY_ID=Q2HLJBVD739N9XOR3SNZ
export AWS_SECRET_ACCESS_KEY=pevdQm9d82AR1vAuIrVmpUNSth0G6nkQ5KzmmJdG
3) 创建凭据
bash
mkdir ~/.aws
cat > ~/.aws/credentials << EOF
[default]
aws_access_key_id = ${AWS_ACCESS_KEY_ID}
aws_secret_access_key = ${AWS_SECRET_ACCESS_KEY}
EOF
4) 上传和下载对象存储
上传文件到桶中:
bash
echo "Hello Rook" > /tmp/rookObj
s5cmd --endpoint-url http://$AWS_HOST:$PORT cp /tmp/rookObj s3://$BUCKET_NAME
从桶中下载并验证文件:
bash
s5cmd --endpoint-url http://$AWS_HOST:$PORT cp s3://$BUCKET_NAME/rookObj /tmp/rookObj-download
cat /tmp/rookObj-download
2.2 对接Rook-Ceph S3参数准备(StarRocks+Ceph知识)
对于不同的对象存储类型,参考官方链接获取不同的参数值。
存算分离官方链接:
https://docs.starrocks.io/zh/docs/deployment/deploy_shared_data/
下面以Ceph S3(rook-ceph)为例,详细参数见“存算分离官方参考”:
bash
run_mode = shared_data # 存算分离模式
cloud_native_meta_port = 6090 # 云原生元数据服务监听端口,默认端口6090
cloud_native_storage_type = S3 # 存储类型S3
aws_s3_path = ceph-bkt-8c8cfba0-e4f4-4302-a2e5-d693d243e948 # 此处选择bucket名称
aws_s3_endpoint = rook-ceph-rgw-my-store.rook-ceph.svc.cluster.local:800 # endpoint即http://IP+port
aws_s3_access_key = Q2HLJBVD739N9XOR3SNZ # access_key,每个bucket唯一
aws_s3_secret_key = pevdQm9d82AR1vAuIrVmpUNSth0G6nkQ5KzmmJdG # secret_key,每个bucket唯一
enable_load_volume_from_conf = true # true表示StarRocks将使用FE配置文件中存储相关属性创建内置存储卷
将以上配置加入到fe.conf中,后续会提供完整的fe.conf配置。
3. 部署StarRocks Operator
3.1 添加定制资源StarRocksCluster
创建自定义资源:
bash
curl -O https://raw.githubusercontent.com/StarRocks/starrocks-kubernetes-operator/main/deploy/starrocks.com_starrocksclusters.yaml
kubectl apply -f starrocks.com_starrocksclusters.yaml
3.2 部署StarRocks Operator
1) 下载CRDs(StarRocks在K8s中自定义资源定义)
使用默认配置文件或者自定义配置文件部署StarRocks Operator。
下载用于部署StarRocks Operator的配置文件:
bash
curl -O https://raw.githubusercontent.com/StarRocks/starrocks-kubernetes-operator/main/deploy/operator.yaml
2) 部署Operator
StarRocks Operator默认会部署至starrocks命名空间下,并且管理所有命名空间下的StarRocks集群。如果有必要,可修改配置文件进行部署。
bash
kubectl apply -f operator.yaml
3) 检查Operator状态
检查StarRocks Operator运行状态。如果Pod处于Running状态且Pod内所有容器都READY,则表示StarRocks Operator成功运行。
bash
kubectl -n starrocks get pod
说明:如要更改StarRocks Operator所在Namespace,则需要修改starrocks为自定义的Namespace。
4. 部署StarRocks集群
4.1 配置示范简述
可以直接使用StarRocks提供的配置文件范例,部署StarRocks集群(定制资源StarRocks Cluster实例化的对象)。例如使用starrocks-fe-and-be.yaml,部署一个StarRocks集群,包含三个FE和三个BE节点。本次未采用此默认配置,下面提供自定义配置。
4.2 本次部署yaml文件说明
本次未直接使用官方提供的starrocks-fe-and-be.yaml,因现有主机资源较小,故参考官方提供yaml进行修改,分别借鉴starrocks-fe-and-be.yaml和deploy_a_starrocks_cluster_with_fe_proxy.yaml,通过配置部署了FE、CN、FE-proxy,并同时使用fe.conf、cn.conf对组件进行参数定义,方便后续优化。
- FE:使用localPath,分别缓存meta(
/opt/starrocks/fe/meta)、log(/opt/starrocks/fe/log),元数据占用空间不大。 - CN:使用localPath作为热数据缓存CN cache(
/opt/starrocks/cn/storage),生产环境可配置200G - 2T,主要是将热数据从S3拉取本地。 - FE-proxy:解决从集群外导入数据提示K8s内部域名不能识别问题。
按上述规划,创建StarRocks集群需准备好shared-data-fe-cn-feproxy-v1.0.yaml(内含fe.conf和cn.conf)和localStorageClassV1.0.yaml,前者作为集群主体,后者作为localPath必备的SC(StorageClass)和PV(PersistentVolume)。
4.3 准备shared-data-fe-cn-feproxy-v1.0.yaml文件
yaml
cat > shared-data-fe-cn-feproxy-v1.0.yaml <<-'EOF'
# This manifest deploys a StarRocks cluster running in shared data mode.
# see https://docs.starrocks.io/en-us/latest/deployment/deploy_shared_data for more information about share data mode.
#
# You will have to download and edit this YAML file to specify the details for your shared storage. See the
# examples in the docs, and add your customizations to the ConfigMap `starrockscluster-sample-fe-cm` at the
# bottom of this file.
# https://docs.starrocks.io/en-us/latest/deployment/deploy_shared_data#configure-fe-nodes-for-shared-data-starrocks
apiVersion: starrocks.com/v1
kind: StarRocksCluster
metadata:
name: a-starrocks-in-share-data-mode # change the name if needed.
namespace: starrocks
spec:
starRocksFeSpec: #部署Fe部分
image: starrocks/fe-ubuntu:latest #镜像版本
replicas: 1 #当前测试环境启动1个pod,可以后续作为扩容验证,也可启动3个
limits:
cpu: 4 #调小所需的资源,生产环境可调大
memory: 6Gi
requests:
cpu: 1
memory: 2Gi
configMapInfo:
configMapName: starrockscluster-sample-fe-cm #引用configmap作为fe.conf内容,可以作为后续参数优化使用,完整内容在后面
resolveKey: fe.conf
storageVolumes:
- name: fe-storage-meta
storageClassName: local-storage #使用LocalPath作为fe持久化数据存储
# fe container stop running if the disk free space which the fe meta directory residents, is less than 5Gi.
storageSize: 10Gi
mountPath: /opt/starrocks/fe/meta #fe meta持久化数据目录
- name: fe-storage-log
storageClassName: local-storage
storageSize: 5Gi
mountPath: /opt/starrocks/fe/log #fe log持久化数据目录
starRocksCnSpec: #部署Fe部分
# cnEnvVars: #调试时使用参数
# - name: LOG_CONSOLE
# value: "1"
image: starrocks/cn-ubuntu:latest #镜像版本
replicas: 1 #当前测试环境启动1个pod,可以后续作为扩容验证,也可启动3个
limits:
cpu: 4 #调小所需的资源,生产环境可调大
memory: 6Gi
requests:
cpu: 1
memory: 2Gi
configMapInfo:
configMapName: starrockscluster-sample-cn-cm #引用configmap作为cn.conf内容,可以作为后续参数优化使用,完整内容在后面
resolveKey: cn.conf
storageVolumes:
- name: cn-storage-cache
storageClassName: local-storage #使用LocalPath作为cn持久化数据存储
# fe container stop running if the disk free space which the fe meta directory residents, is less than 5Gi.
storageSize: 200Gi
mountPath: /opt/starrocks/cn/storage #cn 缓存等持久化数据目录
starRocksFeProxySpec: #部署FeProxy部分
image: nginx:latest #镜像版本
replicas: 1 #当前测试环境启动1个pod,可以后续作为扩容验证,也可启动3个
limits:
cpu: 1 #调小所需的资源,生产环境可调大
memory: 2Gi
requests:
cpu: 200m
memory: 500Mi
service:
type: NodePort # export fe proxy service
ports:
- containerPort: 8080
name: http-port
nodePort: 30180 # The range of valid ports is 30000-32767
port: 8080
resolver: "kube-dns.kube-system.svc.cluster.local" # this is the default dns server.
---
# fe config
apiVersion: v1
kind: ConfigMap
metadata:
name: starrockscluster-sample-fe-cm
namespace: starrocks
labels:
cluster: starrockscluster-sample
data:
fe.conf: |
LOG_DIR = ${STARROCKS_HOME}/log
DATE = "$(date +%Y%m%d-%H%M%S)"
# 降低JVM内存大小为4G:Xmx4096m,共3处
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx4096m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:${LOG_DIR}/fe.gc.log.$DATE"
JAVA_OPTS_FOR_JDK_9="-Dlog4j2.formatMsgNoLookups=true -Xmx4096m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:${LOG_DIR}/fe.gc.log.$DATE:time"
JAVA_OPTS_FOR_JDK_11="-Dlog4j2.formatMsgNoLookups=true -Xmx4096m -XX:+UseG1GC -Xlog:gc*:${LOG_DIR}/fe.gc.log.$DATE:time"
http_port = 8030
rpc_port = 9020
query_port = 9030
edit_log_port = 9010
mysql_service_nio_enabled = true
sys_log_level = INFO
# config for share data mode
# 将之前S3的信息填充到下方
run_mode = shared_data
cloud_native_meta_port = 6090
cloud_native_storage_type = S3
aws_s3_path = ceph-bkt-8c8cfba0-e4f4-4302-a2e5-d693d243e948
#aws_s3_region = <region>
aws_s3_endpoint = rook-ceph-rgw-my-store.rook-ceph.svc.cluster.local:800
aws_s3_access_key = Q2HLJBVD739N9XOR3SNZ
aws_s3_secret_key = pevdQm9d82AR1vAuIrVmpUNSth0G6nkQ5KzmmJdG
# create the default storage volume manually after the cluster is created
enable_load_volume_from_conf = true
---
# cn config
apiVersion: v1
kind: ConfigMap
metadata:
name: starrockscluster-sample-cn-cm
namespace: starrocks
labels:
cluster: starrockscluster-sample
data:
cn.conf: |
starlet_port = 9070
storage_root_path = /opt/starrocks/cn/storage
#block_cache_mem_size = 2147483648
#block_cache_disk_size = 21474836480
EOF
4.4 准备localStorageClassV1.0.yaml文件
yaml
cat > localStorageClassV1.0.yaml << -'EOF'
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage #StorageClass名称,可自定义
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: starrocks-fe-meta-pv #fe-meta pv名称
namespace: starrocks
spec:
capacity:
storage: 10Gi #fe meta大小
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage #使用上述定义的SC名称
local:
path: /opt/starrocks/fe/meta #fe meta本机路径
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-sr1 #后续fe-meta固定在该节点,如果有多个节点,则更改每个节点主机名,需要label进行标记
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: starrocks-fe-log-pv #fe-log pv名称
namespace: starrocks
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /opt/starrocks/fe/log #fe log本机路径
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-sr1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: starrocks-cn-cache-pv #cn-cache pv名称
namespace: starrocks
spec:
capacity:
storage: 200Gi #cn cache个人建议200G - 2T
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /opt/starrocks/cn/storage #cn cache本机路径
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-sr1
EOF
4.5 创建StarRocks集群
1) 创建StarRocks集群
bash
kubectl apply -f shared-data-fe-cn-feproxy-v1.0.yaml
2) 创建LocalPath存储
创建fe-meta、fe-log、cn-cache所用到的local存储,PVC会自动创建:
bash
kubectl apply -f localStorageClassV1.0.yaml
3) 查看pod已经启动
正常情况下,FE、CN,FE-proxy都应该为Running,且READY数量都为期望数量,如1/1, N/N,此时已完成StarRocks存算分离部署。
bash
kubectl -n starrocks get pod
4) fe-proxy镜像拉取缓慢处理(可跳过)
fe-proxy默认拉取镜像非常缓慢,pod不能启动:
bash
kubectl -n starrocks describe pod a-starrocks-in-share-data-mode-fe-proxy-857455f4df-pbdpv
5. 访问集群
5.1 在Kubernetes集群内通过MySQL客户端访问StarRocks集群
通过FE的Pod进行验证访问,可以使用通过FE Service的ClusterIP,或者K8s内的service name进行访问。
Service的名称默认为<集群名称>-<组件名称>-service,例如a-starrocks-in-share-data-mode-fe-service,也可以在每个组件的spec中指定Service名称。
1) 查看service信息
FE Service的IP为11.111.196.31,service name为a-starrocks-in-share-data-mode-fe-service,在K8s内部都可以通过这两个名称进行访问。
查看FE Service内部虚拟CLUSTER-IP和端口PORT(S)。
bash
kubectl -n starrocks get svc
2) K8s内部登录FE
bash
kubectl -n starrocks exec -it a-starrocks-in-share-data-mode-fe-0 -- bash
3) 以CLUSTER-IP登录StarRocks
bash
mysql -h 11.111.196.31 -P 9030 -uroot
4) 也可以servicename登录StarRocks
bash
mysql -h a-starrocks-in-share-data-mode-fe-service -P 9030 -uroot
5) 查看FE、CN节点状态-正常
sql
SHOW PROC '/frontends'\G
SHOW PROC '/compute_nodes'\G
5.2 K8s集群外访问StarRocks集群
在Kubernetes集群外,支持通过FE Service的LoadBalancer和NodePort访问StarRocks集群。以LoadBalancer为例:
1) 公有云访问方式(本次不涉及)
将fe-service的类型由ClusterIP更改为LoadBalancer,直接使用external-ip进行访问,该方法使用云提供商的负载均衡器在外部公开服务。
执行命令:
bash
kubectl -n starrocks edit svc a-starrocks-in-share-data-mode-fe-service
更新StarRocks集群配置文件,修改starRocksFeSpec的Service类型为LoadBalancer。
yaml
starRocksFeSpec:
image: starrocks/fe-ubuntu:3.0-latest
replicas: 3
requests:
cpu: 4
memory: 16Gi
service:
type: LoadBalancer # 指定为LoadBalancer
查询FE Service向外部暴露的IP地址EXTERNAL-IP和端口PORT(S)。
bash
kubectl -n starrocks get svc
通过MySQL客户端访问StarRocks集群:
bash
mysql -h a7509284bf3784983a596c6eec7fc212-618xxxxxx.us-west-2.elb.amazonaws.com -P9030 -uroot
2) 私有云访问方式(本次涉及)
###1 创建yaml文件
可以通过nodeport进行公开fe query和http port,也可使用ingress-nginx+DNS实现域名进行访问,前者可结合nginx可以实现高可用访问。下面以nodeport对fe http和fe query进行演示。
yaml
cat > fe-nodeport-svc.yaml <<-'EOF'
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: fe # svc lable, --show-labels
app.starrocks.ownerreference/name: a-starrocks-in-share-data-mode
name: starrocks-fe-nodeport
namespace: starrocks
spec:
ports:
- name: http
port: 8030
protocol: TCP
targetPort: 8030
nodePort: 32030 #http 8030对外访问端口32030
- name: query
port: 9030
protocol: TCP
targetPort: 9030
nodePort: 32630 #query 8030对外访问端口32630
selector:
app.kubernetes.io/component: fe # pod label, --show-tables
app.starrocks.ownerreference/name: a-starrocks-in-share-data-mode-fe
type: NodePort
EOF
###2 创建nodePort
bash
kubectl apply -f fe-nodeport-svc.yaml
###3 查看nodePort
bash
kubectl -n starrocks get svc
###4 在K8s外登录StarRocks
bash
mysql -h192.168.80.20 -P32630 -uroot
6. 官方参考
- StarRocks Operator部署
- StarRocks存算分离部署
- StarRocks快速入门
- StarRocks Kubernetes Operator文档
- StarRocks存算分离集群部署示例
- StarRocks FE Proxy部署示例
- StarRocks数据缓存配置


end
