Rumit Jain
02/18/2026, 4:11 AMRocky
02/18/2026, 4:11 AMstarrocks-operator) can manage multiple StarRocks clusters across different namespaces.
* Pros: Lower resource overhead (only one operator pod), easier to upgrade the management plane.
* How to do it:
1. Deploy the operator once in a management namespace.
2. Deploy StarRocksCluster Custom Resources (CRs) in their respective namespaces (e.g., ns-team-a, ns-team-b). The operator will detect these CRs and spin up the components in those namespaces.
2. Multiple Operators, Multiple Clusters
You can deploy a separate operator in each namespace if you need strict management plane isolation (e.g., different operator versions for different teams).
* Pros: Fault isolation; an issue with one operator won't affect other clusters.
* How to do it: You must ensure each operator is configured to watch only its own namespace (typically via an environment variable or flag like WATCH_NAMESPACE) to avoid conflicts where multiple operators try to manage the same cluster.
──────────
Best Practices for Multi-Namespace Deployments on EKS
1. Resource Isolation (Quotas & Limits)
To prevent one cluster from impacting others (the "noisy neighbor" effect):
* K8s Resource Quotas: Set ResourceQuota on each namespace to limit the total CPU/Memory consumed.
* Pod Requests/Limits: Always specify requests and limits for FE, BE, and CN components in your StarRocksCluster YAML. This ensures the K8s scheduler can place pods effectively.
2. Compute Isolation (Node Groups)
* Node Affinity/Selectors: Use nodeSelector or affinity in the StarRocksCluster spec to pin specific clusters to dedicated EKS Node Groups. For example, give Production clusters high-performance r6i or i3en instances while using cheaper instances for Dev.
* Taints and Tolerations: Use taints on specific nodes to ensure only the designated StarRocks pods can run on them.
3. Storage Management
* Dedicated Storage Classes: Use different AWS EBS StorageClasses (e.g., gp3 vs io2) based on the performance needs of each namespace.
* Persistent Volumes: Ensure you are using volumeClaimTemplates in the operator CRD so that each pod gets its own unique EBS volume.
4. Network Isolation
* Network Policies: By default, pods in an EKS cluster can communicate across namespaces. Implement NetworkPolicy to restrict traffic so that namespace-a cannot reach the FE/BE services of namespace-b.
* Load Balancer Separation: If exposing FEs via a LoadBalancer, use annotations to manage AWS NLBs/ALBs specifically for each namespace.
5. Namespace Scoping for Security
* RBAC: Use fine-grained RBAC roles. A team should only have permission to edit StarRocksCluster resources in their specific namespace.
* Secrets: Keep credentials (like root passwords or S3 access keys) in namespace-local K8s Secrets.
Summary Recommendation
For most users on EKS, one cluster-wide operator managing multiple clusters in different namespaces is the best balance of maintainability and isolation. Use Node Affinity if you need physical hardware isolation between those namespaces.
References
• quick_start/helm.md
• deployment/helm.md
• deployment/sr_operator.mdRumit Jain
02/18/2026, 5:19 AMRocky
02/18/2026, 5:19 AMkube-starrocks chart), the nameOverride attribute follows standard Helm conventions. Its primary significance is to partially override the name of the resources generated by the chart.
Here is a breakdown of its significance:
1. Controlling Resource Naming
By default, Helm charts use the chart's name (e.g., starrocks-operator) to generate resource names. The nameOverride field replaces the "chart name" part of the name but still keeps the Release Name as a prefix.
* Standard Behavior: If your release is named my-release and the chart is operator, the resources might be named my-release-operator.
* With `nameOverride: sr-op`: The resources would instead be named my-release-sr-op.
2. Avoiding Name Collisions
The nameOverride attribute is useful when you want to deploy multiple instances of the StarRocks operator or cluster within the same namespace or cluster, or if the default chart name is too long and causes issues with Kubernetes' 63-character limit for resource names.
3. Subchart Management
The kube-starrocks chart often includes subcharts for both the operator and the cluster.
* Using nameOverride within the operator subchart specifically affects the naming of the operator's Deployment, Pods, ServiceAccount, and RBAC roles.
* This ensures that the operator's infrastructure components follow your organization's specific naming conventions.
Difference from fullnameOverride
It is important to distinguish nameOverride from `fullnameOverride`:
* nameOverride: Replaces the chart name portion of the resource name.
* fullnameOverride: Completely replaces the entire generated name (ignoring both the Release Name and the Chart Name). This is used when you want a fixed, static name for your StarRocks resources regardless of what you name your Helm release.
Where to find it
You can find these settings in the values.yaml file of the StarRocks Kubernetes Operator Helm Chart.
yaml
# Example from values.yaml
nameOverride: ""
fullnameOverride: ""
If you are using the combined kube-starrocks chart, you would typically set this under the operator section:
yaml
operator:
nameOverride: "my-custom-op-name"
References
• deployment/helm.md
• quick_start/helm.mdRumit Jain
02/19/2026, 5:43 AMRocky
02/19/2026, 5:44 AMroot user for daily operations and use Role-Based Access Control (RBAC).
* Create Users: Use the CREATE USER statement to create distinct identities.
sql
CREATE USER 'analysis_user'@'%' IDENTIFIED BY 'YourSecurePassword';
* Manage Passwords: You can change or reset passwords using SET PASSWORD or ALTER USER.
sql
SET PASSWORD FOR 'analysis_user'@'%' = PASSWORD('NewSecurePassword');
* External Authentication: For enterprise environments, the recommended way is to integrate with LDAP, SAML, or OAuth 2.0. This allows you to manage users in a central directory rather than manually in StarRocks.
2. Giving Access to Databases
Instead of granting privileges directly to users, the recommended way is to use Roles. This makes management much easier as your team grows.
1. Create a Role:
sql
CREATE ROLE 'read_only_role';
2. Grant Privileges to the Role:
sql
-- Grant read access to all tables in a specific database
GRANT SELECT ON db_name.* TO ROLE 'read_only_role';
3. Assign the Role to a User:
sql
GRANT 'read_only_role' TO USER 'analysis_user'@'%';
-- Or set it as the default so they don't have to 'SET ROLE' manually
ALTER USER 'analysis_user'@'%' DEFAULT ROLE 'read_only_role';
3. Can I use HashiCorp Vault?
StarRocks does not currently have a "native" HashiCorp Vault plugin built directly into the engine for user authentication (like a dedicated secret engine). However, you can use Vault in the following ways:
* Via JWT/OIDC (Recommended for SSO): StarRocks supports JWT (JSON Web Token) authentication via "Security Integrations." Since HashiCorp Vault can act as an OIDC provider or issue JWTs, you can configure StarRocks to verify tokens issued by Vault.
* Secret Management for Applications: Most users use Vault to store StarRocks credentials. Your applications fetch the username/password from Vault at runtime to connect to StarRocks.
* Kubernetes Integration: If you are running StarRocks on Kubernetes, you can use the Vault CSI Provider or External Secrets Operator to sync Vault secrets into Kubernetes Secrets, which can then be mounted or used as environment variables for your FE/BE or loading jobs.
* Password Rotation: While there isn't a native "StarRocks Secret Engine" in Vault yet, because StarRocks is MySQL-compatible, some users have success using the MySQL Database Secret Engine in Vault to manage dynamic credentials (though this is not officially documented as a "supported" configuration).
Summary Recommendation: Use RBAC with Roles for internal permission management, and if you need centralized identity, look into LDAP or JWT-based Security Integrations which can interface with HashiCorp Vault.
References
• sql-reference/System_variable.md
• administration/user_privs/ssl_authentication.md
• quick_start/helm.md
• administration/user_privs/authorization/ranger_plugin.md
• faq/Others.mdRumit Jain
02/19/2026, 7:24 AMERROR 1045 (28000): Access denied for user 'root' (using password: NO)
error code: 1045
Password error, believed to have been changed, exiting normally
Due tothis other FE pods are giving below error and not coming healthy (kube-starrocks-fe-1 and kube-starrocks-fe-2)
[Thu Feb 19 15:18:27 CST 2026] FE service is alive, check if has leader ...
ERROR 1045 (28000): Access denied for user 'root' (using password: YES)
[Thu Feb 19 15:18:27 CST 2026] No leader yet ...
and CN showing these logs and not coming healthy (kube-starrocks-cn-0):
[Thu Feb 19 15:18:38 CST 2026] Add myself (kube-starrocks-cn-0.kube-starrocks-cn-search.dockprivileged.svc.cluster.local:9050) into FE ...
ERROR 1045 (28000): Access denied for user 'root' (using password: YES)
ERROR 1045 (28000): Access denied for user 'root' (using password: YES)
also kube-starrocks-fe-0 is not able to connect to mysql client:
root@kube-starrocks-fe-0:/opt/starrocks# mysql -h kube-starrocks-fe-service.dockprivileged.svc.cluster.local -P 9030 -u root -p --prompt="Starrocks > "
Enter password:
ERROR 1045 (28000): Access denied for user 'root' (using password: YES)
I created Root user password in AWS Secret manager and then created Kubernetes password from it with name:
starrocks-root-password and in data as key as password and its value "password"
This is my values.yaml file of starrocks cluster in helm chart:
prefix: kubvir
metrics:
serviceMonitor:
enabled: true
starrocksCluster:
namespace: "asd12"
enabledBe: false
enabledCn: true
componentValues:
serviceAccount: kubvir-asd12-starrocks-s3-sa
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["dock"]
- key: karpenter.sh/capacity-type
operator: In
values: [ "on-demand" ]
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
initPassword:
enabled: true
passwordSecret: starrocks-root-password
# ============================================================
# FE-PROXY — EXPOSE THROUGH ALB (HTTP only)
# ============================================================
starrocksFeProxySpec:
enabled: true
annotations:
sidecar.istio.io/inject: "false"
service:
type: ClusterIP
annotations:
sidecar.istio.io/inject: "false"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["dock"]
- key: karpenter.sh/capacity-type
operator: In
values: [ "on-demand" ]
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
# ============================================================
# FE (FrontEnd Service) — EXPOSE THROUGH NLB (MySQL + HTTP)
# ============================================================
starrocksFESpec:
annotations:
sidecar.istio.io/inject: "false"
service:
type: ClusterIP
ports:
- name: query
port: 9030
- name: http
port: 8030
replicas: 3
resources:
requests:
cpu: 1
memory: 2Gi
limits:
cpu: 1
memory: 2Gi
config: |
run_mode = shared_data
cloud_native_storage_type = S3
aws_s3_path = kubvir-asd12-starrocks-data/
aws_s3_region = us-east-1
aws_s3_endpoint = <https://s3.amazonaws.com>
enable_load_volume_from_conf=true
aws_s3_use_instance_profile=false
aws_s3_use_aws_sdk_default_behavior=true
audit_log_modules = slow_query, query, connection
audit_log_json_format = true
qe_slow_log_ms = 1000
aws_s3_enable_partitioned_prefix=true
aws_s3_num_partitioned_prefix=64
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["dock"]
- key: karpenter.sh/capacity-type
operator: In
values: [ "on-demand" ]
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
# ============================================================
# CN (Compute Node)
# ============================================================
starrocksCnSpec:
annotations:
sidecar.istio.io/inject: "false"
replicas: 1
resources:
requests:
cpu: 1
memory: 2Gi
limits:
cpu: 1
memory: 2Gi
config: |
datacache_disk_size = 80%
storageSpec:
storageClassName: "gp3"
storageSize: 1Ti
storageCount: 2
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["dock"]
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
And this is my starrocks-operator values.yaml file:
prefix: kubvir
nameOverride: kubvir-asd12-starrocks
starrocksOperator:
watchNamespace: asd12
imagePullPolicy: IfNotPresent
replicaCount: 1
resources:
limits:
cpu: 600m
memory: 800Mi
requests:
cpu: 600m
memory: 400Mi
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["dock"]
- key: karpenter.sh/capacity-type
operator: In
values: [ "on-demand" ]
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linuxRocky
02/19/2026, 7:24 AMAccess denied errors.
Based on the error logs and your values.yaml, here is what’s likely happening and how to fix it.
The Root Cause
The error ERROR 1045 (28000): Access denied for user 'root' (using password: YES) across your FE pods, CN pods, and manual mysql client indicates that the StarRocks Frontends (FEs) are rejecting the password provided in your Kubernetes secret starrocks-root-password.
The initpwd job log Password error, believed to have been changed, exiting normally is a specific fallback: it tried to log in with no password (default) and failed, then tried to log in with the password in your secret and also failed. It then assumed the password was already changed manually and stopped trying.
Potential Solutions
1. Check for Trailing Newlines in the Secret
This is the most common issue when syncing secrets from AWS Secret Manager to Kubernetes. If your secret value has a trailing newline (often added by editors or shell commands), the password will be "yourpassword\n", which causes authentication to fail.
Check the actual value being used by running:
bash
kubectl get secret starrocks-root-password -n asd12 -o jsonpath='{.data.password}' | base64 --decode | cat -e
If you see a $ at the end of the line like mypassword$, it's correct. If you see mypassword% or a blank line after it, there is a hidden character.
2. Password Mismatch (Initial vs. Current)
The initPassword job only successfully sets the password once during the very first initialization of the cluster metadata.
* If you deployed the cluster once, then changed the secret value later, the initpwd job will not update the password in the database.
_ The CN pods and other FE pods use the current secret to try and join the cluster. If the FE is still expecting the _old* password, you will see these Access denied errors.
To fix this:
If you don't know the original password or want to reset:
1. Try to log in manually via mysql with no password (just in case it never set):
mysql -h <fe_ip> -P 9030 -u root
2. If you know the "old" password, log in and manually change it to match your secret:
SET PASSWORD FOR 'root' = PASSWORD('your_new_password_from_secret');
3. Verify Secret Key
In your values.yaml, you correctly specified:
yaml
initPassword:
enabled: true
passwordSecret: starrocks-root-password
Ensure the Kubernetes secret in namespace asd12 looks exactly like this:
yaml
apiVersion: v1
kind: Secret
metadata:
name: starrocks-root-password
namespace: asd12
type: Opaque
data:
password: <base64-encoded-password> # The key MUST be 'password'
Steps to Recover
1. Identify the working password: Try logging in with the password you think it is using the mysql client. If that fails, try logging in with an empty password.
2. Synchronize: Once you get into the mysql prompt, run the SET PASSWORD command to ensure the DB matches your Kubernetes secret.
3. Restart Pods: After the password in the DB matches the secret, the CN pods and FE-1/FE-2 should automatically succeed on their next retry. You might want to restart them to speed it up:
kubectl rollout restart statefulset kube-starrocks-fe -n asd12
kubectl rollout restart statefulset kube-starrocks-cn -n asd12
Tip: Since you are using shared_data (S3) mode, if this is a brand new environment and you have no data, the "cleanest" way to fix a corrupted initialization is to delete the StarRocks cluster and the data in your S3 path, then redeploy with the correct secret from the start.
References
• quick_start/helm.md
• loading/Kafka-connector-starrocks.md
• loading/Spark-connector-starrocks.mdRocky
02/19/2026, 7:24 AMRocky
02/19/2026, 7:25 AMroot user in your StarRocks cluster already has a password set, but it does not match the password stored in your Kubernetes secret starrocks-root-password.
Why this is happening
1. Existing Metadata (Shared Data Mode): You are using run_mode = shared_data with an S3 path kubvir-asd12-starrocks-data/. If this S3 bucket/path was used by a previous StarRocks deployment, the FE (Frontend) recovered the metadata from S3. This metadata includes the root user's password from that previous session.
2. Init Job Logic: The kube-starrocks-initpwd job works like this:
• It first tries to connect using the password in your secret. If it fails, it assumes the password hasn't been set yet.
• It then tries to connect with no password (default).
• Since your log shows Access denied for user 'root' (using password: NO), it means the FE already has a password.
• The job then prints Password error, believed to have been changed, exiting normally and exits. It doesn't update the password because it can't log in.
3. CN and FE Health Checks: The CN (Compute Node) and other FE pods use the password from your secret to perform administrative tasks (like adding themselves to the cluster or checking leader status). Because the password in your secret is wrong relative to the FE's metadata, they are being rejected with Access denied.
How to Fix
Option 1: If this is a fresh deployment
If you intended to start a completely new cluster and don't care about old data:
1. Uninstall the Helm chart.
2. Clear the S3 path: Delete all contents in <s3://kubvir-asd12-starrocks-data/>.
3. Delete FE PVCs (if any): kubectl delete pvc -l "<http://starrocks.com/cluster-name=kube-starrocks|starrocks.com/cluster-name=kube-starrocks>".
4. Reinstall the Helm chart. This will allow the cluster to initialize with an empty password, and the initPassword job will successfully set it to "password".
Option 2: If you want to keep your data (Reset the password)
If you need the data in S3 but don't know the old password, you must bypass authentication to reset it:
1. Disable Auth Check: Update your values.yaml to disable authentication in the FE config:
yaml
starrocksFESpec:
config: |
run_mode = shared_data
enable_auth_check = false
... (rest of your config)
2. Apply the change: helm upgrade ... and wait for the FE pods to restart.
3. Log in without a password: Use a temporary pod or your local terminal:
bash
mysql -h kube-starrocks-fe-service.dockprivileged.svc.cluster.local -P 9030 -u root
4. Reset the password: Manually set the password to match your secret:
sql
SET PASSWORD FOR 'root' = PASSWORD('password');
5. Re-enable Auth Check: Remove enable_auth_check = false from your values.yaml and run helm upgrade again.
Option 3: Check for hidden characters in the Secret
If you believe the password should be "password", check if your AWS Secrets Manager sync process added a newline or quotes.
Run this command to see the raw value:
bash
kubectl get secret starrocks-root-password -n asd12 -o jsonpath='{.data.password}' | base64 -d | cat -e
If you see a $ at the end like password$, it's correct. If you see something like password^M$ or a gap, there's a hidden newline character causing the mismatch.
References
• faq/Others.md
• administration/user_privs/authentication/native_authentication.md
• administration/Meta_recovery.md
• sql-reference/Error_code.mdRumit Jain
02/19/2026, 7:27 AMRocky
02/19/2026, 7:27 AMvalues.yaml files here.
To give you a quick check while you're getting those ready, here are the most common things I look for in a StarRocks Helm configuration:
1. Unified Chart (kube-starrocks) vs. Separate Charts
If you are using the unified kube-starrocks chart, your file should generally follow this structure:
yaml
# Operator configuration
starrocksOperator:
enabled: true
replicaCount: 1
# Cluster configuration
starrocks:
starrocksFESpec:
replicas: 3
storageSpec:
name: fe-meta
storageSize: 10Gi
starrocksBeSpec:
replicas: 3
storageSpec:
name: be-data
storageSize: 100Gi
2. Key Items to Verify:
* Persistence: Ensure storageSpec is defined for both starrocksFESpec and starrocksBeSpec. Without this, your data (BE) and metadata (FE) will be lost if pods restart.
* Resources: BE nodes typically require more memory than FE nodes. A common pitfall is setting memory requests too low (e.g., < 4Gi for BE), which can cause the process to fail on startup.
* Init Password: If you want to automate the root password, check that starrocks.initPassword.enabled is true and the secret exists.
* Service Types: If you are on a cloud provider and want external access, ensure service.type is set to LoadBalancer.
Please share your files and I'll check them for any syntax or configuration errors!
References
• quick_start/helm.mdRumit Jain
02/19/2026, 7:28 AMprefix: kubvir
nameOverride: kubvir-asd12-starrocks
starrocksOperator:
watchNamespace: asd12
imagePullPolicy: IfNotPresent
replicaCount: 1
resources:
limits:
cpu: 600m
memory: 800Mi
requests:
cpu: 600m
memory: 400Mi
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["dock"]
- key: karpenter.sh/capacity-type
operator: In
values: [ "on-demand" ]
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
This is my values.yaml file of starrocks cluster in helm chart:
prefix: kubvir
metrics:
serviceMonitor:
enabled: true
starrocksCluster:
namespace: "asd12"
enabledBe: false
enabledCn: true
componentValues:
serviceAccount: kubvir-asd12-starrocks-s3-sa
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["dock"]
- key: karpenter.sh/capacity-type
operator: In
values: [ "on-demand" ]
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
initPassword:
enabled: true
passwordSecret: starrocks-root-password
# ============================================================
# FE-PROXY — EXPOSE THROUGH ALB (HTTP only)
# ============================================================
starrocksFeProxySpec:
enabled: true
annotations:
sidecar.istio.io/inject: "false"
service:
type: ClusterIP
annotations:
sidecar.istio.io/inject: "false"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["dock"]
- key: karpenter.sh/capacity-type
operator: In
values: [ "on-demand" ]
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
# ============================================================
# FE (FrontEnd Service) — EXPOSE THROUGH NLB (MySQL + HTTP)
# ============================================================
starrocksFESpec:
annotations:
sidecar.istio.io/inject: "false"
service:
type: ClusterIP
ports:
- name: query
port: 9030
- name: http
port: 8030
replicas: 3
resources:
requests:
cpu: 1
memory: 2Gi
limits:
cpu: 1
memory: 2Gi
config: |
run_mode = shared_data
cloud_native_storage_type = S3
aws_s3_path = kubvir-asd12-starrocks-data/
aws_s3_region = us-east-1
aws_s3_endpoint = <https://s3.amazonaws.com>
enable_load_volume_from_conf=true
aws_s3_use_instance_profile=false
aws_s3_use_aws_sdk_default_behavior=true
audit_log_modules = slow_query, query, connection
audit_log_json_format = true
qe_slow_log_ms = 1000
aws_s3_enable_partitioned_prefix=true
aws_s3_num_partitioned_prefix=64
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["dock"]
- key: karpenter.sh/capacity-type
operator: In
values: [ "on-demand" ]
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
# ============================================================
# CN (Compute Node)
# ============================================================
starrocksCnSpec:
annotations:
sidecar.istio.io/inject: "false"
replicas: 1
resources:
requests:
cpu: 1
memory: 2Gi
limits:
cpu: 1
memory: 2Gi
config: |
datacache_disk_size = 80%
storageSpec:
storageClassName: "gp3"
storageSize: 1Ti
storageCount: 2
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["dock"]
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linuxRocky
02/19/2026, 7:29 AMvalues.yaml configurations. Overall, you are on the right track with a shared-data (cloud-native) architecture using S3.
However, there are a few points you should adjust to ensure the configuration works correctly with the StarRocks Operator and Helm charts.
1. ServiceAccount Configuration
In your cluster values, you have serviceAccount under a starrocksCluster.componentValues block. In the official StarRocks Operator and Helm charts, the serviceAccount must be specified inside each component's spec (starrocksFESpec and starrocksCnSpec) so the pods can correctly assume the IAM role for S3 access.
Recommended Change:
yaml
starrocksFESpec:
serviceAccount: kubvir-asd12-starrocks-s3-sa
# ... rest of FE spec
starrocksCnSpec:
serviceAccount: kubvir-asd12-starrocks-s3-sa
# ... rest of CN spec
2. S3 Shared-Data Configuration
Your FE configuration for S3 looks mostly correct for an AWS IRSA (IAM Roles for Service Accounts) setup.
* run_mode = shared_data is correct.
* aws_s3_use_aws_sdk_default_behavior = true is correct for IRSA.
* Note on `aws_s3_path`: Ensure this contains the bucket name, e.g., my-bucket-name/sub-path/.
* Missing Port: In some versions, you might need to specify cloud_native_meta_port = 6090 in the FE config (though 6090 is the default).
3. Exposing via NLB/ALB
You've set service.type: ClusterIP for both FE and FE Proxy, but your comments mention exposing through ALB/NLB.
* If you want Kubernetes to automatically provision an AWS Load Balancer, you must change type: ClusterIP to type: LoadBalancer.
* For an NLB, add the annotation: <http://service.beta.kubernetes.io/aws-load-balancer-type|service.beta.kubernetes.io/aws-load-balancer-type>: "external" and <http://service.beta.kubernetes.io/aws-load-balancer-nlb-target-type|service.beta.kubernetes.io/aws-load-balancer-nlb-target-type>: "instance" (or IP).
4. Node Affinity Labels
In your affinity section, you use:
yaml
- key: namespace
operator: In
values: ["dock"]
Standard Kubernetes nodes do not have a namespace label by default. Check if your nodes are manually labeled with namespace=dock. If you intended to target nodes in a specific pool, you might want to use <http://topology.kubernetes.io/zone|topology.kubernetes.io/zone> or a custom label like workload-type.
5. CN Cache Storage
You've configured storageSpec with storageCount: 2 for the CN.
* In shared_data mode, CNs use this storage for Data Caching.
* The operator will mount these volumes. By default, it uses /opt/starrocks/cn/storage.
* Since you have storageCount: 2, ensure your cn.conf (under starrocksCnSpec.config) points to the correct paths if you want to use both disks, or the operator will manage the default path. Your current datacache_disk_size = 80% is a great way to manage cache size.
Summary of refined starrocksCluster values:
yaml
# Note: Ensure these are at the top level if using the official starrocks-cluster chart
starrocksFESpec:
serviceAccount: kubvir-asd12-starrocks-s3-sa
replicas: 3
service:
type: LoadBalancer # Change to LoadBalancer for NLB/ALB
annotations:
<http://service.beta.kubernetes.io/aws-load-balancer-type|service.beta.kubernetes.io/aws-load-balancer-type>: "nlb" # Example for NLB
config: |
run_mode = shared_data
cloud_native_storage_type = S3
aws_s3_path = your-bucket-name/kubvir-asd12-starrocks-data/
aws_s3_region = us-east-1
aws_s3_endpoint = <https://s3.amazonaws.com>
aws_s3_use_aws_sdk_default_behavior = true
enable_load_volume_from_conf = true
# ... other configs
# ... affinity
starrocksCnSpec:
serviceAccount: kubvir-asd12-starrocks-s3-sa
replicas: 1
config: |
datacache_disk_size = 80%
storageSpec:
storageClassName: "gp3"
storageSize: 1Ti
storageCount: 2
# ... affinity
One final check: Ensure the namespace asd12 exists and the Secret starrocks-root-password is created in that namespace before deploying.
References
• quick_start/helm.mdRocky
02/19/2026, 7:29 AMRumit Jain
02/19/2026, 7:32 AMRocky
02/19/2026, 7:32 AMnameOverride follows standard Helm conventions but serves a specific role for each component.
1. Purpose of nameOverride
The nameOverride parameter is used to replace the chart name in the resource names generated by Helm.
By default, Helm resource names are often constructed as {{ .Release.Name }}-{{ .Chart.Name }}.
* In the Operator chart: Using nameOverride will change the name of the Operator's Deployment, ServiceAccount, and RBAC roles. For example, if your release is named sr and you set nameOverride: "my-op", the pod might be named sr-my-op-xxxx.
* In the Cluster chart: Using nameOverride changes the name of the StarRocksCluster Custom Resource (CR) and the labels associated with it.
2. Do you need to give the same name in both?
No, you do not need to use the same nameOverride for both the Operator and the Cluster.
The StarRocks Operator and the StarRocks Cluster are separate entities:
* Independence: The Operator is a controller. It watches for any resource of type StarRocksCluster within its permitted namespaces. It does not care if its own name matches the cluster's name.
* Multi-cluster management: One Operator can manage multiple StarRocks clusters in the same or different namespaces. In this scenario, each cluster would naturally have a different name while the operator maintains its own unique name.
Recommendation
If you are using the combined kube-starrocks Helm chart (which installs both the operator and a cluster at once):
* Use fullnameOverride if you want a specific name: If you want the cluster and operator to have specific, predictable names regardless of the Helm release name, fullnameOverride is generally preferred over nameOverride.
* Consistency: While not required, many users keep them similar (e.g., sr-operator and sr-cluster) just for organizational clarity and easier filtering when running kubectl get pods.
Example values.yaml structure:
yaml
operator:
nameOverride: "sr-controller" # Affects operator resources
starrocks:
nameOverride: "sr-db" # Affects the StarRocksCluster CR and FE/BE pods
In this case, the operator will still successfully find and manage the sr-db cluster because it identifies it by its Kind (StarRocksCluster), not by its name.
References
• quick_start/helm.md
• deployment/helm.mdRumit Jain
02/19/2026, 9:48 AMERROR 1064 (HY000): fail to create tablet: 10001: [Internal error: starlet err [RequestID=7ZY2PXDXZVB86QWS][StatusCode=403]Put object <s3://kubvir-asd21-starrocks-data/22250c75-5a5d-4751-a729-7648bfc8379e/db10309/12943/12945/SCHEMA_0000000000003290> error: User: arn:aws:sts::11111111111:assumed-role/kubvir_dock_role/i-0b2bf12312337d7f3ec is not authorized to perform: s3:PutObject on resource: "arn:aws:s3:::kubvir-asd21-starrocks-data/22250c75-5a5d-4751-a729-7648bfc8379e/db10309/12943/12945/SCHEMA_000000000000329
This is my fe conf:
starrocksFESpec:
annotations:
<http://sidecar.istio.io/inject|sidecar.istio.io/inject>: "false"
service:
type: ClusterIP
ports:
- name: query
port: 9030
- name: http
port: 8030
replicas: 3
config: |
run_mode = shared_data
cloud_native_storage_type = S3
aws_s3_path = kubvir-asd21-starrocks-data/
aws_s3_region = us-east-1
aws_s3_endpoint = <https://s3.amazonaws.com>
enable_load_volume_from_conf=true
aws_s3_use_instance_profile=false
aws_s3_use_aws_sdk_default_behavior=true
audit_log_modules = slow_query, query, connection
audit_log_json_format = true
qe_slow_log_ms = 1000
aws_s3_enable_partitioned_prefix=true
aws_s3_num_partitioned_prefix=64
Although i used same configuration to create ckuster in another namespace where it is running fine.
Only common part is instance role kubvir_dock_role but I am using ServiceAccount and attached a role to it which has access to the bucket.Rocky
02/19/2026, 9:49 AM403 Forbidden for s3:PutObject indicates that the request is being denied by AWS S3 because the IAM identity performing the action lacks sufficient permissions.
Crucially, the identity in your error message is:
arn:aws:sts::11111111111:assumed-role/kubvir_dock_role/i-0b2bf12312337d7f3ec
This is the IAM Instance Profile role attached to the EC2 worker node, not the ServiceAccount role you intended to use. This means your StarRocks CN/FE pods are falling back to the node's permissions because they are unable to assume the IAM role via IRSA (IAM Roles for Service Accounts).
Why this is happening
When you set aws_s3_use_aws_sdk_default_behavior=true, StarRocks uses the standard AWS SDK credential provider chain. In EKS, this chain tries to use the ServiceAccount's Web Identity Token first. If that fails, it falls back to the Instance Profile.
Since you mentioned this works in another namespace but not here, the most likely causes are:
1. IAM Trust Policy Namespace Restriction
IAM Roles used for IRSA have a Trust Relationship (Trust Policy) that explicitly binds the IAM role to a specific Kubernetes ServiceAccount and Namespace.
If you moved to a new namespace, you must update the IAM Role's Trust Policy to allow the ServiceAccount in the new namespace.
* Check: Go to the AWS IAM Console, find the role attached to your ServiceAccount, and check the "Trust relationships" tab. It should look like this:
json
"StringEquals": {
"oidc.eks.<region>.<http://amazonaws.com/id/<OIDC_ID>:sub|amazonaws.com/id/<OIDC_ID>:sub>": [
"system:serviceaccount:<old-namespace>:<serviceaccount-name>",
"system:serviceaccount:<new-namespace>:<serviceaccount-name>"
]
}
If your new namespace is not listed, the assume-role request will fail, and StarRocks will fall back to the Instance Profile.
2. ServiceAccount missing in CN Spec
In shared-data mode, the CN (Compute Node) is the component that performs the actual write operations to S3 during tablet creation.
* Check: Ensure that your starrocksCNSpec also has the serviceAccountName field set to the same ServiceAccount as the FE.
yaml
starrocksCNSpec:
serviceAccountName: <your-service-account>
config: |
run_mode = shared_data
aws_s3_use_aws_sdk_default_behavior = true
# ... other configs
3. IRSA Environment Variables Injection
The EKS Pod Identity Webhook must inject AWS_ROLE_ARN and AWS_WEB_IDENTITY_TOKEN_FILE into the pods.
* Check: Run kubectl describe pod <cn-pod-name> -n <namespace> and look for these environment variables. If they are missing:
* Verify the ServiceAccount exists in the new namespace.
* Verify the ServiceAccount has the correct annotation: <http://eks.amazonaws.com/role-arn|eks.amazonaws.com/role-arn>: arn:aws:iam::11111111111:role/<your-role-name>.
* Restart the pods after making any changes to the ServiceAccount.
Recommended Troubleshooting Steps
1. Update the IAM Trust Policy: Add the new namespace to the IAM Role's trust relationship.
2. Verify CN Config: Ensure the CN pods have the same S3 configuration and ServiceAccount as the FE pods.
3. Confirm Identity: Run a temporary pod in the same namespace with the same ServiceAccount and try to run aws s3 ls <s3://kubvir-asd21-starrocks-data/> to see if it works.
Note: In shared_data mode, please ensure that both FE and CN have full R/W access to the S3 bucket, as they cannot delegate permissions to each other.
References
• deployment/shared_data/s3.md
• deployment/shared_data/minio.mdRumit Jain
02/19/2026, 12:48 PMRocky
02/19/2026, 12:49 PMr7g.4xlarge or larger). These provide a better memory-to-CPU ratio, which is crucial for the memory-intensive nature of StarRocks BEs.
* FE (Frontend) Nodes: General-purpose instances like the m6g or m7g series (e.g., m7g.2xlarge) are typically sufficient for FE tasks.
3. Deployment Method:
The standard binary tarballs on the StarRocks download site are often pre-built for x86 (amd64). To get the ARM-native binaries, you should pull the StarRocks artifacts Docker image for your desired version. Docker will automatically pull the ARM64 version based on your host architecture.
bash
# Example to pull the artifacts for ARM
docker pull starrocks/artifacts-ubuntu:3.3.3
You can then copy the binaries out of the container to your Graviton host.
Summary
While AVX2 is the standard for x86 vectorization, StarRocks uses equivalent instruction sets (like NEON) on ARM to achieve high performance. If you are starting a new deployment on AWS, Graviton instances (especially the r7g series) are a highly cost-effective and performant choice for StarRocks.
References
• deployment/deployment_prerequisites.md
• faq/Others.md
• deployment/plan_cluster.md
• release_notes/release-3.3.md
• deployment/prepare_deployment_files.mdRumit Jain
02/19/2026, 12:51 PMRocky
02/19/2026, 12:51 PMx86_64/amd64 and ARM64). When you deploy via Helm, the container runtime on your Kubernetes nodes will automatically detect the architecture and pull the correct linux/arm64 image for your Graviton instances.
Key points for ARM/Graviton deployment:
* Automatic Selection: The standard images used by the Helm chart (e.g., starrocks/fe-ubuntu, starrocks/be-ubuntu, and starrocks/operator) are multi-arch.
* Version Recommendation: It is recommended to use StarRocks v3.1.14, v3.2.10, v3.3.3 or later, as these versions have streamlined multi-arch support.
* Binary Tarballs: The binary distribution packages (.tar.gz) available on the download website are currently primarily for x86_64. For ARM environments, the official way to obtain binaries (if you were doing a manual non-Kubernetes install) is indeed to extract them from the Docker images. However, since you are using Helm, Kubernetes handles all of this for you.
Summary: Just configure your values.yaml as usual and run the Helm install. As long as your Kubernetes nodes are Graviton-based, the correct ARM-native version of StarRocks will be deployed automatically.
References
• quick_start/helm.md
• deployment/prepare_deployment_files.md
• developers/build-starrocks/Build_in_docker.md
• deployment/helm.mdRumit Jain
02/19/2026, 12:59 PMconfig: |
run_mode = shared_data
cloud_native_storage_type = S3
aws_s3_path = kubvir-asd21-starrocks-data/
aws_s3_region = us-east-1
aws_s3_endpoint = <https://s3.amazonaws.com>
enable_load_volume_from_conf=true
aws_s3_use_instance_profile=false
aws_s3_use_aws_sdk_default_behavior=true
audit_log_modules = slow_query, query, connection
audit_log_json_format = true
qe_slow_log_ms = 1000
aws_s3_enable_partitioned_prefix=true
aws_s3_num_partitioned_prefix=64Rocky
02/19/2026, 12:59 PMRumit Jain
02/19/2026, 1:04 PMRocky
02/19/2026, 1:04 PMsql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON
[STORAGE VOLUME <storage_volume_name>];
* If STORAGE VOLUME is not specified, the default storage volume will be used.
* The system will automatically create a snapshot whenever the FE completes a metadata checkpoint (creating a new metadata image).
2. Configuration (Optional)
You can control how often snapshots are created by adjusting the FE configuration item:
* `automated_cluster_snapshot_interval_seconds`: Controls the snapshot automation cycle. The default is 600 seconds (10 minutes).
3. Monitoring Snapshots
You can check the status of snapshots and background jobs using these system views:
sql
-- View existing snapshots
SELECT * FROM information_schema.cluster_snapshots;
-- View snapshot job progress
SELECT * FROM information_schema.cluster_snapshot_jobs;
4. How to Restore
If you need to recover a cluster from a snapshot, the general workflow is:
1. Prepare cluster_snapshot.yaml: (Optional) If your storage location or cluster topology has changed, configure this file in fe/conf/.
2. Start Leader FE: Start the Leader FE node with the --cluster_snapshot flag:
bash
./fe/bin/start_fe.sh --cluster_snapshot --daemon
3. Clean and Start other nodes: Clear the meta directories of other FE nodes and the storage_root_path of CN nodes before starting them to ensure they sync from the restored leader.
Key Things to Note:
* Storage: Historical snapshots are automatically dropped after a new one is successfully created; the system typically keeps only one valid snapshot at a time.
* Scope: A cluster snapshot includes catalogs, databases, tables, users, and privileges. It does not include local configuration files or local UDF JAR packages.
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.mdRumit Jain
02/19/2026, 1:28 PMstarrocksCluster:
enabledBe: true
enabledCn: false
# Disaster recovery configuration. If you want to enable disaster recovery, you need to set the enabled field to true.
# Note:
# 1. If you are using an existing StarRocks cluster, you need to clean up the meta of the FE component and the data of the CN
# component before enabling disaster recovery. So it is better to use an empty StarRocks cluster to start disaster recovery.
# 2. After disaster recovery, Operator will reboot the cluster as a normal cluster automatically, so if you need more checks by yourself,
# you can
# 1. Set the replicas of FE component to 1
# 2. Set enabledBe and enabledCn to be false to disable to deploy BE and CN components.
# 3. Generation field is used to run multiple times for disaster recovery. For example, if the last disaster recovery is
# not what you want, you can modify related configurations and increase the generation value to run a new disaster recovery.
disasterRecovery:
enabled: true
generation: 1
but getting this error in starrocks-operator logs. Also the FE and CN pods didn't even spined up due to this error.
2026-02-19T21:23:56.911+0800 ERROR Reconciler error {"controller": "starrockscluster", "controllerGroup": "<http://starrocks.com|starrocks.com>", "controllerKind": "StarRocksCluster", "StarRocksCluster": {"name":"kube-starrocks","namespace":"olymsre01"}, "namespace": "olymsre01", "name": "kube-starrocks", "reconcileID": "9094cae5-ce85-48c4-8890-cb47d3f3e256", "error": "cluster_snapshot.yaml is not mounted"}Rocky
02/19/2026, 1:28 PMcluster_snapshot.yaml is not mounted indicates that when you enable the disasterRecovery feature in the StarRocks Operator, it expects a configuration file named cluster_snapshot.yaml to be provided and mounted into the FE pods. This file contains the critical metadata and path information required to restore the cluster from an object storage snapshot.
To resolve this, you need to create a Kubernetes ConfigMap containing your snapshot details and reference it in your Helm configuration.
Step 1: Create the cluster_snapshot.yaml ConfigMap
You must create a ConfigMap in the same namespace as your StarRocks cluster. The key in the ConfigMap must be named cluster_snapshot.yaml.
bash
kubectl create configmap dr-snapshot-config \
--from-literal=cluster_snapshot.yaml='
cluster_snapshot:
# The URI of the snapshot in your object storage
cluster_snapshot_path: <s3://your-bucket/starrocks/meta/image/automated_cluster_snapshot_1704038400000>
# The name of the storage volume. Must match the original cluster.
storage_volume_name: your_s3_volume
# Optional: define frontends and compute_nodes if the topology has changed
storage_volumes:
- name: your_s3_volume
type: S3
location: <s3://your-bucket/starrocks/>
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.endpoint
value: <https://s3.us-east-1.amazonaws.com>
- key: aws.s3.access_key
value: <your-access-key>
- key: aws.s3.secret_key
value: <your-secret-key>
' -n <your-namespace>
Step 2: Update values.yaml
Reference the name of the ConfigMap you created in the disasterRecovery section of your values.yaml using the configMapName field:
yaml
starrocksCluster:
enabledBe: true
enabledCn: false
# Disaster recovery configuration.
disasterRecovery:
enabled: true
configMapName: dr-snapshot-config # <--- Add this line
generation: 1
Key Considerations
1. Shared-Data Clusters Only: The disasterRecovery (Cluster Snapshot) feature is designed for shared-data clusters (available from v3.4.2+). Ensure your runMode is set to shared_data.
2. Clean State: As mentioned in the comments of your config, it is highly recommended to start with an empty cluster. If you are reusing existing PVs, you must clean the meta directory of the FE and the storage directory of the BE/CN before enabling DR.
3. Automatic Reboot: Once the Operator completes the restoration using the snapshot, it will automatically remove the DR flags and reboot the pods as a normal cluster.
4. Generation Field: If a recovery attempt fails or you need to retry with a different snapshot, increment the generation value to trigger a fresh reconciliation.
After applying these changes, the Operator will mount the ConfigMap to the FE pods, and the pods should start correctly to begin the recovery process.
References
• administration/cluster_snapshot.md
• quick_start/helm.md
• administration/management/FE_configuration.md
• administration/management/Backup_and_restore.md
• deployment/shared_data/minio.mdRumit Jain
02/19/2026, 5:09 PMconfig: |
run_mode = shared_data
cloud_native_storage_type = S3
aws_s3_path = kubvir-asd21-starrocks-data/
aws_s3_region = us-east-1
aws_s3_endpoint = <https://s3.amazonaws.com>
enable_load_volume_from_conf=true
aws_s3_use_instance_profile=false
aws_s3_use_aws_sdk_default_behavior=true
audit_log_modules = slow_query, query, connection
audit_log_json_format = true
qe_slow_log_ms = 1000
aws_s3_enable_partitioned_prefix=true
aws_s3_num_partitioned_prefix=64
automated_cluster_snapshot_interval_seconds=60
LOG_DIR = ${STARROCKS_HOME}/log
DATE = "$(date +%Y%m%d-%H%M%S)"
But getting this:
SELECT * FROM INFORMATION_SCHEMA.CLUSTER_SNAPSHOT_JOBS;
| automated_cluster_snapshot_1771520589227 | 13521 | 2026-02-20 01:03:09 | NULL | ERROR | | upload image failed, err msg: Failed to copy local /opt/starrocks/fe/meta/image to <s3://kubvir-asd21-starrocks-data//260ee2c5-942b-44c2-bef5-6c32add6187c/meta/image/automated_cluster_snapshot_1771520589227> |
Seeing these logs in fe.warn:
2026-02-20 00:00:08.943+08:00 WARN (replayer|102) [ClusterSnapshotMgr.replayLog():429] Invalid Cluster Snapshot Log Type UPDATE_SNAPSHOT_JOB
2026-02-20 00:00:08.954+08:00 WARN (replayer|102) [ClusterSnapshotMgr.replayLog():429] Invalid Cluster Snapshot Log Type UPDATE_SNAPSHOT_JOB
2026-02-20 00:00:09.150+08:00 WARN (global_state_checkpoint_worker|103) [ColocateTableIndex.cleanupInvalidDbOrTable():940] remove 0 invalid tableid: []
2026-02-20 00:00:09.280+08:00 WARN (global_state_checkpoint_worker|103) [GlobalStateMgr.loadImage():1675] Miss meta block [20001], This may not be a fatal error. It may be because there are new features in the version you upgraded this time, but there is no relevant metadata.Rocky
02/19/2026, 5:10 PMupload image failed, err msg: Failed to copy local /opt/starrocks/fe/meta/image to <s3://...> indicates that the Leader FE node is unable to upload its local metadata image to the S3 bucket configured for your shared-data cluster.
This issue typically arises due to one of the following reasons in a shared-data (Cloud-Native) environment:
1. S3 Permission Issues on FE
In shared-data clusters, while CN nodes handle data, the Leader FE node is responsible for uploading the metadata snapshots. Even if your CNs can access S3, the FE process must also have the necessary permissions.
* Since you have aws_s3_use_instance_profile=false and aws_s3_use_aws_sdk_default_behavior=true, the FE is looking for credentials in environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) or the default AWS credentials file (~/.aws/credentials) on the FE host.
* Solution: Ensure the FE process has valid AWS credentials available in its environment. Alternatively, if you are running on EC2 or EKS, it is highly recommended to use IAM Roles (set aws_s3_use_instance_profile=true).
2. Mismatched S3 Path or Configuration
Looking at your error message and configuration:
* Your config says: aws_s3_path = kubvir-asd21-starrocks-data/
* The error says: <s3://srekubvir-olymsre01-starrocks-data//260ee2c5>...
There is a discrepancy between the bucket name in your config and the bucket name in the error message. This suggests the cluster might be using a Default Storage Volume that was created with different parameters than what you provided in the fe.conf.
* Action: Check your existing storage volumes by running:
sql
SHOW STORAGE VOLUMES;
If the default volume does not match your intended S3 path, you should create a new storage volume with the correct credentials and path, then set it for snapshots:
sql
CREATE STORAGE VOLUME my_snapshot_volume
TYPE = S3
LOCATIONS = ("<s3://kubvir-asd21-starrocks-data/>")
PROPERTIES (
"aws.s3.region" = "us-east-1",
"aws.s3.use_instance_profile" = "false",
"aws.s3.access_key" = "YOUR_AK",
"aws.s3.secret_key" = "YOUR_SK"
);
-- Enable snapshots using the specific volume
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME my_snapshot_volume;
3. Double Slash in S3 Path
The error path shows a double slash: <s3://bucket_name//uuid/>....
* This can sometimes happen if aws_s3_path in fe.conf is just the bucket name or if there's an extra slash in the configuration.
* Action: Try setting aws_s3_path without a trailing slash (e.g., kubvir-asd21-starrocks-data) or ensure the storage volume location is properly formatted.
4. FE Version and Feature Status
Cluster Snapshot is a Beta feature introduced in version 3.4.2.
* Ensure all your FE and CN nodes are on version 3.4.2 or higher.
* Check the Leader FE's fe.log for more detailed stack traces. Look for "failed to upload image" or "S3Exception" to see the specific reason (e.g., 403 Forbidden, 404 Not Found, or DNS resolution issues).
Recommended Next Steps:
1. Verify the FE can reach the S3 endpoint (check network connectivity and DNS from the FE pod/host).
2. Explicitly create a STORAGE VOLUME with hardcoded credentials (for testing) to rule out environment variable/IAM role issues.
3. Check fe.log for the specific AWS SDK error code.
References
• administration/cluster_snapshot.md
• administration/management/FE_configuration.mdRocky
02/19/2026, 5:10 PM<s3://...> and your config snippet has:
properties
aws_s3_endpoint = <https://s3.amazonaws.com>
aws_s3_path = kubvir-asd21-starrocks-data/
If you literally have the angle brackets < and > in your fe.conf, StarRocks will treat them as part of the URL/Path, which will cause the upload to fail. Also, the trailing slash in aws_s3_path is likely causing the double slash // seen in the error message.
Recommended fix:
Remove the angle brackets and the trailing slash:
properties
aws_s3_endpoint = <https://s3.amazonaws.com>
aws_s3_path = kubvir-asd21-starrocks-data
2. Permissions (IAM/S3 Policy)
Since you are using aws_s3_use_aws_sdk_default_behavior=true, the FE process needs to have permission to write to the S3 bucket. Ensure that the IAM role attached to the FE node (if using an instance profile) or the credentials in your environment have the following permissions for the bucket `kubvir-asd21-starrocks-data`:
* s3:PutObject
* s3:GetObject
* s3:ListBucket
* s3:DeleteObject (for snapshot rotation)
3. Check for Local Metadata Image
The snapshot process tries to copy the local metadata image from /opt/starrocks/fe/meta/image.
* Verify that the FE has actually created a checkpoint image in that directory.
* Ensure the user running the StarRocks FE process has read permissions for that directory and its contents.
4. Configuration Syntax
In your snippet, you have:
DATE = "$(date +%Y%m%d-%H%M%S)"
This looks like a shell command. StarRocks fe.conf does not support shell execution or dynamic variables like this. While this might not cause the S3 upload to fail directly, it is invalid syntax for a StarRocks configuration file and might lead to other issues.
Summary Checklist:
1. Correct `fe.conf`:
properties
aws_s3_endpoint = <https://s3.amazonaws.com>
aws_s3_path = kubvir-asd21-starrocks-data
aws_s3_region = us-east-1
2. Verify Permissions: Can you manually upload a file to that S3 path from the same machine using the AWS CLI?
bash
aws s3 cp some_file <s3://kubvir-asd21-starrocks-data/test_upload> --region us-east-1
3. Check FE Logs: Look at fe.log (and fe.warn.log) for a more detailed Java stack trace around the time of the error. It will often reveal if it was a 403 Forbidden, UnknownHostException, or a specific SDK error.
Give those changes a try and let me know if the error persists!
References
• release_notes/release-3.1.md
• release_notes/release-2.5.md
• loading/s3.md
• release_notes/release-2.0.md
• deployment/shared_data/s3.mdRocky
02/19/2026, 5:14 PMInvalid Cluster Snapshot Log Type UPDATE_SNAPSHOT_JOB often occurs if the FE replayer encounters a metadata log type it doesn't fully recognize, which can happen if there's a version mismatch or if you're using a version where this feature wasn't fully stabilized.
2. S3 Permission and Path Issues
The error upload image failed, err msg: Failed to copy local /opt/starrocks/fe/meta/image to <s3://...> indicates that the FE process does not have permission to write to the specified S3 bucket or there is a path configuration issue.
* Trailing Slash in aws_s3_path: You have aws_s3_path = kubvir-asd21-starrocks-data/. Notice the error message shows a double slash: <s3://kubvir-asd21-starrocks-data//260ee2c5>.... While S3 usually handles this, it's best to remove the trailing slash in your configuration:
properties
aws_s3_path = kubvir-asd21-starrocks-data
* Authentication Method: You set aws_s3_use_instance_profile=false but aws_s3_use_aws_sdk_default_behavior=true.
* If your FE is running on an EC2 instance with an IAM role, you should generally set aws_s3_use_instance_profile=true.
* If you are relying on environment variables or a credentials file, ensure the user running the FE process has access to them.
* Write Permissions: Ensure the IAM policy associated with your credentials has s3:PutObject and s3:ListBucket permissions for the bucket kubvir-asd21-starrocks-data.
3. Metadata Warnings
* Miss meta block [20001]: Block 20001 corresponds to the ClusterSnapshotMgr. This warning is typically "non-fatal" during the first startup after enabling snapshots or during an upgrade because the old metadata image does not yet contain the snapshot manager's state. Once a successful snapshot is taken and a new checkpoint is created, this warning should disappear.
* Invalid Cluster Snapshot Log Type UPDATE_SNAPSHOT_JOB: This is more suspicious. If you have multiple FEs, please ensure all FE nodes are running the exact same version. If the Leader FE is a newer version than a Follower, the Follower might fail to replay logs it doesn't understand.
4. Configuration Tips
* Interval: You have automated_cluster_snapshot_interval_seconds=60. This is quite frequent (the default is 600s). For troubleshooting, you might want to increase this to avoid overlapping jobs while you debug the S3 connection.
* Storage Volume: In v3.4+, it is recommended to manage storage using Storage Volumes. If you haven't already, try creating a storage volume and then enabling snapshots using it:
sql
CREATE STORAGE VOLUME s3_volume
TYPE = S3
LOCATIONS = ("<s3://kubvir-asd21-starrocks-data/>")
PROPERTIES (
"aws.s3.region" = "us-east-1",
"aws.s3.endpoint" = "<https://s3.amazonaws.com>",
"aws.s3.use_instance_profile" = "true" -- or your specific auth
);
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME s3_volume;
Summary of recommended actions:
1. Confirm you are on version v3.4.2+.
2. Remove the trailing slash from aws_s3_path.
3. Explicitly check that the FE has Write permissions to the S3 bucket.
4. Check if setting aws_s3_use_instance_profile=true (if applicable) resolves the credential issue.
If the "upload image failed" error persists, please check the fe.log (not just fe.warn) for the underlying S3 SDK error (like a 403 Forbidden or a 404 Not Found), which will provide more detail.
ReferencesRocky
02/19/2026, 5:14 PMRumit Jain
02/19/2026, 5:15 PMADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME builtin_storage_volume;Rocky
02/19/2026, 5:15 PMbuiltin_storage_volume, here is what happens next and how you can manage it:
1. How it works
* Automatic Generation: StarRocks will now automatically create a cluster snapshot every time the FE (Frontend) creates a new metadata image (after a metadata checkpoint).
* Interval: By default, this happens roughly every 600 seconds (10 minutes). This is controlled by the FE configuration automated_cluster_snapshot_interval_seconds.
* Retention: The system keeps only the latest snapshot. Historical snapshots are automatically purged as soon as a new one is successfully created to save space.
2. How to verify
You can check the status and location of your snapshots using the following system views:
* View existing snapshots:
sql
SELECT * FROM information_schema.cluster_snapshots;
* Monitor the snapshot jobs:
sql
SELECT * FROM information_schema.cluster_snapshot_jobs;
3. Important Notes
* Shared-data Only: This feature is currently only available for shared-data clusters (starting from version 3.4.2).
* Snapshot Contents: It captures the full state of the cluster, including catalogs, databases, tables, users, and permissions.
* Storage Path: Your metadata snapshots will be stored in your storage volume under a path similar to:
/{storage_volume_location}/{service_id}/meta/image/automated_cluster_snapshot_{timestamp}.
If you ever need to disable it, you can run:
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT OFF;
References
• administration/cluster_snapshot.md
• administration/management/BE_configuration.mdRumit Jain
02/19/2026, 5:37 PM2026-02-20 01:34:48.451+08:00 INFO (cluster_snapshot_checkpoint_scheduler|145) [CheckpointController.deleteOldJournals():390] journals <= 359 with prefix [] are deleted. image version 359, other nodes min version 361
2026-02-20 01:34:48.451+08:00 INFO (cluster_snapshot_checkpoint_scheduler|145) [ClusterSnapshotCheckpointScheduler.runCheckpointScheduler():112] Finished create image for FE image, version: 359
2026-02-20 01:34:48.452+08:00 INFO (cluster_snapshot_checkpoint_scheduler|145) [ClusterSnapshotCheckpointScheduler.runCheckpointScheduler():128] Finished create image for starMgr image, version: 175
2026-02-20 01:34:48.473+08:00 ERROR (cluster_snapshot_checkpoint_scheduler|145) [HdfsFsManager.copyFromLocal():1228] Exception while copy local /opt/starrocks/fe/meta/image to <s3://kubvir-asd21-starrocks-data//a5f0444f-929d-4174-ada0-faef4f60b759/meta/image/automated_cluster_snapshot_1771522484341>
java.lang.IllegalArgumentException: Wrong FS <s3://a5f0444f-929d-4174-ada0-faef4f60b759//meta/image/automated_cluster_snapshot_1771522484341> -expected <s3://kubvir-asd21-starrocks-data>
at org.apache.hadoop.fs.s3native.S3xLoginHelper.checkPath(S3xLoginHelper.java:224) ~[hadoop-aws-3.4.1.jar:?]
at org.apache.hadoop.fs.s3a.S3AFileSystem.checkPath(S3AFileSystem.java:1811) ~[hadoop-aws-3.4.1.jar:?]
at org.apache.hadoop.fs.FileSystem.makeQualified(FileSystem.java:734) ~[starrocks-hadoop-ext.jar:?]
at org.apache.hadoop.fs.s3a.S3AFileSystem.makeQualified(S3AFileSystem.java:1773) ~[hadoop-aws-3.4.1.jar:?]
at org.apache.hadoop.fs.s3a.S3AFileSystem.qualify(S3AFileSystem.java:1799) ~[hadoop-aws-3.4.1.jar:?]
at org.apache.hadoop.fs.s3a.S3AFileSystem.innerGetFileStatus(S3AFileSystem.java:4003) ~[hadoop-aws-3.4.1.jar:?]
at org.apache.hadoop.fs.s3a.S3AFileSystem.lambda$getFileStatus$22(S3AFileSystem.java:3984) ~[hadoop-aws-3.4.1.jar:?]
at org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.invokeTrackingDuration(IOStatisticsBinding.java:547) ~[hadoop-common-3.4.1.jar:?]
at org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.lambda$trackDurationOfOperation$5(IOStatisticsBinding.java:528) ~[hadoop-common-3.4.1.jar:?]
at org.apache.hadoop.fs.statistics.impl.IOStatisticsBinding.trackDuration(IOStatisticsBinding.java:449) ~[hadoop-common-3.4.1.jar:?]
at org.apache.hadoop.fs.s3a.S3AFileSystem.trackDurationAndSpan(S3AFileSystem.java:2865) ~[hadoop-aws-3.4.1.jar:?]
at org.apache.hadoop.fs.s3a.S3AFileSystem.trackDurationAndSpan(S3AFileSystem.java:2884) ~[hadoop-aws-3.4.1.jar:?]
at org.apache.hadoop.fs.s3a.S3AFileSystem.getFileStatus(S3AFileSystem.java:3982) ~[hadoop-aws-3.4.1.jar:?]
at org.apache.hadoop.fs.FileUtil.checkDest(FileUtil.java:611) ~[hadoop-common-3.4.1.jar:?]
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:521) ~[hadoop-common-3.4.1.jar:?]
at com.starrocks.fs.hdfs.HdfsFsManager.copyFromLocal(HdfsFsManager.java:1222) ~[starrocks-fe.jar:?]
at com.starrocks.fs.hdfs.HdfsService.copyFromLocal(HdfsService.java:63) ~[starrocks-fe.jar:?]
at com.starrocks.fs.HdfsUtil.copyFromLocal(HdfsUtil.java:76) ~[starrocks-fe.jar:?]
at com.starrocks.lake.snapshot.ClusterSnapshotUtils.uploadClusterSnapshotToRemote(ClusterSnapshotUtils.java:39) ~[starrocks-fe.jar:?]
at com.starrocks.lake.snapshot.ClusterSnapshotCheckpointScheduler.runCheckpointScheduler(ClusterSnapshotCheckpointScheduler.java:134) ~[starrocks-fe.jar:?]
at com.starrocks.lake.snapshot.ClusterSnapshotCheckpointScheduler.runAfterCatalogReady(ClusterSnapshotCheckpointScheduler.java:73) ~[starrocks-fe.jar:?]
at com.starrocks.common.util.FrontendDaemon.runOneCycle(FrontendDaemon.java:78) ~[starrocks-fe.jar:?]
at com.starrocks.common.util.Daemon.run(Daemon.java:98) ~[starrocks-fe.jar:?]
2026-02-20 01:34:48.493+08:00 WARN (cluster_snapshot_checkpoint_scheduler|145) [ClusterSnapshotCheckpointScheduler.runCheckpointScheduler():148] Cluster Snapshot checkpoint failed: upload image failed, err msg: Failed to copy local /opt/starrocks/fe/meta/image to <s3://kubvir-asd21-starrocks-data//a5f0444f-929d-4174-ada0-faef4f60b759/meta/image/automated_cluster_snapshot_1771522484341>
This is my fe config:
config: |
run_mode = shared_data
cloud_native_storage_type = S3
aws_s3_path = kubvir-asd21-starrocks-data/
aws_s3_region = us-east-1
aws_s3_endpoint = <https://s3.amazonaws.com>
enable_load_volume_from_conf=true
aws_s3_use_instance_profile=false
aws_s3_use_aws_sdk_default_behavior=true
audit_log_modules = slow_query, query, connection
audit_log_json_format = true
qe_slow_log_ms = 1000
aws_s3_enable_partitioned_prefix=true
aws_s3_num_partitioned_prefix=64
automated_cluster_snapshot_interval_seconds=60
LOG_DIR = ${STARROCKS_HOME}/logRocky
02/19/2026, 5:38 PMjava.lang.IllegalArgumentException: Wrong FS error while StarRocks is attempting to upload a cluster snapshot to S3.
The error message and your configuration point to a path formatting issue.
The Problem
In your fe.conf, you have:
properties
aws_s3_path = kubvir-asd21-starrocks-data/
Notice the trailing slash (/) at the end of the bucket name.
When StarRocks constructs the upload path for the cluster snapshot, it joins the aws_s3_path with the cluster's unique ID and the snapshot sub-paths. Because of the trailing slash in your config, the resulting URI becomes:
<s3://kubvir-asd21-starrocks-data//a5f0444f-929d-4174-ada0-faef4f60b759/>...
The double slash (//) after the bucket name is causing the Hadoop S3A filesystem (which StarRocks uses for these metadata operations) to misinterpret the URI. It is seeing a5f0444f... (the cluster UUID) as the "authority" (the bucket name) instead of kubvir-asd21-starrocks-data. This triggers the "Wrong FS" error because the parsed bucket doesn't match the expected bucket.
The Fix
Remove the trailing slash from the aws_s3_path setting in your FE configuration:
1. Modify fe.conf:
Change:
properties
aws_s3_path = kubvir-asd21-starrocks-data/
To:
properties
aws_s3_path = kubvir-asd21-starrocks-data
2. Restart the FE node(s) for the configuration change to take effect.
Additional Recommendation
While the trailing slash is the primary cause of this specific error, it is also recommended to use a regional endpoint for S3 to ensure better performance and avoid potential redirection issues.
Since your region is us-east-1, you can update your endpoint:
properties
aws_s3_endpoint = <https://s3.us-east-1.amazonaws.com>
Let me know if you continue to see issues after removing that trailing slash!
References
• administration/cluster_snapshot.md
• deployment/shared_data/s3.mdRumit Jain
02/19/2026, 5:41 PMaws_s3_endpoint = <https://s3.us-east-1.amazonaws.com>
and
aws_s3_endpoint = <https://s3.amazonaws.com>Rocky
02/19/2026, 5:41 PM<https://s3.us-east-1.amazonaws.com> (Regional Endpoint)
* Specific Region: This explicitly points to the US East (N. Virginia) region.
* Performance: It is generally faster and more reliable for StarRocks because it avoids the overhead of DNS redirection.
* Best Practice: When configuring StarRocks (e.g., for Shared-data mode, External Tables, or FILES()), it is highly recommended to use the Regional endpoint that matches the bucket's location.
* Authentication: It works seamlessly with AWS Signature Version 4 (SigV4), which is required by many newer AWS features and regions.
2. <https://s3.amazonaws.com> (Global/Legacy Endpoint)
* Default Behavior: This is a legacy "global" endpoint. By default, it often routes requests to us-east-1, but it acts as a redirector for other regions.
* Redirection Overhead: If your bucket is in a different region (e.g., us-west-2), using the global endpoint may result in a "301 Moved Permanently" response, forcing the StarRocks storage handler to retry the request at the correct regional endpoint. This adds latency.
* Consistency: In some older AWS SDKs, the global endpoint had different behavior regarding bucket naming and path styles.
Which one should you use in StarRocks?
You should always prefer the Regional endpoint (<https://s3.us-east-1.amazonaws.com>).
When configuring StarRocks properties, ensure that your aws_s3_region and aws_s3_endpoint are consistent:
sql
-- Example using the FILES() table function
SELECT * FROM FILES(
"path" = "<s3://my-bucket/data.parquet>",
"format" = "parquet",
"aws.s3.region" = "us-east-1",
"aws.s3.endpoint" = "<https://s3.us-east-1.amazonaws.com>"
);
Key Reasons to use the Regional Endpoint in StarRocks:
1. Lower Latency: Direct connection to the region where your data resides.
2. Avoid Errors: Prevents "Bucket Region Mismatch" errors or 301 redirection issues.
3. Security: Ensures compatibility with strict IAM policies and Signature Version 4.
References
• administration/management/FE_configuration.md
• sql-reference/sql-functions/table-functions/files.md
• loading/s3.mdRumit Jain
02/19/2026, 6:27 PMstatus:
disasterRecoveryStatus:
observedGeneration: 1
phase: doing
reason: disaster recovery is in progress
startTimestamp: 1771524644
How to check whether the recovery is processing or not?Rocky
02/19/2026, 6:28 PMRESTORE job in the background. You can see the detailed progress (including percentage and current state) by running this command in your StarRocks cluster:
sql
SHOW RESTORE FROM <your_database_name>;
What to look for in the output:
* State: It will move through stages like PENDING, DOWNLOADING, COMMIT, and FINISHED. If it is stuck in DOWNLOADING for a long time, check the Progress column.
* Progress: Shows the progress of downloading snapshots from remote storage.
* TaskErrMsg: If the process has encountered an error but hasn't fully failed yet, the error message will appear here.
2. Check FE Logs
Since the Front End (FE) coordinates the restore process, its logs will contain detailed information about the tasks being dispatched to Backend (BE) nodes.
If you are on Kubernetes:
bash
kubectl logs <fe-pod-name> -n <namespace> | grep -i "restore"
Look for any "timeout" or "connection refused" errors related to your backup repository (S3, GCS, Azure, etc.).
3. Check Operator Logs
If the StarRocks cluster itself hasn't started the restore yet, the Operator might be stuck preparing the environment. Check the StarRocks Operator logs:
bash
kubectl logs -l <http://app.kubernetes.io/name=starrocks-operator|app.kubernetes.io/name=starrocks-operator> -n <operator-namespace>
4. Check Backend (BE) Progress
If the SHOW RESTORE command shows it is in the DOWNLOADING phase, the BE nodes are busy pulling data from your storage. You can check the BE logs to see if data is actually being written:
bash
kubectl logs <be-pod-name> -n <namespace> | grep -i "snapshot"
Common reasons for 20+ mins "doing" status:
* Large Data Volume: If you are restoring multiple terabytes, the DOWNLOADING phase can take a significant amount of time depending on your network bandwidth.
* Resource Contention: If the BE nodes are under heavy CPU/IO load, the restore tasks might be queued.
* Repository Connectivity: Ensure the StarRocks cluster has the correct credentials and network access to the backup repository.
If SHOW RESTORE returns an empty set or shows the job has CANCELLED, check the TaskErrMsg column for the specific reason.
References
• administration/data_migration_tool.md
• administration/management/Backup_and_restore.md
• sql-reference/sql-statements/backup_restore/SHOW_RESTORE.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• sql-reference/sql-statements/backup_restore/SHOW_BACKUP.mdRumit Jain
02/19/2026, 6:46 PMkubectl get src kube-starrocks -n asdfg -o yaml
Seeing disasterRecovery is in doing phase:
status:
disasterRecoveryStatus:
observedGeneration: 1
phase: doing
reason: disaster recovery is in progress
startTimestamp: 1771524644
phase: reconciling
starRocksCnStatus:
horizontalScaler: {}
phase: reconciling
starRocksFeProxyStatus:
phase: reconciling
starRocksFeStatus:
creatingInstances:
- kube-starrocks-fe-0
phase: reconciling
resourceNames:
- kube-starrocks-fe
serviceName: kube-starrocks-fe-service
It is more than 40mins now and still the fe pod is not cominghealthy. These are the fe logs:
[Fri Feb 20 02:40:32 CST 2026] Process conf file fe.conf ...
[Fri Feb 20 02:40:32 CST 2026] first start fe with meta not exist.
[Fri Feb 20 02:40:32 CST 2026] FE service kube-starrocks-fe-service.asdfg:9030 is not alive yet!
[Fri Feb 20 02:40:34 CST 2026] FE service kube-starrocks-fe-service.asdfg:9030 is not alive yet!
[Fri Feb 20 02:41:02 CST 2026] Timed out, no members detected ever, assume myself is the first node ..
[Fri Feb 20 02:41:02 CST 2026] first start with no meta run start_fe.sh with additional options: ' --host_type FQDN'Rocky
02/19/2026, 6:47 PMdisasterRecoveryStatus is stuck in the doing phase and the FE pod logs "meta not exist" while starting without the --cluster_snapshot flag—typically indicates that the StarRocks Operator has initiated the disaster recovery workflow but is failing to inject the necessary restore configuration into the FE pod.
In a Shared-Data cluster snapshot restore (the process described in the blog), the FE must start with the --cluster_snapshot flag and have a cluster_snapshot.yaml file in its configuration directory to know where to download the metadata from object storage.
Why this is happening
1. Missing Start Flag: Your FE logs show start_fe.sh is being called with only --host_type FQDN. For a restore to happen, it must include --cluster_snapshot.
2. Missing Configuration: If the cluster_snapshot.yaml file is not correctly mounted into /opt/starrocks/fe/conf/, the FE won't know how to reach your snapshot in S3/Object Storage.
3. Operator Version Mismatch: The disasterRecovery feature in the StarRocks Operator requires a specific version (usually v1.8.x or later). If the CRD has the field but the operator controller doesn't support the logic, it might mark the status as doing but fail to update the FE StatefulSet.
Troubleshooting Steps
1. Verify the FE Pod Specification
Check if the Operator has actually added the necessary arguments to the FE pod.
bash
kubectl get pod kube-starrocks-fe-0 -n asdfg -o yaml
Look for:
* Args/Command: Does it contain --cluster_snapshot?
* VolumeMounts: Is there a mount for cluster_snapshot.yaml at /opt/starrocks/fe/conf/cluster_snapshot.yaml?
If these are missing, the Operator's DR controller is likely failing to patch the FE StatefulSet.
2. Check Operator Logs
The "doing" phase means the Operator's DR controller is active. Check the logs of the starrocks-operator pod to see if there are errors related to generating the snapshot config or patching the cluster.
bash
kubectl logs -n <operator-namespace> -l control-plane=kube-starrocks-operator
Look for errors like failed to reconcile disaster recovery or failed to create configmap.
3. Verify your StarRocksCluster YAML
Ensure your disasterRecovery block follows the requirements. It should look something like this:
yaml
spec:
disasterRecovery:
enabled: true
clusterSnapshotPath: "<s3://your-bucket/path/to/snapshot>"
storageVolume:
name: "your-storage-volume"
# ... other storage volume details (endpoint, credentials, etc.)
* Note: The storageVolume.name must match the name of the storage volume used in the original cluster where the snapshot was taken.
4. Manual Workaround (If Operator is stuck)
If the FE is in a loop because it can't find the meta, it's likely because the Operator hasn't injected the recovery flags. If the Operator logs don't help, verify that the StarRocksCluster resource has the <http://starrocks.com/disaster-recovery|starrocks.com/disaster-recovery>: "true" annotation if required by your specific operator version.
Summary Checklist
* Operator Version: Ensure you are using StarRocks Operator v1.8.0 or newer.
* Shared-Data Mode: Confirm your cluster is running in shared-data mode (runMode: shared_data), as cluster snapshots are specifically for this mode.
* Configuration File: Inside the pod, run ls /opt/starrocks/fe/conf/cluster_snapshot.yaml. If it's missing, the restore cannot proceed.
If you find that the FE pod is simply missing the flag, you may need to update your Operator or check if there's a typo in the disasterRecovery section of your YAML that prevents the Operator from validating it.
References
• administration/Meta_recovery.md
• faq/Deploy_faq.mdRocky
02/19/2026, 6:47 PMRumit Jain
02/19/2026, 7:15 PMstarrocksCluster:
disasterRecovery:
enabled: true
generation: 1
starrocksFESpec:
configMaps:
- name: cluster-snapshot
mountPath: /opt/starrocks/fe/conf/cluster_snapshot.yaml
subPath: cluster_snapshot.yaml
configMaps:
- name: cluster-snapshot
data:
cluster_snapshot.yaml: |
cluster_snapshot:
cluster_snapshot_path: <s3://kubvir-asd21-starrocks-data/e4ed817e-0798-40a6-94b2-cd0234327463/meta/image/automated_cluster_snapshot_1771523838532>
storage_volume_name: builtin_storage_volume
frontends: []
compute_nodes: []
storage_volumes:
- name: builtin_storage_volume
type: S3
location: <s3://kubvir-asd21-starrocks-data>
comment: my s3 volume
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.endpoint
value: <https://s3.amazonaws.com>
- key: aws_s3_use_instance_profile
value: false
- key: aws_s3_use_aws_sdk_default_behavior
value: true
Not seeing anything useful in operator logs. FE pods are just giving these logs:
[Fri Feb 20 02:40:32 CST 2026] Process conf file fe.conf ...
[Fri Feb 20 02:40:32 CST 2026] first start fe with meta not exist.
[Fri Feb 20 02:40:32 CST 2026] FE service kube-starrocks-fe-service.asdfg:9030 is not alive yet!
[Fri Feb 20 02:40:34 CST 2026] FE service kube-starrocks-fe-service.asdfg:9030 is not alive yet!
[Fri Feb 20 02:41:02 CST 2026] Timed out, no members detected ever, assume myself is the first node ..
[Fri Feb 20 02:41:02 CST 2026] first start with no meta run start_fe.sh with additional options: ' --host_type FQDN'
Also the status of recovery remains in in progress
kubectl get src kube-starrocks -n asd21 -o yaml
-----
status:
disasterRecoveryStatus:
observedGeneration: 1
phase: doing
reason: disaster recovery is in progress
startTimestamp: 1771527180
phase: reconciling
starRocksCnStatus:
horizontalScaler: {}
phase: reconciling
starRocksFeProxyStatus:
phase: reconciling
starRocksFeStatus:
creatingInstances:
- kube-starrocks-fe-0
phase: reconciling
resourceNames:
- kube-starrocks-fe
serviceName: kube-starrocks-fe-serviceRocky
02/19/2026, 7:15 PMRumit Jain
02/19/2026, 7:16 PMstarrocksCluster:
disasterRecovery:
enabled: true
generation: 1
starrocksFESpec:
configMaps:
- name: cluster-snapshot
mountPath: /opt/starrocks/fe/conf/cluster_snapshot.yaml
subPath: cluster_snapshot.yaml
configMaps:
- name: cluster-snapshot
data:
cluster_snapshot.yaml: |
cluster_snapshot:
cluster_snapshot_path: <s3://kubvir-asd21-starrocks-data/e4ed817e-0798-40a6-94b2-cd0234327463/meta/image/automated_cluster_snapshot_1771523838532>
storage_volume_name: builtin_storage_volume
frontends: []
compute_nodes: []
storage_volumes:
- name: builtin_storage_volume
type: S3
location: <s3://kubvir-asd21-starrocks-data>
comment: my s3 volume
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.endpoint
value: <https://s3.amazonaws.com>
- key: aws_s3_use_instance_profile
value: false
- key: aws_s3_use_aws_sdk_default_behavior
value: true
Not seeing anything useful in operator logs. FE pods are just giving these logs:
[Fri Feb 20 02:40:32 CST 2026] Process conf file fe.conf ...
[Fri Feb 20 02:40:32 CST 2026] first start fe with meta not exist.
[Fri Feb 20 02:40:32 CST 2026] FE service kube-starrocks-fe-service.asdfg:9030 is not alive yet!
[Fri Feb 20 02:40:34 CST 2026] FE service kube-starrocks-fe-service.asdfg:9030 is not alive yet!
[Fri Feb 20 02:41:02 CST 2026] Timed out, no members detected ever, assume myself is the first node ..
[Fri Feb 20 02:41:02 CST 2026] first start with no meta run start_fe.sh with additional options: ' --host_type FQDN'
Also the status of recovery remains in in progress
kubectl get src kube-starrocks -n asd21 -o yaml
-----
status:
disasterRecoveryStatus:
observedGeneration: 1
phase: doing
reason: disaster recovery is in progress
startTimestamp: 1771527180
phase: reconciling
starRocksCnStatus:
horizontalScaler: {}
phase: reconciling
starRocksFeProxyStatus:
phase: reconciling
starRocksFeStatus:
creatingInstances:
- kube-starrocks-fe-0
phase: reconciling
resourceNames:
- kube-starrocks-fe
serviceName: kube-starrocks-fe-serviceRocky
02/19/2026, 7:17 PMvalues.yaml you provided, there are a few issues preventing the FE from starting correctly in disaster recovery mode.
1. Correct Indentation in values.yaml
In your values.yaml, the starrocksFESpec section is at the same indentation level as starrocksCluster. In the StarRocks Helm chart, starrocksFESpec must be nested under starrocksCluster.
If it's not nested correctly, the StarRocks Operator will use a default FE specification, meaning your ConfigMap (containing cluster_snapshot.yaml) is not actually mounted into the FE pod. This explains why the FE is attempting a "first start with no meta" instead of performing a recovery.
Corrected Structure:
yaml
starrocksCluster:
disasterRecovery:
enabled: true
generation: 1
starrocksFESpec: # This must be indented under starrocksCluster
configMaps:
- name: cluster-snapshot
mountPath: /opt/starrocks/fe/conf/cluster_snapshot.yaml
subPath: cluster_snapshot.yaml
# ... rest of your config
2. Remove Angle Brackets from S3 URIs
In your cluster_snapshot.yaml data, you have included angle brackets (< and >) around the S3 URIs:
cluster_snapshot_path: <s3://...>
location: <s3://...>
These brackets should not be included. They are usually just placeholders in documentation templates. StarRocks will fail to parse these URIs if the brackets are literally present in the configuration file.
Corrected `cluster_snapshot.yaml`:
yaml
cluster_snapshot:
cluster_snapshot_path: <s3://kubvir-asd21-starrocks-data/e4ed817e-0798-40a6-94b2-cd0234327463/meta/image/automated_cluster_snapshot_1771523838532>
storage_volume_name: builtin_storage_volume
frontends: []
compute_nodes: []
storage_volumes:
- name: builtin_storage_volume
type: S3
location: <s3://kubvir-asd21-starrocks-data>
# ... rest of the properties
3. Verify the FE Startup Arguments
When disasterRecovery.enabled: true is set correctly in the StarRocksCluster spec, the StarRocks Operator is designed to automatically inject the --cluster_snapshot flag into the first FE's startup command.
You can verify if the Operator has successfully updated the FE by checking the Pod description:
bash
kubectl describe pod kube-starrocks-fe-0 -n asd21
Look for the Args: section. It should contain --cluster_snapshot.
If you don't see this flag, it confirms that the disasterRecovery field isn't being applied properly, likely due to the indentation issue mentioned in point #1.
4. Common Troubleshooting Steps
* StarRocks Version: Ensure you are using StarRocks version v3.4.2 or later, as the Cluster Snapshot feature for disaster recovery is supported from that version onwards for shared-data clusters.
* Operator Version: Ensure you are using StarRocks Operator v1.10.0 or later, which introduced support for the disasterRecovery field in the CRD.
* Operator Logs: If the phase remains doing and the FE pod is not being updated with the correct arguments, check the Operator logs (not the FE logs) for reconciliation errors:
bash
kubectl logs -l <http://app.kubernetes.io/name=starrocks-operator|app.kubernetes.io/name=starrocks-operator> -n <operator-namespace>
Summary of Changes
Adjust your values.yaml to nest starrocksFESpec inside starrocksCluster and remove the < > brackets from your S3 paths. After applying the changes, the Operator should restart the FE pod with the --cluster_snapshot flag, allowing it to find the metadata in S3 and complete the recovery.
References
• quick_start/helm.md
• administration/management/FE_configuration.md
• administration/cluster_snapshot.mdRumit Jain
02/19/2026, 7:21 PMRocky
02/19/2026, 7:21 PMvalues.yaml didn't come through!
Could you please paste the content of the file and let me know what you are trying to achieve? For example:
* Are you encountering a specific error during helm install or helm upgrade?
* Do you need help configuring FE/BE/CN resource limits or storage?
* Are you trying to enable specific features like External Tables, SSL, or Query Queues?
Once you provide the details, I'll be happy to review it for you!Rumit Jain
02/19/2026, 7:35 PMkubectl describe pod kube-starrocks-fe-0 -n asd21
Name: kube-starrocks-fe-0
Namespace: asd21
Priority: 1000
Priority Class Name: default-priority
Service Account: kubvir-asd21-starrocks-s3-sa
Node: ip-10-214-108-44.ec2.internal/10.214.108.44
Start Time: Fri, 20 Feb 2026 00:59:43 +0530
Labels: app.kubernetes.io/component=fe
app.starrocks.ownerreference/name=kube-starrocks-fe
apps.kubernetes.io/pod-index=0
controller-revision-hash=kube-starrocks-fe-8675d89f87
statefulset.kubernetes.io/pod-name=kube-starrocks-fe-0
Annotations: app.starrocks.io/fe-config-hash: da9c7fdb
sidecar.istio.io/inject: false
Status: Running
IP: 10.214.101.243
IPs:
IP: 10.214.101.243
Controlled By: StatefulSet/kube-starrocks-fe
Containers:
fe:
Container ID: <containerd://d8eb781117987d2e64320ed9e49550c1019e9ab36a1c0c8da4ce9eb6b328af3>0
Image: 11111111.dkr.ecr.us-east-1.amazonaws.com/qwera/starrocks/fe-ubuntu:4.0.1
Image ID: 1111111.dkr.ecr.us-east-1.amazonaws.com/qwera/starrocks/fe-ubuntu@sha256:d52581be58bbc0986db04b89bf04c1704a7429f1df9dbf70ebfe089905a4643d
Ports: 8030/TCP, 9020/TCP, 9030/TCP
Host Ports: 0/TCP, 0/TCP, 0/TCP
Command:
/opt/starrocks/fe_entrypoint.sh
Args:
$(FE_SERVICE_NAME)
State: Running
Started: Fri, 20 Feb 2026 01:02:09 +0530
Last State: Terminated
Reason: Error
Exit Code: 255
Started: Fri, 20 Feb 2026 01:01:10 +0530
Finished: Fri, 20 Feb 2026 01:01:54 +0530
Ready: False
Restart Count: 2
Limits:
cpu: 1
memory: 2Gi
Requests:
cpu: 1
memory: 2Gi
Readiness: tcp-socket :9030 delay=5s timeout=1s period=10s #success=1 #failure=3
Environment:
TZ: Asia/Shanghai
MYSQL_PWD: <set to the key 'password' in secret 'starrocks-root-password'> Optional: false
POD_NAME: kube-starrocks-fe-0 (v1:metadata.name)
POD_IP: (v1:status.podIP)
HOST_IP: (v1:status.hostIP)
POD_NAMESPACE: asd21 (v1:metadata.namespace)
HOST_TYPE: FQDN
COMPONENT_NAME: fe
FE_SERVICE_NAME: kube-starrocks-fe-service.olymsre01
CONFIGMAP_MOUNT_PATH: /etc/starrocks/fe/conf
RESTORE_CLUSTER_GENERATION: 1
RESTORE_CLUSTER_SNAPSHOT: true
AWS_STS_REGIONAL_ENDPOINTS: regional
AWS_DEFAULT_REGION: us-east-1
AWS_REGION: us-east-1
AWS_ROLE_ARN: arn:aws:iam::1111111111:role/kubvir-asd21-starrocks-s3-role
AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token
Mounts:
/etc/starrocks/fe/conf from kube-starrocks-fe-cm (rw)
/opt/starrocks/fe/conf/cluster_snapshot.yaml from cluster-snapshot-3068 (rw,path="cluster_snapshot.yaml")
/opt/starrocks/fe/log from fe-log (rw)
/opt/starrocks/fe/meta from fe-meta (rw)
/var/run/secrets/eks.amazonaws.com/serviceaccount from aws-iam-token (ro)
Conditions:
Type Status
PodReadyToStartContainers True
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
aws-iam-token:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 86400
fe-meta:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: fe-meta-kube-starrocks-fe-0
ReadOnly: false
fe-log:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: fe-log-kube-starrocks-fe-0
ReadOnly: false
kube-starrocks-fe-cm:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: kube-starrocks-fe-cm
Optional: false
cluster-snapshot-3068:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: cluster-snapshot
Optional: false
QoS Class: Guaranteed
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m38s default-scheduler Successfully assigned olymsre01/kube-starrocks-fe-0 to ip-10-214-108-44.ec2.internal
Normal SuccessfulAttachVolume 2m36s attachdetach-controller AttachVolume.Attach succeeded for volume "pvc-2e57b479-40a2-42a5-901a-82b31132b5b0"
Normal SuccessfulAttachVolume 2m36s attachdetach-controller AttachVolume.Attach succeeded for volume "pvc-1f0ef1f4-3800-43f1-bdfd-9c310dbff125"
Normal Pulling 2m32s kubelet Pulling image "264308539041.dkr.ecr.us-east-1.amazonaws.com/qweerwer/starrocks/fe-ubuntu:4.0.1"
Normal Pulled 2m1s kubelet Successfully pulled image "1111111111.dkr.ecr.us-east-1.amazonaws.com/qweerwer/starrocks/fe-ubuntu:4.0.1" in 31.091s (31.091s including waiting). Image size: 1569678461 bytes.
Warning BackOff 28s kubelet Back-off restarting failed container fe in pod kube-starrocks-fe-0_asd21(dff0597d-9f59-47fc-808e-f59c798d99c3)
Normal Created 13s (x3 over 2m) kubelet Created container: fe
Normal Started 13s (x3 over 2m) kubelet Started container fe
Normal Pulled 13s (x2 over 72s) kubelet Container image "1111111111.dkr.ecr.us-east-1.amazonaws.com/qweerwer/starrocks/fe-ubuntu:4.0.1" already present on machine
Warning Unhealthy 2s (x9 over 107s) kubelet Readiness probe failed: dial tcp 10.14.11.243:9030: connect: connection refused
I am following this doc https://www.starrocks.io/blog/starrocks-disaster-recovery-on-kubernetes-a-practical-guide-to-cluster-snapshot to test disaster recovery on Kubernetes. I am able to take the cluster snapshot and automated_cluster_snapshot_1771523838532 also created in s3 bucket. But when I am trying to restore it in the new cluster, the pod FE is not coming up. I am using starrocks cluster helm chart and this is my values.yaml:
starrocksCluster:
disasterRecovery:
enabled: true
generation: 1
starrocksFESpec:
configMaps:
- name: cluster-snapshot
mountPath: /opt/starrocks/fe/conf/cluster_snapshot.yaml
subPath: cluster_snapshot.yaml
configMaps:
- name: cluster-snapshot
data:
cluster_snapshot.yaml: |
cluster_snapshot:
cluster_snapshot_path: <s3://kubvir-asd21-starrocks-data/e4ed817e-0798-40a6-94b2-cd0234327463/meta/image/automated_cluster_snapshot_1771523838532>
storage_volume_name: builtin_storage_volume
frontends: []
compute_nodes: []
storage_volumes:
- name: builtin_storage_volume
type: S3
location: <s3://kubvir-asd21-starrocks-data>
comment: my s3 volume
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.endpoint
value: <https://s3.amazonaws.com>
- key: aws_s3_use_instance_profile
value: false
- key: aws_s3_use_aws_sdk_default_behavior
value: true
Not seeing anything useful in operator logs. FE pods are just giving these logs:
[Fri Feb 20 02:40:32 CST 2026] Process conf file fe.conf ...
[Fri Feb 20 02:40:32 CST 2026] first start fe with meta not exist.
[Fri Feb 20 02:40:32 CST 2026] FE service kube-starrocks-fe-service.asdfg:9030 is not alive yet!
[Fri Feb 20 02:40:34 CST 2026] FE service kube-starrocks-fe-service.asdfg:9030 is not alive yet!
[Fri Feb 20 02:41:02 CST 2026] Timed out, no members detected ever, assume myself is the first node ..
[Fri Feb 20 02:41:02 CST 2026] first start with no meta run start_fe.sh with additional options: ' --host_type FQDN'
Also the status of recovery remains in in progress
kubectl get src kube-starrocks -n asd21 -o yaml
-----
status:
disasterRecoveryStatus:
observedGeneration: 1
phase: doing
reason: disaster recovery is in progress
startTimestamp: 1771527180
phase: reconciling
starRocksCnStatus:
horizontalScaler: {}
phase: reconciling
starRocksFeProxyStatus:
phase: reconciling
starRocksFeStatus:
creatingInstances:
- kube-starrocks-fe-0
phase: reconciling
resourceNames:
- kube-starrocks-fe
serviceName: kube-starrocks-fe-serviceRocky
02/19/2026, 7:36 PMcluster_snapshot.yaml
In your values.yaml, you have included the angle brackets (< >) from the documentation template. These are placeholders and must be removed so that the paths are valid URIs.
Correction:
yaml
cluster_snapshot.yaml: |
cluster_snapshot:
# Remove the < > around the s3 path
cluster_snapshot_path: <s3://kubvir-asd21-starrocks-data/e4ed817e-0798-40a6-94b2-cd0234327463/meta/image/automated_cluster_snapshot_1771523838532>
storage_volume_name: builtin_storage_volume
...
storage_volumes:
- name: builtin_storage_volume
type: S3
location: <s3://kubvir-asd21-starrocks-data>
...
properties:
- key: aws.s3.endpoint
value: <https://s3.amazonaws.com>
2. FE is missing the --cluster_snapshot flag
The FE log shows the startup command as:
first start with no meta run start_fe.sh with additional options: ' --host_type FQDN'
For a restore to work, the command must include --cluster_snapshot. Even though your pod has the environment variable RESTORE_CLUSTER_SNAPSHOT: true, the entrypoint script (fe_entrypoint.sh) in your image doesn't seem to be picking it up or adding the flag.
How to fix:
* Check Image Version: The Cluster Snapshot feature for shared-data clusters is supported from StarRocks v3.4.2 onwards. Ensure your fe-ubuntu:4.0.1 image (if that's a custom tag) actually contains a kernel version $\ge$ 3.4.2 and a recent fe_entrypoint.sh.
* Manual Flag Injection: If the operator isn't adding the flag automatically, you can force it in your `starrocksFESpec`:
yaml
starrocksFESpec:
image:
args:
• /opt/starrocks/fe_entrypoint.sh
• $(FE_SERVICE_NAME)
• --cluster_snapshot # Add this flag manually
Note: Only do this for the initial restore. Once the cluster is up and metadata is restored, you should remove this flag.
3. Verify ConfigMap Mounting
Your pod description shows:
/opt/starrocks/fe/conf/cluster_snapshot.yaml from cluster-snapshot-3068 (rw,path="cluster_snapshot.yaml")
The FE expects this file exactly at /opt/starrocks/fe/conf/cluster_snapshot.yaml. Your mount path looks correct, but double-check inside the pod (if you can get a shell during the crash loop) that the file exists and is readable:
kubectl exec -it kube-starrocks-fe-0 -n asd21 -- cat /opt/starrocks/fe/conf/cluster_snapshot.yaml
Summary of what to do next:
1. Update your ConfigMap data to remove all < and > brackets.
2. If the FE still starts without the --cluster_snapshot flag in the logs, manually add the flag to your starrocksFESpec.image.args.
3. Ensure the FE pod -0 is the one you are inspecting, as it must be the Leader to perform the restore.
Once the FE starts with the correct flag, it will download the metadata from S3, and the disasterRecoveryStatus should move from doing to done.
References
• administration/cluster_snapshot.md
• administration/management/Backup_and_restore.md
• sql-reference/sql-statements/backup_restore/RESTORE.mdRocky
02/19/2026, 7:37 PMkubectl describe output and values.yaml, there are a few issues preventing the FE from starting in the correct restore mode. The core problem is that the FE process is starting as a "fresh" node without the required --cluster_snapshot flag, causing it to loop while waiting for a cluster leader that doesn't exist yet.
Here is how to fix it:
1. Remove Angle Brackets from ConfigMap
In your cluster_snapshot.yaml, you have literal < and > characters around your S3 paths and endpoints (e.g., <s3://...> and <https://...>). These are placeholders from the documentation and must be removed. If they are present in the final file, the StarRocks FE will fail to parse the URI and crash (likely causing the Exit Code: 255).
Corrected YAML snippet:
yaml
cluster_snapshot:
cluster_snapshot_path: <s3://kubvir-asd21-starrocks-data/e4ed817e-0798-40a6-94b2-cd0234327463/meta/image/automated_cluster_snapshot_1771523838532>
storage_volume_name: builtin_storage_volume
...
storage_volumes:
- name: builtin_storage_volume
type: S3
location: <s3://kubvir-asd21-starrocks-data>
...
properties:
- key: aws.s3.endpoint
value: <https://s3.amazonaws.com>
2. Adjust the Mount Path
The FE entrypoint script (fe_entrypoint.sh) in newer StarRocks images typically looks for the cluster_snapshot.yaml file in the same directory where the main fe.conf is mounted. In your pod, the environment variable CONFIGMAP_MOUNT_PATH is set to /etc/starrocks/fe/conf.
Currently, you are mounting the snapshot config to /opt/starrocks/fe/conf/. Because the script doesn't find the file in the expected path, it skips adding the --cluster_snapshot flag to the startup command.
Change the mountPath in your starrocksFESpec to:
yaml
starrocksFESpec:
configMaps:
- name: cluster-snapshot
mountPath: /etc/starrocks/fe/conf/cluster_snapshot.yaml # Change this
subPath: cluster_snapshot.yaml
3. Verify IRSA Configuration
Since you are using AWS IAM Roles for Service Accounts (IRSA), ensure your cluster_snapshot.yaml storage volume properties are correctly configured to use the SDK default behavior. Your current configuration looks good:
yaml
- key: aws_s3_use_instance_profile
value: "false"
- key: aws_s3_use_aws_sdk_default_behavior
value: "true"
(Note: Ensure these boolean values are strings if required by your YAML parser, though the key part is removing the brackets).
Why your FE is failing right now:
1. Missing Flag: Because the entrypoint script doesn't find the YAML at /etc/starrocks/fe/conf/cluster_snapshot.yaml, it executes start_fe.sh --host_type FQDN.
2. Timeout: The FE script enters a loop waiting for an existing leader (since it's not in restore mode).
3. Connection Refused: The readiness probe fails because the Java process hasn't fully started or has crashed due to the invalid characters (< >) in the config.
Once you update the mount path and remove the brackets, the logs should show:
first start with no meta run start_fe.sh with additional options: '--cluster_snapshot ... --host_type FQDN'.
Give these changes a try! If the pod still restarts, please share the logs from the FE container again—specifically look for any Java stack traces that appear after the start_fe.sh line.
References
• quick_start/helm.md
• administration/cluster_snapshot.mdRumit Jain
03/23/2026, 12:53 PMRocky
03/23/2026, 12:53 PMAsia/Shanghai (UTC+8) as its internal time zone for the time_zone session variable.
2. System Time Zone (system_time_zone)
StarRocks also tracks a system_time_zone parameter. This is automatically determined by the local time zone of the machines hosting your Frontends (FEs) when they start up. You cannot manually change this specific parameter within StarRocks; it is inherited from the OS.
3. How to Configure the Timezone
If your infrastructure is in a specific AZ (e.g., UTC or US/Eastern) and you want StarRocks to reflect that, you should manually update the StarRocks configuration:
* Check current settings:
sql
SHOW VARIABLES LIKE '%time_zone%';
* Set Global Timezone (for the entire cluster):
sql
SET global time_zone = 'America/New_York'; -- or '+00:00' for UTC
* Set Session Timezone (for your current connection only):
sql
SET time_zone = 'UTC';
Important Recommendations:
* Consistency: It is highly recommended to set the StarRocks time_zone to match the machine's system_time_zone (the OS timezone) before loading data. This ensures that DATE and DATETIME types are processed correctly.
* NTP: Ensure that all nodes (FEs and BEs) in your cluster have their system clocks synchronized via NTP to avoid consistency issues.
In summary: It is not automatically based on the AZ timezone. It defaults to Asia/Shanghai unless you manually configure it to match your environment's local time.
References
• administration/management/timezone.md
• faq/loading/Broker_load_faq.md
• loading/Spark-connector-starrocks.md
• faq/Sql_faq.md
• integrations/loading_tools/DataX-starrocks-writer.md
• deployment/environment_configurations.md
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.mdRumit Jain
03/23/2026, 12:58 PMRocky
03/23/2026, 12:58 PMsql
SET GLOBAL time_zone = 'UTC';
*2. Alternative: America/New_York*
If your business logic or reporting strictly requires the database to reflect the local time of the us-east-1 region, you should use the official TZ database name:
sql
SET GLOBAL time_zone = 'America/New_York';
──────────
Critical Implementation Notes
1. Match the System Time:
The most important rule in StarRocks is that your global time_zone should match the system_time_zone of the machines hosting your Frontends (FEs). If they mismatch, you may encounter issues where DATE types are off by a day during data loading.
* On your FE nodes, check the system time: date.
* In StarRocks, verify the setting: SHOW VARIABLES LIKE '%time_zone%';.
2. Avoid the Default:
By default, StarRocks initializes with Asia/Shanghai. Since you are in us-east-1, you must change this globally before loading data to ensure time-based functions like now() and from_unixtime() return expected values.
3. Client-Side Flexibility:
If you set the global timezone to UTC but have a specific user or application that needs Eastern Time, they can change it at the session level without affecting others:
sql
SET time_zone = 'America/New_York';
4. Avoid Abbreviations:
Do not use abbreviations like "EST" or "EDT" in the SQL command, as StarRocks (with the exception of CST) does not support them. Always use the full name (e.g., America/New_York) or the UTC offset (e.g., -05:00).
References
• administration/management/timezone.md
• faq/Sql_faq.md
• faq/loading/Broker_load_faq.md
• sql-reference/sql-functions/date-time-functions/utc_timestamp.md
• deployment/environment_configurations.md
• sql-reference/sql-functions/date-time-functions/utc_time.md
• sql-reference/System_variable.md
• loading/Spark-connector-starrocks.mdRumit Jain
03/23/2026, 1:08 PMRocky
03/23/2026, 1:08 PMus-east-1a or us-east-1f at the infrastructure/node level for the purpose of query logic.
Timezone management in StarRocks is handled at the global or session level, rather than the physical location level of the nodes. Here is how it works:
1. Global Timezone
You can set a global timezone for the entire cluster. This is typically done to ensure consistency across all nodes and data loading processes.
sql
SET GLOBAL time_zone = 'America/New_York';
StarRocks recommends that the global time_zone match the system_time_zone (the timezone of the machines hosting the FEs) to ensure data consistency, especially for DATE and DATETIME types during loading.
2. Session Timezone
If users or applications in different AZs need to interact with the data using their local time, they should set the timezone at the session level upon connecting.
sql
-- For a user/app in us-east-1
SET time_zone = 'America/New_York';
This allows the same cluster to serve different users in different timezones simultaneously.
3. AZ Awareness (Labels)
While you can't set a timezone per AZ, you can make StarRocks aware of different AZs for data distribution and high availability using labels. You can label your Backends (BEs) by their rack or AZ:
sql
ALTER SYSTEM MODIFY BACKEND "172.xx.xx.xx:9050" SET ("labels.location" = "az:us-east-1a");
This allows you to ensure that data replicas are distributed across different AZs for fault tolerance, but it does not change the time calculation logic for those nodes.
Why you shouldn't use different timezones per node:
In a distributed query, a single request might be processed by multiple BEs across different AZs. If nodes had different timezones, functions like NOW(), CURTIME(), or filters on time-sensitive data would return inconsistent or corrupted results depending on which node happened to process a specific fragment of the query.
Rocky's Recommendation:
* Keep all your FE/BE servers synchronized to the same system time (ideally UTC).
* Set the GLOBAL time_zone to a standard timezone for your organization.
* Use SET time_zone in your application's connection logic if you need to respect the local time of a specific region or AZ.
References
• administration/management/resource_management/be_label.md
• administration/management/BE_configuration.md
• deployment/shared_data/azure.mdRumit Jain
03/24/2026, 7:47 AMRocky
03/24/2026, 7:48 AMEurope/Berlin.
How to set the timezone in StarRocks
You can configure this at the session level or globally for the entire cluster.
1. Set globally (Recommended):
This setting is persisted in the Frontends (FE) and remains valid even after reconnections.
sql
SET GLOBAL time_zone = 'Europe/Berlin';
2. Set for the current session:
sql
SET time_zone = 'Europe/Berlin';
Why this matters
* Data Accuracy: StarRocks documentation recommends that the global time_zone matches the system_time_zone of the machines hosting your FEs. If they do not match, data of the DATE type may be loaded incorrectly.
* Time Functions: Functions like NOW(), CURTIME(), and FROM_UNIXTIME() will return results based on this setting.
* Daylight Savings: Using a name like Europe/Berlin is better than a fixed UTC offset (like +01:00) because it automatically handles Daylight Saving Time (CEST).
Verification
To check your current timezone settings, run:
sql
SHOW VARIABLES LIKE '%time_zone%';
If you are setting up a shared-data cluster or using S3-related features in this region, ensure your aws_s3_region is also set to eu-central-1 in your FE configuration.
References
• deployment/environment_configurations.md
• administration/management/timezone.md
• sql-reference/System_variable.md
• faq/loading/Broker_load_faq.md
• integrations/loading_tools/DataX-starrocks-writer.md
• faq/Sql_faq.md
• administration/management/FE_configuration.md
• loading/Spark-connector-starrocks.mdRumit Jain
03/24/2026, 11:42 AMRocky
03/24/2026, 11:42 AMRumit Jain
03/31/2026, 8:01 AMRocky
03/31/2026, 8:02 AMCREATE REPOSITORY statement to point to a specific bucket that is separate from any other storage you might be using.
* Example (S3):
sql
CREATE REPOSITORY my_backup_repo
WITH BROKER
ON LOCATION "<s3a://my-separate-backup-bucket/starrocks_backups>"
PROPERTIES (
"aws.s3.access_key" = "XXXXXXXX",
"aws.s3.secret_key" = "YYYYYYYY",
"aws.s3.region" = "us-east-1"
);
* Once created, you can run BACKUP SNAPSHOT ... TO my_backup_repo to move data into that specific bucket.
2. For Shared-data Clusters
In a shared-data cluster, the primary "data bucket" is where your tables reside.
* Current Limitation: The built-in BACKUP and RESTORE SQL commands are not yet supported for shared-data clusters.
* Alternative: To keep backups separate, users typically rely on cloud-native features:
* S3 Replication: You can configure your primary data bucket to automatically replicate data to a separate backup bucket in a different region or account.
* Cluster Snapshots: Shared-data clusters support "Cluster Snapshots" which store metadata alongside data. While this usually happens in the primary storage, you can use cloud provider tools to snapshot the entire bucket.
* Multiple Storage Volumes (v3.1+): You can define multiple "Storage Volumes" in StarRocks. This allows you to place different databases or tables in different buckets, effectively separating data physically.
Summary
* If you want to use BACKUP/RESTORE commands: This is supported for standard clusters, and you can point the REPOSITORY to any bucket you choose.
* If you are on a Shared-data cluster: Since traditional BACKUP is not supported, you should use S3/GCS bucket replication or Storage Volumes to ensure your data exists in separate physical locations.
Would you like the specific syntax for setting up a repository for a particular cloud provider (AWS, GCP, or Azure)?
References
• deployment/shared_data/feature-support-shared-data.md
• administration/management/Backup_and_restore.md
• faq/Exporting_faq.md
• faq/shared_data_faq.md
• administration/cluster_snapshot.mdRumit Jain
04/01/2026, 5:03 AMRocky
04/01/2026, 5:03 AMroot user in StarRocks. The method depends on whether you currently have access to the account or if you have lost the password.
1. If you are currently logged in as root
You can change the password using either the SET PASSWORD or ALTER USER command:
* Using `SET PASSWORD`:
sql
SET PASSWORD = PASSWORD('your_new_password');
* Using `ALTER USER`:
sql
ALTER USER 'root' IDENTIFIED BY 'your_new_password';
2. If you lost the root password
If you cannot connect because the password is lost, you must perform a manual reset by temporarily disabling authentication:
1. Disable Authentication: On all FE (Frontend) nodes, add the following line to the fe/conf/fe.conf file:
properties
enable_auth_check = false
2. Restart FE Nodes: Restart all FE nodes to apply the configuration.
bash
./fe/bin/stop_fe.sh
./fe/bin/start_fe.sh
3. Connect and Reset: Connect to StarRocks via a MySQL client without a password and reset it:
bash
mysql -h <fe_ip> -P9030 -uroot
sql
SET PASSWORD FOR root = PASSWORD('your_new_password');
4. Re-enable Authentication: Change enable_auth_check back to true in fe.conf on all FE nodes and restart them again.
3. Initial Setup (Post-Deployment)
By default, the root user is created with an empty password. It is highly recommended to set a password immediately after installation:
bash
mysql -h <fe_ip> -P9030 -uroot
sql
SET PASSWORD = PASSWORD('your_secure_password');
Note: Only the root user itself can change its own password. Other users (even those with user_admin roles) cannot change the root user's password.
References
• administration/user_privs/authentication/native_authentication.md
• sql-reference/sql-statements/account-management/SET_PASSWORD.md
• quick_start/helm.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/account-management/ALTER_USER.md
• deployment/post_deployment_setup.mdRumit Jain
04/02/2026, 3:30 AMRocky
04/02/2026, 3:31 AMBACKUP and RESTORE commands (which create snapshots in a repository) are not currently supported (as of version 3.4).
However, you can achieve bucket separation by using Storage Volumes (to separate data for different tables/databases) or by using Export to move data to a separate backup bucket.
──────────
Step 1: Configure the Main "Data Bucket"
The primary bucket where your cluster stores its persistent data is defined as the Default Storage Volume.
1. Configure fe.conf: When you first set up the cluster, you define the storage type and the initial volume.
bash
# fe.conf
run_mode = shared_data
cloud_native_storage_type = S3
2. Create the Default Storage Volume:
Connect to your cluster via MySQL client and run:
sql
CREATE STORAGE VOLUME data_volume
TYPE = S3
LOCATIONS = ("<s3://my-main-data-bucket/starrocks_data/>")
PROPERTIES
(
"enabled" = "true",
"aws.s3.endpoint" = "<http://s3.us-east-1.amazonaws.com|s3.us-east-1.amazonaws.com>",
"aws.s3.access_key" = "your_access_key",
"aws.s3.secret_key" = "your_secret_key"
);
-- Set it as the default for the cluster
SET data_volume AS DEFAULT STORAGE VOLUME;
Step 2: Configure a Separate "Backup/Archive Bucket"
Since native BACKUP is not supported for shared-data clusters, you can create a second Storage Volume to act as a separate "Archive" or "Backup" area, or use it for EXPORT jobs.
Option A: Creating a separate Storage Volume for specific data
If you want some tables to reside in a "Backup" bucket for isolation:
1. Create the second volume:
sql
CREATE STORAGE VOLUME backup_volume
TYPE = S3
LOCATIONS = ("<s3://my-separate-backup-bucket/archives/>")
PROPERTIES
(
"enabled" = "true",
"aws.s3.endpoint" = "<http://s3.us-east-1.amazonaws.com|s3.us-east-1.amazonaws.com>",
"aws.s3.access_key" = "your_access_key",
"aws.s3.secret_key" = "your_secret_key"
);
2. Use it for specific databases or tables:
sql
CREATE DATABASE archive_db PROPERTIES("storage_volume" = "backup_volume");
Option B: Exporting data to a Backup Bucket
To manually "back up" data from your main bucket to a separate bucket, use the EXPORT command. This physically copies the data to your secondary bucket in Parquet or CSV format.
1. Run an Export job:
sql
EXPORT TABLE my_table
TO "<s3://my-separate-backup-bucket/table_backups/>"
PROPERTIES (
"column_separator" = ",",
"format" = "parquet"
)
WITH BROKER (
"aws.s3.endpoint" = "<http://s3.us-east-1.amazonaws.com|s3.us-east-1.amazonaws.com>",
"aws.s3.access_key" = "your_access_key",
"aws.s3.secret_key" = "your_secret_key"
);
Summary of Differences
Feature | Shared-Nothing (FE+BE) | Shared-Data (FE+CN)
Data Storage | Local disks (BE) | Storage Volume (Bucket A)
Backup Method | BACKUP to Repository | EXPORT to Bucket B (or cloud-side bucket cloning)
Bucket Separation | CREATE REPOSITORY | Multiple `STORAGE VOLUME`s
Rocky's Tip: If you are using a cloud provider like AWS or Azure, the most common "backup" strategy for Shared-data clusters is to use the cloud provider's native bucket versioning or object replication features on your primary data bucket.
References
• deployment/shared_data/feature-support-shared-data.md
• administration/management/Backup_and_restore.mdRocky
04/02/2026, 3:31 AMBACKUP and RESTORE commands (which typically use a REPOSITORY). However, you can achieve bucket separation and data protection using Storage Volumes and cloud provider tools.
Here are the steps to manage and separate your buckets in an FE+CN deployment:
1. Configure the Data Bucket (Primary Storage)
The "Data Bucket" is where StarRocks stores all its persistent data. This is configured during cluster initialization.
Method A: via fe.conf
On your FE nodes, configure the following parameters in fe.conf to point to your primary data bucket:
properties
run_mode = shared_data
cloud_native_storage_type = S3
aws_s3_path = my-primary-data-bucket/starrocks_data
aws_s3_region = us-east-1
aws_s3_endpoint = <https://s3.us-east-1.amazonaws.com>
# Credentials
aws_s3_access_key = <your_access_key>
aws_s3_secret_key = <your_secret_key>
Method B: via SQL (Recommended for v3.1+)
You can create a Storage Volume and set it as default:
sql
CREATE STORAGE VOLUME primary_data_vol
TYPE = S3
LOCATIONS = ("<s3://my-primary-data-bucket/starrocks_data/>")
PROPERTIES (
"aws.s3.region" = "us-east-1",
"aws.s3.endpoint" = "<https://s3.us-east-1.amazonaws.com>",
"aws.s3.access_key" = "xxx",
"aws.s3.secret_key" = "xxx"
);
-- Set it as default for the cluster
SET primary_data_vol AS DEFAULT STORAGE VOLUME;
──────────
2. "Separating" a Backup Bucket
Since the BACKUP command is not supported for shared-data clusters yet, "separating" a backup bucket usually refers to one of the following:
Option A: Disaster Recovery (Bucket Replication)
Because your data is already in a bucket, the standard practice for "backup" in a shared-data architecture is to use S3 Cross-Region Replication (CRR) or Versioning on the cloud provider side.
* Step 1: Enable versioning on your Data Bucket.
* Step 2: Configure a replication rule in AWS/MinIO to sync your Data Bucket to a separate Backup Bucket.
Option B: Isolating Data via Multiple Storage Volumes
If you want to store specific databases or tables in a different bucket (e.g., for archival or separation of concerns), you can create additional Storage Volumes:
1. Create a second volume:
sql
CREATE STORAGE VOLUME archive_vol
TYPE = S3
LOCATIONS = ("<s3://my-archive-bucket/data/>")
PROPERTIES (...);
2. Assign it to a Database or Table:
sql
CREATE DATABASE archived_db PROPERTIES("storage_volume" = "archive_vol");
-- Or for a specific table
CREATE TABLE my_table (...)
PROPERTIES("storage_volume" = "archive_vol");
──────────
3. Note for Shared-nothing (FE+BE) Users
If you are actually using a Shared-nothing cluster but have added CNs for compute, you can use a separate backup bucket via the REPOSITORY command:
1. Create the Repository (Points to your Backup Bucket):
sql
CREATE REPOSITORY my_backup_repo
WITH S3
ON LOCATION "<s3://my-backup-bucket/snapshots/>"
PROPERTIES (
"aws.s3.endpoint" = "...",
"aws.s3.region" = "...",
"aws.s3.access_key" = "...",
"aws.s3.secret_key" = "..."
);
2. Run Backup:
sql
BACKUP SNAPSHOT db_name.snapshot_1 TO my_backup_repo;
Summary of Key Differences
Feature | Shared-data (FE+CN) | Shared-nothing (FE+BE)
Primary Data | Always in a Bucket (S3/OSS/HDFS) | Local Disks on BEs
Backup Method | Cloud Replication / Snapshots | BACKUP command to a REPOSITORY
Separation | Use STORAGE VOLUME | Use REPOSITORYRocky
04/02/2026, 3:31 AMStarRocksCluster YAML specifically defines the storageVolume for data, and you can handle FE metadata backups separately using the operator's backup features.
References
• quick_start/shared-data.md
• administration/management/Backup_and_restore.md
• faq/Exporting_faq.md
• deployment/shared_data/minio.mdRumit Jain
04/02/2026, 12:46 PM2026-04-02T18:15:15+05:30 W20260402 12:45:15.629428 139841628579392 socket.cpp:1379] Fail to wait EPOLLOUT of fd=268: Connection timed out [110]Rocky
04/02/2026, 12:46 PMFail to wait EPOLLOUT with Connection timed out [110] means that the operating system's network stack attempted to establish or send data over a TCP connection, but it failed to receive an acknowledgment (ACK) within the TCP timeout period.
Common Causes
1. Network Connectivity or Firewall:
* The CN pod is trying to communicate with another node (FE or another CN/BE), but the packets are being dropped by a firewall, Security Group (in AWS/Azure/GCP), or Kubernetes NetworkPolicy.
* The destination pod might have been deleted or is in a "Terminating" state, but the CN still has its old IP in its routing table.
2. MTU Mismatch:
* In some Kubernetes environments (especially using VXLAN or Geneve overlays like Calico or Flannel), if the MTU of the pod network is larger than the underlying physical network, large packets (typical in StarRocks data shuffling) may be silently dropped, leading to ETIMEDOUT.
3. Resource Exhaustion:
* Port Exhaustion: If the node has too many concurrent connections, it may run out of ephemeral ports.
* CPU Throttling: If the CN pod is heavily CPU-throttled, it might fail to respond to TCP keep-alives or handshakes in time.
4. Target Node Unresponsiveness:
* The target node (likely an FE or another BE/CN) might be experiencing a "Stop the World" Garbage Collection (for FE) or is under such heavy load that it cannot process the TCP handshake.
Troubleshooting Steps
1. Identify the Target:
Check the logs immediately before or after this entry. Usually, bRPC will log the destination IP and port (e.g., 10.x.x.x:8060). Verify if the CN can reach that IP:
bash
# Run from inside the CN pod
ping <target_ip>
telnet <target_ip> 8060 # Replace 8060 with the actual Heartbeat or BRPC port
2. Check Pod Status:
Ensure all FE and CN/BE pods are healthy and not frequently restarting (kubectl get pods -n <namespace>).
3. Adjust bRPC Connection Type:
If you see these errors during high-concurrency queries, you can try changing the connection strategy from single to pooled in your cn.conf (or be.conf):
properties
brpc_connection_type = pooled
Note: This requires a restart of the CN pods.
4. Check OS/Kernel Metrics:
Check if the host node is experiencing packet drops:
bash
netstat -s | grep -i "timeout"
dmesg | grep -i "conntrack" # Check if ip_conntrack/nf_conntrack tables are full
5. Verify MTU:
Compare the MTU of the eth0 interface inside the pod with the host's physical interface. They should generally match or the pod's should be slightly smaller to account for encapsulation overhead.
If these logs are infrequent and queries are not failing, it might be a transient network flicker. However, if they occur frequently alongside query timeouts, it is likely a persistent network configuration issue in your Kubernetes cluster.
References
• administration/management/BE_configuration.md
• administration/management/FE_configuration.md
• knowledge/usage/best-practice.md
• faq/Sql_faq.md
• faq/operation_maintenance_faq.md
• faq/loading/Loading_faq.mdRumit Jain
04/02/2026, 1:22 PMpersistentVolumeClaimRetentionPolicy:
whenDeleted: DeleteRocky
04/02/2026, 1:22 PMpersistentVolumeClaimRetentionPolicy to whenDeleted: Delete is generally recommended for CN (Compute Node) pods, especially if you are using autoscaling.
Here is a breakdown of why this is recommended for CNs and why you should avoid it for other components:
Why use whenDeleted: Delete for CNs?
1. Stateless Nature: CN nodes are designed to be stateless compute resources. They do not store permanent table data; in a shared-data architecture, that data resides in object storage (like S3 or GCS).
2. Storage Cost Management: If you use Horizontal Pod Autoscaling (HPA) for your CNs, scaling down from (for example) 20 nodes to 5 nodes would leave 15 orphaned PVCs if this policy is not set to Delete. These orphaned volumes continue to incur costs and clutter your Kubernetes cluster.
3. Automatic Cleanup: With this setting, when the StarRocks Operator or Kubernetes scales down the CN cluster, the associated storage (used for logs or temporary data cache) is cleaned up automatically.
The Trade-off: Data Cache
The primary thing stored on a CN's persistent volume is the Data Cache.
* With Delete: When a CN pod is deleted (e.g., during scale-down), the local cache is wiped. If a new CN pod is created later, it will start with a "cold" cache and will need to fetch data from object storage again.
* With Retain: The cache stays on the disk. If a pod with the same index is recreated, it can reuse the old cache.
Recommendation: Unless you have a specific requirement to keep the Data Cache "warm" across scale-down/scale-up events, whenDeleted: Delete is the standard "Cloud Native" approach for CNs.
⚠️ Warning: Do NOT use this for FE or BE
* FE (Frontend): Never use Delete. The FE stores critical metadata. If the PVC is deleted, you lose the entire cluster's metadata.
* BE (Backend): Never use Delete. BEs store the actual data tablets (in shared-nothing) or metadata/persistent cache. Deleting these PVCs will lead to data loss or significant cluster instability.
Summary Table
Component | Recommended Policy | Reason
CN | whenDeleted: Delete | Facilitates autoscaling and prevents orphaned volume costs.
FE | whenDeleted: Retain | Critical. Prevents loss of cluster metadata.
BE | whenDeleted: Retain | Critical. Prevents loss of persistent data.
References
• quick_start/helm.md
• deployment/sr_operator.md
• administration/management/FE_configuration.md
• deployment/helm.mdRumit Jain
04/02/2026, 1:26 PMconfig: |
sys_log_level = INFO
# ports for admin, web, heartbeat service
be_port = 9060
webserver_port = 8040
heartbeat_service_port = 9050
brpc_port = 8060
datacache_disk_size = 80%
storage_root_path = /opt/starrocks/cn/storage0;/opt/starrocks/cn/storage1
# Disable auto-scaling (Note: parameter name changed in v4.0)
enable_datacache_disk_auto_adjust = false
datacache_enable = trueRocky
04/02/2026, 1:27 PMdatacache_disk_size vs starlet_star_cache_disk_size_percent)
In the configuration file (cn.conf), datacache_disk_size usually expects an absolute value (e.g., 500G, 1T). While dynamic updates via SQL might accept percentages, it is safer to use the dedicated percentage parameter in the config file.
* Recommendation: Use starlet_star_cache_disk_size_percent = 80 to specify that 80% of the storage space should be used for the cache.
* Note: In shared-data clusters, StarRocks takes the greater value between datacache_disk_size and starlet_star_cache_disk_size_percent.
2. Auto-Scaling Parameter
You are correct! In version 4.0, the parameter datacache_auto_adjust_enable was renamed to enable_datacache_disk_auto_adjust.
* Recommendation: Since you have disabled auto-scaling (false), ensure your storage_root_path has enough persistent capacity to hold the amount specified in your size configurations.
3. Cache Storage Path (storage_root_path)
Using multiple paths separated by a semicolon is correct.
* Recommendation: Ensure these paths are mounted to persistent volumes (PVs) in Kubernetes. If the pods restart and the storage is ephemeral, the cache will be lost, leading to "cold" starts and increased latency/cost as data is re-fetched from remote storage.
4. Missing Port Configuration (starlet_port)
For Compute Nodes (CN), especially in a shared-data or data lake scenario, the starlet_port is required for the heartbeat service.
* Recommendation: Add starlet_port = 9070 (default) or ensure it is mapped if you use a custom port.
5. Recommended Adjustments
Based on your snippet, here is a refined version:
properties
sys_log_level = INFO
# Ports
be_port = 9060
webserver_port = 8040
heartbeat_service_port = 9050
brpc_port = 8060
starlet_port = 9070
# Data Cache Configuration
datacache_enable = true
# Use the percentage parameter for clearer intent in cn.conf
starlet_star_cache_disk_size_percent = 80
# Multiple storage paths for cache
storage_root_path = /opt/starrocks/cn/storage0;/opt/starrocks/cn/storage1
# v4.0 renamed parameter to disable auto-adjust
enable_datacache_disk_auto_adjust = false
Additional Tips for CN Pods:
* Memory Management: Ensure you set mem_limit or starrocks_memory_limit_gb in your config to match your Kubernetes pod RAM limits (usually 90% of the pod limit) to prevent OOM kills.
* CPU Priority: If you are running heavy queries, consider setting is_performance_running = true to optimize the CN for query performance.
Let me know if you have more questions about your v4.0 setup!
References
• data_source/data_cache.md
• administration/management/BE_configuration.md
• sql-reference/System_variable.md
• using_starrocks/caching/block_cache.mdRumit Jain
04/02/2026, 1:31 PMstorageSpec:
name: "cn-cache-storage"
storageClassName: ""
storageSize: 20Gi
storageCount: 2
storageMountPath: "/opt/starrocks/cn/storage"
logStorageClassName: ""
logStorageSize: 20Gi
logMountPath: "/opt/starrocks/cn/log"
spillStorageClassName: ""
spillStorageSize: 0Gi
spillMountPath: ""
emptyDirs: []
hostPaths: []
persistentVolumeClaimRetentionPolicy:
whenDeleted: Delete
config: |
sys_log_level = INFO
# ports for admin, web, heartbeat service
be_port = 9060
webserver_port = 8040
heartbeat_service_port = 9050
brpc_port = 8060
datacache_disk_size = 80%
storage_root_path = /opt/starrocks/cn/storage0;/opt/starrocks/cn/storage1
# Disable auto-scaling (Note: parameter name changed in v4.0)
enable_datacache_disk_auto_adjust = false
datacache_enable = true
resources:
requests:
cpu: 4
memory: 8Gi
# If you want to remove one resource limit, e.g., cpu, you can set it to cpu: "unlimited".
limits:
cpu: 8
memory: 8GiRocky
04/02/2026, 1:31 PMstarlet_port is essential for heartbeat and communication. While it defaults to 9070, it is good practice to explicitly include it in your config block to avoid any confusion or conflicts:
properties
starlet_port = 9070
*2. Spill-to-Disk Storage*
You currently have spillStorageSize: 0Gi and spillMountPath: "".
* Recommendation: If your queries involve large joins or aggregations that might exceed the available memory, StarRocks can "spill" intermediate data to disk to prevent OOM (Out of Memory) errors.
* If you plan to enable spilling (via the session variable enable_spill = true), I recommend allocating at least 20-50Gi of persistent storage for spilling.
* Update your configuration like this:
yaml
spillStorageClassName: "your-storage-class" # Use a fast SSD class if possible
spillStorageSize: 50Gi
spillMountPath: "/opt/starrocks/cn/spill"
*3. Data Cache and Storage Paths*
Your storage_root_path setup for multiple disks is correct. Since you have storageCount: 2 and storageMountPath: "/opt/starrocks/cn/storage", the StarRocks Operator will mount the volumes at /opt/starrocks/cn/storage0 and /opt/starrocks/cn/storage1.
* Data Cache Capacity: Setting datacache_disk_size = 80% is a safe and recommended threshold. This ensures 20% of the disk remains free for metadata and system overhead.
* Manual vs. Auto-Adjust: You have enable_datacache_disk_auto_adjust = false. This is perfectly fine if you want strict control. However, note that if you are using StarRocks v3.3 or higher, enable_datacache_disk_auto_adjust = true (default) is often preferred as it dynamically manages cache eviction based on high/low watermarks.
*4. Log Storage*
Your logStorageSize: 20Gi is usually sufficient for standard INFO logging. However, if you ever need to enable DEBUG logging for troubleshooting, logs can grow very quickly. Ensure you have a log rotation policy or consider increasing this to 50Gi if disk space is not a constraint.
*5. Resource Requests/Limits (Crucial)*
Although not shown in your snippet, ensure that your CN Pods have requests and limits defined for CPU and Memory.
* Memory: CN nodes rely heavily on memory for the Page Cache.
* CPU: Ensure that requests and limits are equal to prevent CPU throttling, which can significantly degrade query performance.
Summary of Recommended Config Block Additions:
properties
# Add the starlet port
starlet_port = 9070
# Ensure data cache is enabled (default is true, but good to be explicit)
datacache_enable = true
# If you decide to add spill storage in storageSpec:
# spill_local_storage_path = /opt/starrocks/cn/spill
Let me know if you need help with the CPU/Memory resource sizing or FE-side configurations!
References
• data_source/data_cache.md
• using_starrocks/caching/block_cache.md
• administration/management/BE_configuration.md
• sql-reference/System_variable.mdRocky
04/02/2026, 1:35 PMspillStorageSize: 0Gi).
* Recommendation: Increase memory to at least 16Gi or 32Gi for small workloads, and 64Gi+ for production. Keep requests and limits equal for memory (Guaranteed QoS) to prevent Kubernetes from killing the pod unexpectedly.
* CPU: 4-8 cores is acceptable for small workloads, but StarRocks scales linearly with CPU. For high-performance requirements, 16 cores is the standard recommendation.
2. Data Cache Configuration
* Storage Path Consistency: Your storage_root_path correctly matches the StarRocks Operator's behavior of appending an index (0, 1) to the storageMountPath when storageCount > 1.
* Cache Size: You have 40Gi total storage (2 x 20Gi) and datacache_disk_size = 80%. This provides ~32Gi of cache.
* Recommendation: If your hot dataset is larger than 32Gi, you will see frequent cache evictions and high remote I/O latency. Consider increasing storageSize to 100Gi+ per disk if your disk type (e.g., GP3/SSD) allows.
* Parameter Name: You correctly noted that enable_datacache_disk_auto_adjust is the parameter name for v4.0+. If you are on an older version (v3.3.x), the parameter is datacache_auto_adjust_enable.
3. Query Spilling
* Spill Storage: You have set spillStorageSize: 0Gi.
* Recommendation: If you cannot increase the RAM significantly, you must enable spilling to prevent large queries (joins/aggregations) from failing when they exceed the 8Gi memory limit.
* Update:
yaml
spillStorageClassName: "standard" # or your SSD class
spillStorageSize: 50Gi
spillMountPath: "/opt/starrocks/cn/spill"
* In the config section, add: spill_local_storage_dir = /opt/starrocks/cn/spill
4. Port Configuration
* Redundancy: The ports (be_port, webserver_port, etc.) are typically managed by the StarRocks Operator. Unless you are using a non-standard network setup or host networking, you can often omit these from the config block to keep it clean.
* Starlet Port: In shared-data mode, CNs use a starlet_port (default 9070). Ensure this port is not blocked if you have custom network policies.
Revised Recommended Configuration Fragment:
yaml
resources:
requests:
cpu: 8
memory: 32Gi # Increased for stability
limits:
cpu: 8
memory: 32Gi
storageSpec:
name: "cn-cache-storage"
storageSize: 100Gi # Increased for better cache hit ratio
storageCount: 2
storageMountPath: "/opt/starrocks/cn/storage"
logStorageSize: 20Gi
spillStorageSize: 50Gi # Enabled to prevent OOM
spillMountPath: "/opt/starrocks/cn/spill"
config: |
sys_log_level = INFO
datacache_enable = true
datacache_disk_size = 80%
enable_datacache_disk_auto_adjust = false
storage_root_path = /opt/starrocks/cn/storage0;/opt/starrocks/cn/storage1
spill_local_storage_dir = /opt/starrocks/cn/spill
Additional Tip:
Check your FE configuration to ensure prefer_compute_node = true and use_compute_node_number_priority_over_be = true (depending on version) are set so that the FE actually routes queries to your CNs instead of the BEs.
References
• administration/management/BE_configuration.md
• data_source/data_cache.md
• sql-reference/System_variable.mdRumit Jain
04/09/2026, 10:33 AMRocky
04/09/2026, 10:33 AMCREATE PIPE operation, you need to grant the CREATE PIPE privilege on the specific database to your role.
In StarRocks v3.2 and later (where the Pipe feature was introduced), permissions for pipes are managed at two levels: the Database level (to create them) and the Pipe level (to manage/use them).
Solution: Grant the Privilege
Run the following SQL command as a user with the user_admin role (typically the root user):
sql
GRANT CREATE PIPE ON DATABASE sample_db_name TO ROLE sr_admin_role;
Additional Considerations
If you also need the user/role to be able to manage the pipe after it is created (e.g., to alter, drop, or check status), you should consider granting these additional privileges:
1. To manage a specific pipe:
sql
GRANT USAGE, ALTER, DROP ON PIPE <pipe_name> TO ROLE sr_admin_role;
2. To manage all pipes in the database:
sql
GRANT USAGE, ALTER, DROP ON ALL PIPES IN DATABASE sample_db_name TO ROLE sr_admin_role;
Why did this happen?
Even if your role is named sr_admin_role, if it is a custom role (not the built-in db_admin or root), it does not automatically inherit new feature privileges like Pipe unless they are explicitly granted. The error message indicates that while sr_admin_role is active, it simply lacks the specific CREATE PIPE permission for sample_db_name.
Note: Ensure you are using StarRocks version 3.2.3 or higher for full support of the CREATE OR REPLACE PIPE syntax and its associated privilege system.
References
• administration/user_privs/authorization/privilege_item.md
• sql-reference/sql-statements/loading_unloading/pipe/CREATE_PIPE.mdRumit Jain
04/09/2026, 10:37 AMGRANT CREATE PIPE ON DATABASE sample_db_name TO ROLE sr_admin_role;Rumit Jain
04/09/2026, 10:37 AMGRANT CREATE PIPE ON DATABASE sample_db_name TO ROLE sr_admin_role;Rocky
04/09/2026, 10:37 AMCREATE PIPE privilege globally across all databases in the current catalog using the following syntax:
sql
GRANT CREATE PIPE ON ALL DATABASES TO ROLE sr_admin_role;
Key points about this command:
1. Scope: This allows the sr_admin_role to create pipes in any existing database and any database created in the future within the current catalog (usually default_catalog).
2. Prerequisites: You must be logged in as a user with the user_admin role (like the root user) to execute this command.
3. Activation: If the role is already assigned to your user, you may need to run SET ROLE sr_admin_role; or re-login for the new permissions to take effect in your current session.
Related management privileges
If you want the role to also be able to manage (start, stop, or drop) any pipe across the entire cluster, you should also grant privileges on the Pipe objects themselves:
sql
-- Grant permission to manage (ALTER, DROP, USAGE) all pipes in all databases
GRANT ALL PRIVILEGES ON ALL PIPES IN ALL DATABASES TO ROLE sr_admin_role;
Summary of common "Pipe" privileges:
Privilege | Level | Description
CREATE PIPE | DATABASE | Permission to create a new pipe in a database.
USAGE | PIPE | Permission to view pipe status (SHOW PIPES) or use it.
ALTER | PIPE | Permission to pause/resume or modify the pipe.
DROP | PIPE | Permission to delete the pipe.
By using ON ALL DATABASES or ON ALL PIPES IN ALL DATABASES, you eliminate the need to grant permissions line-by-line for every individual database.
References
• sql-reference/sql-statements/account-management/GRANT.md
• sql-reference/sql-statements/loading_unloading/pipe/CREATE_PIPE.mdRocky
04/09/2026, 10:37 AMCREATE PIPE privilege globally across all databases in the current catalog by using the ALL DATABASES keyword.
Grant Create Access Globally
To allow the role to create pipes in any database, run:
sql
GRANT CREATE PIPE ON ALL DATABASES TO ROLE sr_admin_role;
Grant Management Access Globally (Optional)
If you also want this role to be able to manage (view, modify, or delete) all existing and future pipes across all databases, you should also grant the following:
sql
GRANT USAGE, ALTER, DROP ON ALL PIPES IN ALL DATABASES TO ROLE sr_admin_role;
Important Notes:
1. Catalog Context: These commands apply to the current catalog (usually default_catalog). If you are working across multiple catalogs, ensure you have set the correct catalog using SET CATALOG <catalog_name>; before running the grant.
2. Required Role: You must execute these commands as a user with the user_admin or root role.
3. Permissions Logic: In StarRocks v3.x, the CREATE PIPE privilege is a database-level permission (allowing you to create the object), while USAGE, ALTER, and DROP are pipe-level permissions (allowing you to interact with the created object). Using ALL DATABASES is the standard way to scale these permissions globally.
References
• sql-reference/sql-statements/account-management/GRANT.md
• administration/user_privs/authorization/privilege_item.md
References
• sql-reference/sql-statements/account-management/GRANT.md
• sql-reference/sql-statements/loading_unloading/pipe/CREATE_PIPE.mdRumit Jain
04/10/2026, 6:46 AMRocky
04/10/2026, 6:46 AMUSAGE is not a valid privilege for a DATABASE object. In StarRocks, USAGE applies to objects like CATALOG, PIPE, RESOURCE, or STORAGE VOLUME.
To fix the error on your second cluster, you need to separate the database-level permissions from the pipe-level permissions.
──────────
Why is Cluster 1 showing it?
In early versions of the v3.x RBAC system or certain sub-versions of v3.2, the SHOW GRANTS output sometimes merged or displayed privileges in a way that appeared as ON ALL DATABASES. However, in the current strict syntax (which your second cluster is enforcing), StarRocks distinguishes between:
1. Database Privileges: What you can create inside the database (e.g., CREATE PIPE).
2. Pipe Privileges: What you can do to the pipes themselves (e.g., ALTER, DROP, USAGE).
How to apply the same permissions to Cluster 2
To achieve the same level of access on your second cluster, run these two commands separately:
1. Grant the ability to CREATE pipes in any database:
sql
GRANT CREATE PIPE ON ALL DATABASES TO ROLE sr_admin_role;
2. Grant the ability to manage (ALTER, DROP, USAGE) all pipes:
sql
GRANT ALTER, DROP, USAGE ON ALL PIPES IN ALL DATABASES TO ROLE sr_admin_role;
──────────
Detailed Breakdown of Privileges
The reason your command GRANT ALTER, DROP, USAGE ON ALL DATABASES... failed is the keyword USAGE. Here is the supported syntax:
Object Type | Valid Privileges | Correct Syntax Example
DATABASE | CREATE PIPE, CREATE TABLE, ALTER, DROP | GRANT CREATE PIPE ON ALL DATABASES...
PIPE | USAGE, ALTER, DROP | GRANT USAGE ON ALL PIPES IN ALL DATABASES...
What does USAGE on a Pipe do?
It allows the user to see the pipe's status (via SHOW PIPES) and interact with it. Without USAGE on the Pipe object, a user cannot monitor the data loading process even if they have SELECT on the destination table.
What about ALTER and DROP?
• ALTER/DROP on DATABASE level: Allows you to modify or delete the database itself.
• ALTER/DROP on PIPE level: Allows you to modify or delete the Pipe objects inside the database.
Recommendation:
Use the two-command approach mentioned above. This follows the latest StarRocks security model and will work across all v3.2+ clusters.
References
• sql-reference/sql-statements/loading_unloading/pipe/SHOW_PIPES.md
• sql-reference/sql-statements/account-management/SHOW_GRANTS.md
• sql-reference/information_schema/pipes.md
• sql-reference/sys/grants_to_users.md
• sql-reference/sys/grants_to_roles.mdRumit Jain
04/10/2026, 7:25 AMRocky
04/10/2026, 7:25 AMsql
CREATE STORAGE VOLUME backup_volume
TYPE = S3
LOCATIONS = ("<s3://my-starrocks-backups/>")
PROPERTIES (
"aws.s3.region" = "us-east-1",
"aws.s3.access_key" = "XXXX",
"aws.s3.secret_key" = "YYYY"
);
3. Use the new volume for backups/exports: When running an EXPORT job or creating an external table for "backups," specify the storage_volume property:
sql
EXPORT TABLE my_table
TO "<s3://my-starrocks-backups/export/>"
PROPERTIES ("storage_volume" = "backup_volume");
Note: In StarRocks v3.5+, the new "Cluster Snapshot" feature for shared-data mode currently stores snapshots in the same location as the data directory. For true bucket-level isolation of snapshots, manual data exports to a separate volume are recommended.
──────────
2. If you are using Shared-Nothing (Classic Architecture)
In the classic architecture, your "data storage" usually refers to local disks on the BE nodes or S3-based External Tables, while "backups" are handled via the BACKUP and RESTORE commands using a Repository.
* To isolate them: Simply ensure the LOCATION in your CREATE REPOSITORY statement points to a different bucket than your external tables or load sources.
Step-by-step:
1. Create a repository pointing to your dedicated backup bucket:
sql
CREATE REPOSITORY my_backup_repo
WITH BROKER
ON LOCATION "<s3a://my-dedicated-backup-bucket/snapshots>"
PROPERTIES (
"aws.s3.access_key" = "XXXX",
"aws.s3.secret_key" = "YYYY",
"aws.s3.region" = "us-east-1"
);
2. Run your backup:
sql
BACKUP SNAPSHOT sample_db.snapshot_1
TO my_backup_repo;
Summary of Objects for Isolation
Feature | Object Used | Can use different bucket?
Internal Data (Shared-Data) | Default Storage Volume | Yes
External Tables | Storage Volume / Catalog | Yes
Backups (Classic) | Repository | Yes
Data Exports | Storage Volume / Path | Yes
By defining multiple Storage Volumes or Repositories, you can map different StarRocks operations to entirely different S3 buckets or even different cloud providers.
References
• administration/management/Backup_and_restore.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
References
• faq/Exporting_faq.md
• administration/management/Backup_and_restore.md
• deployment/shared_data/s3.mdRocky
04/10/2026, 7:27 AMbuiltin_storage_volume. You can redirect the snapshot's metadata to a separate, isolated S3 bucket by creating a new Storage Volume and pointing the snapshot task to it.
Step-by-step:
1. Create a new S3 bucket (e.g., `s3://starrocks-backup-metadata/`).
2. Create a new Storage Volume in StarRocks:
sql
CREATE STORAGE VOLUME backup_volume
TYPE = S3
LOCATIONS = ("<s3://starrocks-backup-metadata/>")
PROPERTIES (
"aws.s3.region" = "us-east-1",
"aws.s3.access_key" = "...",
"aws.s3.secret_key" = "..."
);
3. Point the automated snapshot to this new volume:
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME backup_volume;
2. The Difference Between Metadata and Data Isolation
In the current StarRocks Shared-Data architecture (v3.4+):
* Metadata Snapshots: These are stored in the bucket you specified above (backup_volume). This contains the "brains" of your cluster (schema, users, permissions, and file pointers).
* Data Snapshots: Because copying petabytes of data to a second bucket every 10 minutes would be extremely slow and expensive, data snapshots remain in the primary storage bucket. StarRocks marks these data files as "referenced" so they aren't deleted by garbage collection, ensuring you can always roll back to that point in time.
3. Summary of Isolation Levels
Feature | Location | Isolated?
Primary Data | builtin_storage_volume (Bucket A) | -
Snapshot Metadata | backup_volume (Bucket B) | Yes (if you follow the steps above)
Actual Data Files | builtin_storage_volume (Bucket A) | No (they stay in the primary bucket)
Recommendation for True Bucket Isolation
If your goal is Total Disaster Recovery (e.g., protection against the entire primary S3 bucket being deleted), you should rely on AWS S3 Cross-Region Replication (CRR) or Same-Region Replication (SRR) at the S3 bucket level.
By enabling S3 Replication on your primary bucket to a secondary bucket, AWS handles the physical data movement, while StarRocks' ADMIN SET AUTOMATED CLUSTER SNAPSHOT handles the point-in-time consistency of the metadata.
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
References
• administration/cluster_snapshot.md
• administration/management/FE_configuration.mdRumit Jain
04/10/2026, 7:38 AMCREATE STORAGE VOLUME backup_volume
TYPE = S3
LOCATIONS = ("<s3://starrocks-backup-metadata/>")
PROPERTIES (
"aws.s3.region" = "us-east-1",
"aws.s3.access_key" = "...",
"aws.s3.secret_key" = "..."
);Rocky
04/10/2026, 7:39 AM"aws.s3.use_aws_sdk_default_behavior" = "true".
sql
CREATE STORAGE VOLUME backup_volume
TYPE = S3
LOCATIONS = ("<s3://starrocks-backup-metadata/>")
PROPERTIES (
"enabled" = "true",
"aws.s3.region" = "us-east-1",
"aws.s3.use_aws_sdk_default_behavior" = "true"
);
Key Requirements for this to work:
1. ServiceAccount Annotation: Your Kubernetes ServiceAccount (used by FE and CN/BE pods) must be annotated with the IAM Role ARN:
yaml
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
<http://eks.amazonaws.com/role-arn|eks.amazonaws.com/role-arn>: arn:aws:iam::123456789012:role/my-starrocks-backup-role
name: starrocks-service-account
2. Pod Identity: Ensure your StarRocks FE and CN/BE pods are actually using that ServiceAccount.
3. Trust Relationship: The IAM Role (my-starrocks-backup-role) must have a trust relationship allowing your EKS OIDC provider to assume it.
4. S3 Permissions: The IAM Role must have s3:PutObject, s3:GetObject, s3:ListBucket, and s3:DeleteObject permissions on the starrocks-backup-metadata bucket.
Alternative: Explicit Role Assumption
If your pod has a "base" IRSA role but you want this specific Storage Volume to assume a different role (Chain of Trust), you can specify the ARN explicitly:
sql
CREATE STORAGE VOLUME backup_volume
TYPE = S3
LOCATIONS = ("<s3://starrocks-backup-metadata/>")
PROPERTIES (
"enabled" = "true",
"aws.s3.region" = "us-east-1",
"aws.s3.use_instance_profile" = "true", -- This tells SR to use the pod's identity
"aws.s3.iam_role_arn" = "arn:aws:iam::123456789012:role/specific-backup-role"
);
Recommendation: For standard IRSA setups, use the first method (aws.s3.use_aws_sdk_default_behavior = true) as it is the most robust and follows AWS best practices.
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• administration/cluster_snapshot.md
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.mdRumit Jain
04/10/2026, 7:41 AMADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME backup_volume;Rocky
04/10/2026, 7:41 AMsql
CREATE STORAGE VOLUME new_backup_volume
TYPE = S3
LOCATIONS = ("<s3://new-starrocks-backup-bucket/>")
PROPERTIES (
"aws.s3.region" = "us-east-1",
"aws.s3.use_aws_sdk_default_behavior" = "true"
);
2. Disable the Current Snapshot (Clean up)
Disable the automated snapshot feature. This triggers StarRocks to purge the metadata snapshot currently residing in the old backup_volume.
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT OFF;
_Note: Wait a few moments (or check information_schema.cluster_snapshots) to ensure the old snapshot record is cleared._
3. Enable Snapshot on the New Volume
Now, point the automated snapshots to your new isolated bucket:
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME new_backup_volume;
──────────
Important Considerations
* Metadata vs. Data: As a reminder, this command moves the metadata (the FE state) to the new bucket. The actual data files (the CN state) will remain in the primary data bucket (the builtin_storage_volume). StarRocks snapshots work by referencing the data files in-place to avoid the cost and time of copying petabytes of data.
* One Snapshot Policy: StarRocks only retains one automated snapshot at a time. Every time a new snapshot is created (default every 10 minutes), the previous one is deleted. By turning the feature OFF then ON, you ensure the "one snapshot" logic cleans up the old bucket before moving to the new one.
* Verification: You can verify that snapshots are being created in the new location by running:
sql
SELECT * FROM information_schema.cluster_snapshots;
Look at the storage_volume and storage_path columns to confirm they point to new_backup_volume.
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
References
• administration/cluster_snapshot.md
• administration/management/FE_configuration.mdRumit Jain
04/10/2026, 8:21 AMRocky
04/10/2026, 8:21 AMDROP STORAGE VOLUME command. However, because you are currently using this volume for snapshots, there are specific steps you must follow to avoid errors.
1. Disable or Redirect Snapshots first
StarRocks will not allow you to drop a storage volume if it is actively being referenced. Since you have configured automated snapshots to use backup_volume, you must first detach it:
sql
-- Option A: Turn off snapshots (cleans up metadata in that bucket)
ADMIN SET AUTOMATED CLUSTER SNAPSHOT OFF;
-- Option B: Point snapshots to a different volume
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME another_volume;
2. Drop the Storage Volume
Once the volume is no longer in use by snapshots (or any databases/tables), you can drop it:
sql
DROP STORAGE VOLUME backup_volume;
Important Restrictions
* Built-in Volume: You cannot drop the builtin_storage_volume.
* Default Volume: You cannot drop a volume if it is currently set as the default storage volume for the cluster. You can check this by running SHOW STORAGE VOLUMES.
* Active Data: You cannot drop a volume if any databases or tables were created using it (e.g., CREATE DATABASE ... PROPERTIES("storage_volume" = "backup_volume")).
* Privileges: You must have the DROP privilege on the storage volume.
Verification
To see a list of your current volumes and confirm if they are "Default" or "Enabled" before dropping, use:
sql
SHOW STORAGE VOLUMES;
References
• sql-reference/sql-statements/cluster-management/storage_volume/DROP_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/SHOW_STORAGE_VOLUMES.md
• administration/cluster_snapshot.md
References
• sql-reference/sql-statements/cluster-management/storage_volume/DROP_STORAGE_VOLUME.md
• administration/user_privs/authorization/privilege_item.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/DESC_STORAGE_VOLUME.mdRumit Jain
04/10/2026, 9:38 AMSELECT * FROM INFORMATION_SCHEMA.CLUSTER_SNAPSHOT_JOBS;
| automated_cluster_snapshot_1775813769049 | 11274 | 2026-04-10 09:36:09 | NULL | ERROR | | upload image failed, err msg: Failed to copy local /opt/starrocks/fe/meta/image to <s3://backup-test//cee3b605-c1d6-4503-be6f-e0c4280aaa15/meta/image/automated_cluster_snapshot_1775813769049> |
This is how I created the storage volume:
CREATE STORAGE VOLUME backup_volume
TYPE = S3
LOCATIONS = ("<s3://backup-test/>")
PROPERTIES (
"enabled" = "true",
"aws.s3.region" = "us-east-1",
"aws.s3.use_aws_sdk_default_behavior" = "true",
"aws.s3.use_instance_profile" = "false",
"aws.s3.endpoint":"<https://s3.us-east-1.amazonaws.com>"
);Rocky
04/10/2026, 9:39 AMCREATE STORAGE VOLUME syntax: the inclusion of angle brackets (< >) and the trailing slash in the S3 location.
1. Remove the Angle Brackets (< >)
In documentation, <...> are used as placeholders. If you include them in your SQL command, StarRocks treats them as part of the actual bucket name or URL.
Your error message confirms this:
Failed to copy ... to <<s3://backup-test//>...
The fact that the error message starts with < means StarRocks is trying to write to a bucket that literally starts with that character, which is an invalid S3 path.
2. Remove the Trailing Slash
Your location ends with a slash: <s3://backup-test/>. StarRocks automatically appends subdirectories (like the Service ID and meta/image/) to this path. Having a trailing slash in the LOCATIONS property often results in a double slash (//) in the final URI, which can lead to authentication or path resolution errors.
Corrected Syntax
Run this to recreate your storage volume (you will need to DROP the old one first or use a different name):
sql
-- Drop the problematic volume first
DROP STORAGE VOLUME backup_volume;
CREATE STORAGE VOLUME backup_volume
TYPE = S3
LOCATIONS = ("<s3://backup-test>") -- No brackets, no trailing slash
PROPERTIES (
"enabled" = "true",
"aws.s3.region" = "us-east-1",
"aws.s3.use_aws_sdk_default_behavior" = "true"
);
Why I removed the other properties:
* aws.s3.endpoint: For standard AWS S3 in us-east-1, you do not need to specify the endpoint. The SDK will resolve it automatically. If you must use it, ensure there are no < > brackets.
* aws.s3.use_instance_profile: When using IRSA (Web Identity tokens), aws.s3.use_aws_sdk_default_behavior is the recommended setting as it covers the full credential chain.
Final Verification
After running the corrected command, check the status of the next snapshot job:
1. Wait for the next checkpoint (default 10 mins) or check SELECT * FROM INFORMATION_SCHEMA.CLUSTER_SNAPSHOT_JOBS;.
2. Ensure your FE pods have the correct IAM permissions. Even with the right syntax, the IAM Role assigned to your ServiceAccount must have s3:PutObject and s3:GetBucketLocation for the backup-test bucket.
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/cluster_snapshot.md
• deployment/shared_data/s3.md
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/cluster_snapshot.md
• deployment/shared_data/s3.md
• sql-reference/sql-statements/cluster-management/storage_volume/DROP_STORAGE_VOLUME.md
VOLUME)
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.mdRumit Jain
04/10/2026, 11:55 AMconfigMaps:
# e.g., create my-configmap
- name: cluster-snapshot
data:
cluster_snapshot.yaml: |
cluster_snapshot:
cluster_snapshot_path: <s3://automatic-snapshot-starrocks-backup/cee3b605-c1d6-4503-be6f-e0c4280aaa15/meta/image/automated_cluster_snapshot_1775821569099>
storage_volume_name: backup_volume
frontends: []
compute_nodes: []
storage_volumes:
- name: builtin_storage_volume
type: S3
location: <s3://actual-starrocks-data>
comment: my s3 volume
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.endpoint
value: <https://s3.us-east-1.amazonaws.com>
- key: aws.s3.use_instance_profile
value: false
- key: aws.s3.use_aws_sdk_default_behavior
value: true
These are two storage volumes:
show storage volumes;
+------------------------+
| Storage Volume |
+------------------------+
| backup_volume |
| builtin_storage_volume |
+------------------------+
Now:
backup_volume is for automatic-snapshot
and builtin_storage_volume is for actual data.Rocky
04/10/2026, 11:55 AMcluster_snapshot.yaml must define both storage volumes.
When you restore a cluster from a snapshot, StarRocks needs the snapshot volume to read the metadata (users, schemas, state) and the data volume to find the actual table data. If you omit the data volume from the YAML, the restored FE will not know where your tablets are stored.
Corrected cluster_snapshot.yaml for DR
Ensure you remove all < > brackets and trailing slashes in the location fields.
yaml
cluster_snapshot:
# The specific path to the snapshot folder in your snapshot bucket
cluster_snapshot_path: <s3://automatic-snapshot-starrocks-backup/cee3b605-c1d6-4503-be6f-e0c4280aaa15/meta/image/automated_cluster_snapshot_1775821569099>
# The name of the volume where the snapshot is stored
storage_volume_name: backup_volume
# Optionally define FE/CN nodes here if you want to initialize them automatically
frontends: []
compute_nodes: []
storage_volumes:
# 1. Define the Snapshot Volume (must match storage_volume_name above)
- name: backup_volume
type: S3
location: <s3://automatic-snapshot-starrocks-backup>
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.use_aws_sdk_default_behavior
value: true
# 2. Define the Data Volume (where the actual table data lives)
- name: builtin_storage_volume
type: S3
location: <s3://actual-starrocks-data>
comment: "Primary data bucket"
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.use_aws_sdk_default_behavior
value: true
Key Requirements for Disaster Recovery
1. Volume Names Must Match: The names (backup_volume and builtin_storage_volume) must be identical to the names in the original cluster. The FE metadata contains hardcoded references to these volume names.
2. Snapshot URI: The cluster_snapshot_path should point directly to the folder containing the image.xxxx files for that specific snapshot.
3. Clean Metadata: When starting the new cluster, the meta/ directory on all FE nodes and the storage/ directories on all CN nodes must be empty.
4. Startup Flag: You must start the Leader FE with the --cluster_snapshot flag to trigger the restoration process:
bash
./bin/start_fe.sh --cluster_snapshot --daemon
Why both volumes are needed:
* backup_volume: This is used during the boot process to download the metadata image.
* builtin_storage_volume: Once the metadata is loaded, StarRocks will try to access the data. Since the metadata "remembers" that data is stored in builtin_storage_volume, this volume must be pre-configured in the YAML so the cluster knows how to connect to that bucket immediately upon startup.
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
References
• administration/cluster_snapshot.md
• administration/management/Backup_and_restore.mdRumit Jain
04/10/2026, 12:58 PMconfigMaps:
# e.g., create my-configmap
- name: cluster-snapshot
data:
cluster_snapshot.yaml: |
cluster_snapshot:
cluster_snapshot_path: <s3://starrocks-backup-test/cee3b605-c1d6-4503-be6f-e0c4280aaa15/meta/image/automated_cluster_snapshot_1775822769104>
storage_volume_name: backup_volume
frontends: []
compute_nodes: []
storage_volumes:
- name: backup_volume
type: S3
location: <s3://starrocks-backup-test>
comment: "my s3 backup volume"
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.endpoint
value: <https://s3.us-east-1.amazonaws.com>
- key: aws.s3.use_instance_profile
value: false
- key: aws.s3.use_aws_sdk_default_behavior
value: true
- name: builtin_storage_volume
type: S3
location: <s3://starrocks-data>
comment: "Primary data bucket"
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.endpoint
value: <https://s3.us-east-1.amazonaws.com>
- key: aws.s3.use_instance_profile
value: false
- key: aws.s3.use_aws_sdk_default_behavior
value: true
And this is my volume:
desc storage volume builtin_storage_volume\G;
*************************** 1. row ***************************
Name: builtin_storage_volume
Type: S3
IsDefault: true
Location: s3://starrocks-data
Params: {"aws.s3.region":"us-east-1","aws.s3.use_aws_sdk_default_behavior":"true","aws.s3.endpoint":"https://s3.us-east-1.amazonaws.com"}
Enabled: true
Comment: Primary data bucketRocky
04/10/2026, 12:58 PM< >) and malformed URLs in your YAML are preventing the Compute Nodes (CN) from connecting to the data bucket.
When the Leader FE restores the snapshot, it reads the metadata from the backup_volume. However, for the actual table data, the CN nodes must use the definition of builtin_storage_volume. Because your YAML contains <s3://starrocks-data>, the CNs are trying to access a bucket name that starts with a literal < character, which S3 rejects.
Corrected cluster_snapshot.yaml
You must remove all < > brackets and ensure the endpoints do not have brackets.
yaml
configMaps:
- name: cluster-snapshot
data:
cluster_snapshot.yaml: |
cluster_snapshot:
# Remove brackets from the path
cluster_snapshot_path: <s3://starrocks-backup-test/cee3b605-c1d6-4503-be6f-e0c4280aaa15/meta/image/automated_cluster_snapshot_1775822769104>
storage_volume_name: backup_volume
frontends: []
compute_nodes: []
storage_volumes:
- name: backup_volume
type: S3
location: <s3://starrocks-backup-test>
comment: "my s3 backup volume"
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.use_aws_sdk_default_behavior
value: true
- name: builtin_storage_volume
type: S3
# IMPORTANT: Remove brackets here so CNs can find the data
location: <s3://starrocks-data>
comment: "Primary data bucket"
properties:
- key: aws.s3.region
value: us-east-1
# Standard AWS S3 does not need the endpoint key.
# If you use it, ensure no brackets: <https://s3.us-east-1.amazonaws.com>
- key: aws.s3.use_aws_sdk_default_behavior
value: true
Steps to Fix and Verify
1. Update the ConfigMap/YAML: Apply the corrected YAML (no brackets).
2. Clean and Restart: To trigger a fresh restore:
* Stop all FE and CN nodes.
* Delete the meta/ directory on all FEs and the storage/ directory on all CNs.
* Restart the Leader FE with the --cluster_snapshot flag.
* Restart other FEs and CNs.
3. Check Volume Status:
Run SHOW STORAGE VOLUMES; and DESC STORAGE VOLUME builtin_storage_volume;.
Ensure the Location field does not contain < >.
4. Check CN Status:
Run SHOW COMPUTE NODES;. Ensure the nodes are Alive: true. If the CNs have incorrect S3 credentials or malformed paths from the YAML, they may fail to initialize properly.
5. Check Query Errors:
If you try SELECT * FROM your_table LIMIT 10; and it returns an error, check the fe.log or cn.log. You will likely see an S3 "Invalid Bucket Name" or "Access Denied" error caused by the literal brackets in the path.
Why this happened
In StarRocks documentation, <...> represents a placeholder that you should replace with your own value. If you include the brackets in the actual SQL or YAML, they are treated as literal characters in the string. S3 buckets and URLs cannot contain these characters.
References
• administration/cluster_snapshot.md
• deployment/shared_data/s3.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
References
• administration/cluster_snapshot.md
• deployment/shared_data/feature-support-shared-data.mdRocky
04/10/2026, 12:58 PMRocky
04/10/2026, 1:02 PM< > in your editor, they are definitely present in your cluster's actual configuration. We can see them in the DESC STORAGE VOLUME output you provided:
1. In the Location: Location: <http://s3://starrocks-data|s3://starrocks-data> (This looks like a Slack-formatted link was accidentally pasted).
2. In the Params: "aws.s3.endpoint":"<https://s3.us-east-1.amazonaws.com>"
When StarRocks sees these brackets, it tries to connect to an S3 endpoint literally named <https. This causes the connection to the data bucket to fail. Since the FE was able to read the snapshot metadata (tables/users), it means the backup_volume was partially working, but the builtin_storage_volume (which holds the actual table data) is broken.
How to Fix
You must recreate the volumes or the cluster_snapshot.yaml without any angle brackets or Slack-style formatting.
1. Corrected cluster_snapshot.yaml
Update your ConfigMap with this exact text. Do not add brackets.
yaml
cluster_snapshot:
cluster_snapshot_path: <s3://starrocks-backup-test/cee3b605-c1d6-4503-be6f-e0c4280aaa15/meta/image/automated_cluster_snapshot_1775822769104>
storage_volume_name: backup_volume
storage_volumes:
- name: backup_volume
type: S3
location: <s3://starrocks-backup-test>
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.use_aws_sdk_default_behavior
value: true
- name: builtin_storage_volume
type: S3
location: <s3://starrocks-data>
properties:
- key: aws.s3.region
value: us-east-1
- key: aws.s3.use_aws_sdk_default_behavior
value: true
2. Re-trigger the Restore
Because the metadata is already "half-restored" with bad volume info, the cleanest way is to restart the process:
1. Stop the FEs and CNs.
2. Delete the meta/ directory on FEs and the storage/ directory on CNs.
3. Apply the corrected ConfigMap.
4. Start the Leader FE with the --cluster_snapshot flag.
How to Verify the Data Connection
Once the cluster is up, run these commands to see why data isn't showing:
* Check Volume Location:
DESC STORAGE VOLUME builtin_storage_volume;
Ensure the Location is exactly <s3://starrocks-data> (no http, no |, no < >).
* Check Tablet Metadata:
SHOW TABLETS FROM your_table_name;
If this returns rows, the metadata is restored.
* Check CN Logs:
Check your CN node logs (<http://cn.INFO|cn.INFO>). Look for errors like:
* curl_easy_perform() failed: Couldn't resolve host name (This happens if the endpoint has brackets).
* S3 Error: [InvalidBucketName] (This happens if the location has brackets).
Note: In shared-data mode, StarRocks tables are CLOUD_NATIVE. If the storage volume is misconfigured, queries will usually throw an error (e.g., "Failed to get s3 client") rather than returning 0 rows. If you see 0 rows without an error, verify that the source table in the snapshot actually had data.
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
References
• administration/cluster_snapshot.md
• deployment/shared_data/s3.md
• sql-reference/sql-statements/cluster-management/storage_volume/DESC_STORAGE_VOLUME.mdRocky
04/10/2026, 1:02 PMRumit Jain
04/23/2026, 5:12 AMRocky
04/23/2026, 5:12 AMfe.conf and `be.conf`/`cn.conf`:
Before Starting (Compatibility)
* Disable Tablet Balancing: To prevent the cluster from trying to move data while nodes are restarting, run the following on the Leader FE:
sql
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_scheduling_tablets" = "0");
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_balancing_tablets" = "0");
Remember to set these back to their original values (usually 2000 and 100) after the upgrade is complete.
FE Changes (fe.conf)
* Query Queue V2: In v4.1, enable_query_queue_v2 is now true by default. If you previously relied on the legacy queue, you may see different scheduling behavior.
* Global Lazy Materialization: This is now enabled by default, which improves performance for wide-table scans by deferring column reads.
BE/CN Changes (be.conf / cn.conf)
* Metadata Fetching: Cloud-native tablet metadata fetching now uses a dedicated thread pool. You can tune this if you have a massive number of tablets, though the defaults are usually sufficient.
* Large Tablet Compaction: If you plan to use the new 100GB tablet feature, ensure your CN nodes have sufficient local cache disk space, as larger tablets require more cache for efficient compaction.
──────────
3. Upgrade Procedure & Downtime
Will there be downtime?
If you have a High Availability (HA) setup (3 FEs and multiple BEs/CNs), you can perform a rolling upgrade with zero downtime.
The Mandatory Upgrade Order:
1. Upgrade BEs and CNs first: Upgrade them one by one. StarRocks BEs/CNs are backward compatible with older FEs.
2. Upgrade Follower FEs: Upgrade all non-leader FE nodes.
3. Upgrade the Leader FE: This is the final step. When the Leader restarts, the cluster will briefly elect a new leader from the already-upgraded followers.
Important Downgrade Warning:
After upgrading to v4.1, you cannot downgrade to any version below v4.0.6. This is due to internal changes in how v4.1 manages tablet metadata and distribution. If you need a rollback plan, ensure you have a backup or that your starting version is at least v4.0.6.
Summary Checklist
1. [ ] Backup your FE metadata (meta/ directory).
2. [ ] Run ADMIN SET FRONTEND CONFIG to disable balancing.
3. [ ] Replace binaries and restart CNs/BEs one by one.Rocky
04/23/2026, 5:12 AMRumit Jain
04/23/2026, 12:23 PMRocky
04/23/2026, 12:23 PMfe-2, then fe-1, then fe-0). To ensure a safe upgrade from 4.0.1 to 4.1.0 where followers are upgraded before the leader, follow this strategy:
Step 1: Identify the Leader
Connect to your cluster via MySQL and run:
sql
SHOW FRONTENDS;
Look at the Role and Name columns.
* In Kubernetes, your FEs are likely named cluster-name-fe-0, fe-1, and fe-2.
* The Goal: You want the pod designated as LEADER to be the last one to restart.
Step 2: Optimal Scenario (Leader is fe-0)
If fe-0 is currently the Leader, you are in luck. The default Kubernetes behavior matches the StarRocks recommendation:
1. Kubernetes will update fe-2 (Follower).
2. Kubernetes will update fe-1 (Follower).
3. Kubernetes will update fe-0 (Leader).
In this case, simply update your values.yaml with the new image tag and run:
bash
helm upgrade <release-name> starrocks/kube-starrocks -f values.yaml
Step 3: Manual Control (Leader is NOT fe-0)
If the Leader is fe-1 or fe-2, a standard helm upgrade might restart the Leader before the Followers. To handle this manually:
Option A: Manual Leader Transfer (Easiest)
If you want to stick to a simple helm upgrade, you can "nudge" the leader to fe-0 before starting:
1. Identify the current leader (e.g., fe-2).
2. Delete that specific pod: kubectl delete pod <leader-pod-name>.
3. Wait for the pod to restart and check SHOW FRONTENDS; again.
4. Repeat until fe-0 is the Leader, then proceed with the Helm upgrade.
Option B: Use StatefulSet Partitioning (Advanced)
If you want precise control without deleting pods, you can use the partition strategy. This tells Kubernetes: "Only update pods with an index greater than or equal to X."
1. Update your values.yaml with the new 4.1.0 image.
2. In your StarRocksCluster CR (or via Helm values if your chart version supports it), set the partition to 2.
* This will only update fe-2.
3. Once fe-2 is healthy, set the partition to 1 to update fe-1.
4. Finally, set the partition to 0 to update the Leader (fe-0).
Important Reminders for 4.1.0 Upgrade:
* Upgrade CNs/BEs First: Always update your compute nodes/backends before touching the FEs. The operator will usually handle this by updating the BE StatefulSet first, but verify that all BE/CN pods are Running and Ready before the FEs start their rotation.
* Metadata Backup: Since v4.1.0 involves significant metadata changes (like automatic tablet splitting), manually back up your FE meta/ directory (or take a cloud snapshot of your PVs) before starting.
* Zero Downtime: With a 3-node FE setup, the cluster will remain available. When the Leader eventually restarts, there will be a brief (seconds) period where the cluster is "Leaderless" while a new one is elected. During this window, write operations might fail, but reads typically continue.
Recommended Helm Command:
bash
# To watch the upgrade progress in real-time
kubectl get pods -w -l "<http://app.kubernetes.io/component=fe|app.kubernetes.io/component=fe>"
References
• faq/operation_maintenance_faq.md
• deployment/upgrade.md
• administration/Meta_recovery.md
• deployment/deploy_manually.mdRumit Jain
04/23/2026, 12:50 PMRocky
04/23/2026, 12:51 PMStarRocksCluster Custom Resource Definition (CRD). Upgrading the operator (and applying the new CRD) prevents "unknown field" errors during your Helm upgrade.
3. Bug Fixes: Version 1.11.4 includes specific fixes for scale-in operations and better handling of `feEnvVars`/`beEnvVars` merging that were present in 1.11.3.
Recommended Upgrade Sequence
To ensure a smooth transition with the Helm chart, follow this order:
1. Upgrade the Operator & CRDs:
First, update your Helm repository and upgrade the operator itself. This does not restart your StarRocks database pods yet.
bash
helm repo update starrocks
helm upgrade <operator-release-name> starrocks/operator --version 1.11.4
Note: If you are using the unified kube-starrocks chart, the operator and cluster upgrade happen in one command, but the operator logic will take effect before it begins the rolling restart of the cluster.
2. Verify Operator Health:
Ensure the operator pod is running and healthy:
bash
kubectl get pods -l <http://app.kubernetes.io/name=operator|app.kubernetes.io/name=operator>
3. Upgrade the StarRocks Cluster:
Now, update your values.yaml with the StarRocks 4.1.0 image tags and perform the cluster upgrade:
bash
helm upgrade <cluster-release-name> starrocks/kube-starrocks -f values.yaml
Will it cause downtime?
* Operator Upgrade: Upgrading the operator itself (Step 1) does not cause downtime for the database. The operator is a management tool; its temporary restart does not stop the FE or BE processes.
* Cluster Upgrade: As long as you have 3 FEs and multiple BEs/CNs, the operator will perform a rolling restart. As discussed previously, if you ensure the Leader FE is the last one to be replaced (by following the ordinal pod order), the downtime will be near-zero (limited to a few seconds of leader election).
References
• release_notes/release-4.1.md
• deployment/helm.md
• administration/operator_management.md
• faq/operator_faq.mdRumit Jain
04/23/2026, 1:12 PM[Thu Apr 23 13:10:47 UTC 2026] Process conf file cn.conf ...
[Thu Apr 23 13:10:47 UTC 2026] Add myself (kube-starrocks-cn-0.kube-starrocks-cn-search.olymsre01.svc.cluster.local:9050) into FE ...
ERROR 1064 (HY000) at line 1: Compute node already exists with same host kube-starrocks-cn-0.kube-starrocks-cn-search.olymsre01.svc.cluster.local and port 9050
[Thu Apr 23 13:10:47 UTC 2026] run start_cn.sh
start time: Thu Apr 23 13:10:47 UTC 2026, server uptime: 13:10:47 up 1 day, 6:05, 0 user, load average: 0.19, 0.16, 0.06
Run with JEMALLOC_CONF: 'percpu_arena:percpu,oversize_threshold:0,muzzy_decay_ms:5000,dirty_decay_ms:5000,metadata_thp:auto,background_thread:true,prof:true,prof_active:false'
/opt/starrocks/cn_entrypoint.sh: line 165: 27 Segmentation fault (core dumped) $STARROCKS_HOME/bin/start_cn.sh $addition_argsRocky
04/23/2026, 1:12 PMCompute node already exists in your logs is actually *harmless*—it just means the entrypoint script tried to register the node with the FE, but the FE already had it in its list from the previous version. You can ignore that part.
The real problem is the Segmentation fault (core dumped). This is typically caused by one of two things in version 4.1.0:
1. Known Bug: Static Initialization Order (#71731)
There is a confirmed bug in the initial 4.1.0 release where the process crashes during "static initialization" (before the main code even starts). This is caused by a conflict in how hash functions are initialized.
* Symptoms: The crash happens immediately after start_cn.sh with almost no logs in <http://cn.INFO|cn.INFO>.
* Solution: This was fixed very recently (Issue #71825). Check if there is a newer patch image available (e.g., 4.1.1 or a newer build of the 4.1.0 tag). If you are using the official starrocks/cn-ubuntu:4.1.0 image, try pulling the latest version of that tag or move to 4.1.1 if it has been released.
2. AVX2 Instruction Set Requirement
StarRocks 4.1.0 (and versions 3.0+) relies heavily on AVX2 instructions for its vectorized engine. If your Kubernetes nodes are running on older hardware or virtual machines that do not "pass through" AVX2 instructions, the binary will segfault immediately.
* How to check: Run this command on the Kubernetes worker node where the CN is failing:
bash
cat /proc/cpuinfo | grep avx2
If this returns nothing, your CPU is incompatible with the default StarRocks 4.1.0 binary.
* Workaround: You would need to move the CN pods to nodes that support AVX2 or use a non-AVX2 (compatible) build if available (though these are rare for the latest versions).
3. Java Version Requirement
Starting with version 3.5 and continuing into 4.1.x, StarRocks requires JDK 17. If you have customized your Helm chart to use a custom base image or a specific JAVA_HOME, ensure it is pointing to JDK 17. The official StarRocks 4.1.0 images already come with JDK 17 pre-installed.
Recommended Next Steps:
1. Check for an updated image: Use the latest patch version (e.g., 4.1.1) to resolve the initialization bug.
2. Verify AVX2: Ensure your underlying hardware supports AVX2.
3. Check for `cn.WARNING`: If the pod stays up long enough, check /opt/starrocks/be/log/cn.WARNING inside the container for more specific details, though a segfault usually leaves the logs empty.
Summary of your Log Analysis:
* `ERROR 1064`: Ignore this. It's a standard message during upgrades.
* `Segmentation fault`: Critical. This is likely the Static Init Bug or Missing AVX2.
References
• deployment/upgrade.md
• deployment/downgrade.md
• release_notes/release-4.0.md
• faq/Others.md
• deployment/deploy_manually.mdRumit Jain
04/23/2026, 1:21 PMRocky
04/23/2026, 1:22 PMSegmentation fault immediately upon startup.
* The Problem: A conflict in the "C++ static initialization order" for hash functions. This crash happens before the main process even starts, which is why your logs show start_cn.sh and then an immediate Segmentation fault (core dumped).
* Graviton Context: While technically architecture-independent, this bug has been most consistently reported on ARM64/aarch64 environments like Graviton.
2. How to Fix It
This issue was fixed in PR #71825. To resolve this, you need to use a version where this patch is included:
* Option A: Move to 4.1.1 (Recommended): If StarRocks 4.1.1 has been released, it includes the fix for this startup crash.
* Option B: Use a Patched 4.1.0 Image: Pull the latest version of the 4.1.0 image tag. If you are using a local registry, re-pull starrocks/cn-ubuntu:4.1.0 (or starrocks/be-ubuntu:4.1.0) to ensure you have the build that includes the fix.
3. Check for Architecture-Specific Images
Ensure you are pulling the correct architecture. While modern StarRocks Docker images are typically multi-arch (meaning docker pull will automatically get the ARM64 version on Graviton), sometimes Helm charts or manual configurations might hardcode an x86 image.
* Verify Image Arch: Run docker inspect <image_id> on one of your worker nodes to confirm the Architecture field is arm64.
* AVX2 vs. NEON: On x86, StarRocks uses AVX2. On Graviton (ARM), it uses NEON instructions. If an x86-only binary is accidentally deployed to an ARM node, it will result in an immediate SIGSEGV.
4. Summary of Your logs
* `ERROR 1064`: This is benign. It's just the node trying to re-register with the FE during the rolling upgrade.
* `Segmentation fault`: This is the bug (#71731) mentioned above.
Next Step for you:
1. Update your values.yaml to use version 4.1.1 (or the latest patched build of 4.1.0).
2. Ensure you have also upgraded your operator to 1.11.4 as discussed previously, as it contains better logic for managing these 4.1.x lifecycle events.
yaml
# Example in your values.yaml
cn:
image:
repository: starrocks/cn-ubuntu
tag: 4.1.1 # Ensure this version or a recent patch buildRumit Jain
05/19/2026, 2:55 AMRocky
05/19/2026, 2:56 AMsql
-- Run these in your MySQL client
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_scheduling_tablets" = "0");
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_balancing_tablets" = "0");
ADMIN SET FRONTEND CONFIG ("disable_balance" = "true");
ADMIN SET FRONTEND CONFIG ("disable_colocate_balance" = "true");
* Verify Health: Check that all BEs are Alive and UnhealthyTablet count is 0:
sql
SHOW BACKENDS;
SHOW PROC '/statistic';
2. Configure Pod Disruption Budgets (PDB)
If you haven't already, define PDBs. This tells Kubernetes (and AWS EKS) how many pods must remain available during the kubectl drain process that happens during an AMI upgrade.
* For FE (3 replicas): Set minAvailable: 2.
* For BE (e.g., 3+ replicas): Set maxUnavailable: 1.
This ensures that the rolling AMI update won't take down more than one zone or node at a time.
3. Leverage "Graceful Exit" (v3.3+)
StarRocks 4.1.x natively supports Graceful Exit. When AWS drains a node, it sends a SIGTERM to the pods.
* BE/CN Behavior: Upon receiving the signal, the node stops accepting new query fragments but waits for existing ones to finish (default 20s) before shutting down.
* FE Behavior: The FE will signal the Load Balancer (via /api/health returning 500) to stop routing traffic to it before it stops.
* Operator: Your StarRocks Operator (v1.11.4) is designed to coordinate these pod lifecycles during node evictions.
4. Execute the AMI Upgrade
Update your EKS Node Group (via AWS Console, Terraform, or eksctl) with the new AMI ID.
* Rolling Update Strategy: AWS will start new Graviton instances with the new AMI and then "Drain" the old ones.
* Sequence: The drain command will move StarRocks pods one-by-one to the new nodes.
* CN nodes (Shared-data) will move quickly as they are mostly stateless.
* BE nodes (Shared-nothing) will detach their EBS volumes and reattach them on the new nodes.
* FE nodes will trigger a leader election if the Leader pod is moved.
5. Specific Graviton Caution
As discussed previously, ensure your StarRocks image is the patched 4.1.0 or 4.1.1 build.
* Because Graviton uses the ARM64 architecture, a node with a new AMI might trigger a fresh pull of the image.
* If you use the buggy initial 4.1.0 image, the pods will CrashLoopBackOff with a Segmentation fault on the new nodes, stalling your AMI upgrade. Test a single pod restart with your current image before starting the full AMI roll.
6. Post-Upgrade
Once all nodes in all zones are on the new AMI and all pods are `Running`:
1. Check Status: SHOW BACKENDS; and SHOW FRONTENDS;
2. Re-enable Balancing:
sql
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_scheduling_tablets" = "10000");
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_balancing_tablets" = "500");
ADMIN SET FRONTEND CONFIG ("disable_balance" = "false");
ADMIN SET FRONTEND CONFIG ("disable_colocate_balance" = "false");
Summary of Recommendations:
1. Upgrade Operator to 1.11.4 first.
2. Use StarRocks 4.1.1 (to avoid the Graviton Segfault bug).
3. Use PDBs to control the EKS draining speed.
4. Disable balancing during the window to keep the cluster stable.
ReferencesRocky
05/19/2026, 2:56 AMRocky
05/19/2026, 2:58 AMminAvailable: 2. This ensures you always have a quorum for the Leader election.
* For CN: Set maxUnavailable: 1 (or a percentage like 25%) to maintain query capacity.
2. Verify "Graceful Exit" Configuration
StarRocks CNs support graceful shutdown. When AWS drains a node, it sends a SIGTERM to the CN pod.
* The CN will stop accepting new query fragments and wait for current fragments to finish (default is 20s).
* In your cn.conf, you can check graceful_shutdown_timeout_second if you have very long-running queries, but the default is usually sufficient.
3. Rolling AMI Update Strategy
Use the "One Zone at a Time" or "Rolling Update" strategy in your AWS EKS Node Group:
1. Update the AMI ID in your Launch Template or Node Group configuration.
2. Trigger the update: AWS will start a new Graviton instance with the new AMI.
3. The Drain: Once the new node is Ready, AWS will cordon and drain an old node.
4. Pod Migration:
* CN Pods: Will shut down gracefully, then be rescheduled onto the new Graviton nodes. They will automatically reconnect to the FE and start processing queries immediately.
* FE Pods: If an FE Leader pod is drained, a new Leader will be elected among the remaining FEs. The moved FE will pull the latest image metadata from the Leader once it restarts on a new node.
4. Shared-Data Advantage (No Balancing Needed)
Because you are using CNs in Shared-data mode, the data resides in S3.
* Do NOT worry about disable_balance or tablet_sched configs. These only apply to "Shared-nothing" BE clusters.
* In your architecture, the FE simply sees a CN leave and a new one join. It will automatically reassign query fragments to the available CNs.
Special Considerations for Graviton
* Instance Warm-up: Graviton instances are fast, but the StarRocks process (especially FE) can take a minute to reload metadata into memory. If you have a large amount of metadata, stagger the FE updates so one FE is fully "Ready" (passing its health check) before the next one is drained.
* Architecture Check: Ensure your EKS Node Group is specifically restricted to arm64 to prevent K8s from accidentally trying to schedule your Graviton-optimized pods onto an x86 node (if you have a mixed cluster).
Summary Checklist
1. Check Health: SHOW FRONTENDS; and SHOW COMPUTE NODES; (Ensure all Alive is true).
2. Apply PDBs in Kubernetes.
3. Update AMI via AWS EKS Console/Terraform.
4. Monitor FE logs (fe.log) during the leader handover to ensure metadata is loading correctly on the new instances.
References
• administration/management/graceful_exit.md
• deployment/plan_cluster.md
• deployment/sr_operator.md
• deployment/upgrade.md
References
• deployment/plan_cluster.md
• faq/Deploy_faq.mdRocky
05/19/2026, 2:58 AMRumit Jain
05/20/2026, 4:06 AMRocky
05/20/2026, 4:06 AMreplicas count in your StarRocks Cluster (SRC) resource. The Operator will then automatically handle the deployment and registration of the new FE nodes.
Using kubectl:
bash
kubectl -n <namespace> patch starrockscluster <cluster-name> --type='merge' -p '{"spec":{"starRocksFeSpec":{"replicas":5}}}'
What the Operator does:
1. It updates the underlying StatefulSet for the FE.
2. Kubernetes notices the replica increase and creates two new Pods (fe-3 and fe-4).
3. EKS/AWS provisions two new, empty EBS volumes (via PVCs) and attaches them to these new pods.
4. The Operator automatically executes the ALTER SYSTEM ADD FOLLOWER command on the Leader to register these new nodes.
──────────
2. How Data "Syncs" to New EBS Volumes
It is important to understand that StarRocks does not sync data at the EBS/block level. It syncs data at the application level over the network.
The Synchronization Process:
1. Fresh Start: The new FE pods start with a completely empty directory on their new EBS volumes.
2. Helper Mechanism: When a new FE starts for the first time, it uses an existing FE (the Leader) as a "helper."
3. Image Transfer: The new FE downloads the latest metadata image (a snapshot of the entire cluster state) from the Leader over the network.
4. Journal Replay: After the image is loaded into memory and saved to the new EBS volume, the new FE pulls and replays the edit logs (journal) to catch up with any changes that occurred since the image was taken.
5. Steady State: Once caught up, the new FE participates in the Raft consensus to keep its local EBS volume in sync with the rest of the cluster.
──────────
3. Key Considerations for scaling to 5
* Followers vs. Observers:
* By default, the Operator scales FE nodes as Followers. Having 5 Followers is a valid High Availability (HA) configuration (it allows for a failure of 2 nodes while maintaining a quorum of 3).
* If you only need more query capacity and don't want to increase the overhead of the Raft voting process, you might consider Observers. However, the standard Operator workflow usually scales Followers.
* Persistent Storage: Ensure your storageSpec in the starRocksFeSpec is configured with a StorageClass (like gp3) so that the two new EBS volumes are automatically provisioned.
* Network Bandwidth: During the initial sync, the new FEs will pull the metadata image. If your metadata is very large (many millions of tablets/metadata objects), this may consume significant internal network bandwidth briefly.
Summary Checklist
1. Update replicas: 5 in your YAML or via kubectl patch.
2. Monitor the new pods: kubectl get pods -l "<http://starrockscluster.starrocks.com/component=fe|starrockscluster.starrocks.com/component=fe>".
3. Verify the new nodes joined: Run SHOW PROC '/frontends'; in your MySQL client. All 5 should eventually show Alive: true and Join: true.
References
• faq/operation_maintenance_faq.md
• deployment/deploy_manually.md
• deployment/plan_cluster.md
• administration/Meta_recovery.mdRumit Jain
05/20/2026, 4:31 AMRocky
05/20/2026, 4:31 AMimage.<journal_id>. This is the "Image Snapshot."
2. How the "Sync" Works for New Pods
When you scale from 3 to 5 FEs, the two new pods start with empty EBS volumes. The synchronization follows this flow:
1. Helper Assignment: The StarRocks Operator starts the new FE pod with a --helper flag pointing to the current Leader FE.
2. Network Download: The new FE connects to the Leader's edit_log_port (default 9010) or via HTTP. It requests the latest Image File.
3. File Transfer: The Leader sends the Image File over the network to the new FE. The new FE writes this file directly onto its new EBS volume in the meta/image directory.
4. Log Replay: After downloading the image, the new FE pulls any "Edit Logs" that were created after the image was taken. It replays these logs in memory to catch up to the current state.
5. Steady State: Once caught up, the new FE joins the Raft group and receives new metadata updates in real-time.
3. The Role of the EBS CSI Driver vs. StarRocks
Feature | EBS CSI Driver (Infrastructure) | StarRocks Image (Application)
Responsibility | Creating the volume and mounting it to /opt/starrocks/fe/meta. | Defining what goes inside that directory.
Syncing Data | Only handles block-level snapshots if you manually trigger them (backups). It does not copy data between volumes. | Handles the transfer of metadata files from node A to node B via TCP/IP.
New Nodes | Provisions a fresh, empty 10GB/20GB volume. | Detects the empty volume and triggers the "Helper" sync to fill it.
4. Why this matters for your 4.0.1 FE+CN setup
Since you are in Shared-data mode:
* CN nodes don't use this mechanism because they don't store metadata; they just cache data from S3.
* FE nodes must keep this metadata local (on EBS) for performance. If an EBS volume is lost, the FE pod will simply repeat the "Image Snapshot" download from a surviving FE when it restarts on a new volume.
Summary
The EBS CSI driver provides the "hard drive," but StarRocks provides the "data cable" that copies the metadata image from the Leader to the new Followers. You do not need to configure any CSI snapshot or cloning features to scale your FEs; it is handled automatically by the StarRocks process.
References
• administration/Meta_recovery.md
• sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md
• administration/cluster_snapshot.md
• deployment/deploy_manually.md
• administration/management/FE_configuration.md
• quick_start/helm.mdRumit Jain
05/20/2026, 4:53 AMRocky
05/20/2026, 4:53 AMRumit Jain
05/29/2026, 2:33 AMRocky
05/29/2026, 2:34 AMSHOW FRONTENDS.
How to fix it
You must manually remove the decommissioned FE nodes from the cluster using SQL.
1. Identify the nodes:
Run this command in your MySQL client:
sql
SHOW PROC '/frontends';
Look for the rows corresponding to pods 4 and 5. Note their IP address (or FQDN) and their EditLogPort (usually 9010). Also, check their Role (usually FOLLOWER).
2. Drop the nodes:
Execute the following commands (replace the IP and port with your actual values):
sql
-- If they were Followers:
ALTER SYSTEM DROP FOLLOWER "10.x.x.x:9010";
ALTER SYSTEM DROP FOLLOWER "10.y.y.y:9010";
-- If they were Observers:
ALTER SYSTEM DROP OBSERVER "10.x.x.x:9010";
Why this is necessary
* Quorum Safety: For Followers, the Raft protocol requires a majority of nodes to be healthy to commit metadata changes. If you had 5 Followers and 2 "died" (downscaled), the cluster still thinks it needs 3 out of 5 for a quorum. If you were to lose one more node, the cluster would lose its Leader. Removing them formally updates the "total nodes" count to 3, meaning only 2 nodes are needed for a quorum.
* StarRocks Operator Logic: While the Operator handles the infrastructure (Pods/PVCs), the application state (Raft membership) is often left to the user or a specific decommissioning process to ensure no accidental data or availability loss occurs during the shift.
Summary Checklist
1. Patch the StarRocksCluster resource to replicas: 3.
2. Wait for Kubernetes to terminate the pods.
3. Run SHOW PROC '/frontends';.
4. Run ALTER SYSTEM DROP FOLLOWER "..." for each stale node.
References
• sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md
• deployment/sr_operator.md
• deployment/deploy_manually.md
• administration/Meta_recovery.md
• faq/Deploy_faq.md
• administration/management/FE_configuration.md
• quick_start/helm.md
References
• sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md
• administration/Meta_recovery.md
• deployment/deploy_manually.mdRumit Jain
06/02/2026, 1:48 AMpodAnnotations:
<http://sidecar.istio.io/inject|sidecar.istio.io/inject>: "true"
<http://traffic.sidecar.istio.io/excludeInboundPorts|traffic.sidecar.istio.io/excludeInboundPorts>: "9010,9020,9030,9050,9060,8060,8167,6090,9070,8030"
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "9010,9020,9030,9050,9060,8060,8167,6090,9070,8030"
What each port here refers to?Rocky
06/02/2026, 1:49 AMedit_log_port (FE) – Internal metadata synchronization via Raft/BDBJE.
* 9020: rpc_port (FE) – Thrift RPC server for internal FE-to-FE and FE-to-BE communication.
* 9030: query_port (FE) – The MySQL protocol port for client connections.
* 9050: heartbeat_service_port (BE/CN) – Receives heartbeat signals from the FE.
* 9060: be_port (BE/CN) – Thrift server on BEs used for task execution.
* 8060: brpc_port (BE/CN) – bRPC used for high-speed data transfer between nodes during queries.
* 8167: starlet_port (CN/BE) – An agent service port often used in cloud-native/shared-data deployments.
* 6090: cloud_native_meta_port (FE) – RPC port for cloud-native metadata services.
* 9070: starlet_port (BE/CN) – The default agent service port (similar to 8167).
* 8030: http_port (FE) – FE Web UI and REST APIs (used for curl commands and the operator).
Missing Ports to Exclude
You are missing 8040, which is the BE/CN HTTP server port (be_http_port). This port is used for Stream Load data transfers and health checks. It is highly recommended to add it to your exclusion list.
Updated Recommendation:
yaml
<http://traffic.sidecar.istio.io/excludeInboundPorts|traffic.sidecar.istio.io/excludeInboundPorts>: "9010,9020,9030,9050,9060,8060,8167,6090,9070,8030,8040"
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "9010,9020,9030,9050,9060,8060,8167,6090,9070,8030,8040"
Why exclude these?
StarRocks relies on low-latency, high-throughput communication. If these ports are intercepted by Istio:
1. Performance: The overhead of the Envoy sidecar can significantly slow down data shuffling (port 8060).
2. Authz Issues: Istio Authorization Policies might block internal heartbeats (port 9050) or metadata logs (port 9010), causing nodes to be marked as "Dead" in SHOW FRONTENDS or SHOW BACKENDS.
3. Protocol Conflicts: StarRocks uses custom RPC protocols that are not always standard HTTP/TCP, which can confuse the Envoy proxy if not explicitly bypassed.
References
• deployment/environment_configurations.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
References
• deployment/environment_configurations.md
• quick_start/helm.md
• unloading/Spark_connector.md
• deployment/sr_operator.mdRumit Jain
06/02/2026, 1:52 AMRocky
06/02/2026, 1:52 AMexcludeInboundPorts and excludeOutboundPorts annotations, you can use a mix of SQL commands, terminal tools (curl, mysql), and Istio debugging tools.
1. Test Client-Facing Ports (MySQL & HTTP)
These ports are the easiest to test because you can trigger them directly.
* MySQL Port (9030):
Try connecting from a pod inside the cluster (or via a jumpbox):
bash
mysql -h <FE_SERVICE_IP> -P 9030 -u root
If it times out or returns "Access Denied" (and you're sure your credentials are right), Istio might be intercepting or blocking the TCP flow.
* FE HTTP Port (8030) & BE HTTP Port (8040):
Run a health check or bootstrap API call:
bash
# FE Health Check
curl -I http://<FE_POD_IP>:8030/api/bootstrap
# BE Health Check
curl -I http://<BE_POD_IP>:8040/api/health
Look for HTTP/1.1 200 OK. If you get a 403 Forbidden, Istio Authz is blocking the request.
──────────
2. Test Internal Control-Plane Ports (9010, 9020, 9050, 9060)
These ports are used for node coordination. If they are blocked, the cluster will appear "unhealthy" in metadata.
* Heartbeat (9050) & BE Thrift (9060):
Log into MySQL and run:
sql
SHOW BACKENDS\G
SHOW COMPUTE NODES\G
* Check: Look at the Alive column. If it says false, the FE cannot reach the BE/CN on port 9050 or 9060.
* Edit Log/Raft (9010) & FE RPC (9020):
sql
SHOW FRONTENDS\G
* Check: If Role is FOLLOWER but Alive is false, the FEs cannot synchronize metadata over port 9010.
──────────
3. Test Data-Plane Port (8060 - bRPC)
Port 8060 is used for high-speed data shuffling between nodes during complex queries.
* The "Shuffle" Test:
Run a query that forces data to move between nodes (like a JOIN on large tables or a GROUP BY on a non-distribution column):
sql
SELECT count(*) FROM tableA JOIN tableB ON tableA.id = tableB.id;
* Success: Query returns results quickly.
* Failure: The query hangs or returns an error like RPC map fail or Internal Error: bRPC exchange failed.
──────────
4. Verify via Istio Debugging Tools
If you suspect a port is blocked, use Istio’s own tools to confirm if the sidecar is intercepting traffic it shouldn't be.
* Check Proxy Configuration:
Ensure the ports are truly "excluded" from the Envoy proxy:
bash
istioctl proxy-config listener <POD_NAME> --port 9030
If the port is successfully excluded, you should see no listener for it, meaning traffic passes through "raw" without Istio intervention.
* Check Envoy Logs for RBAC Denials:
If Istio Authz is blocking traffic, it will show up in the istio-proxy container logs:
bash
kubectl logs <POD_NAME> -c istio-proxy | grep "rbac_any_denied_allowed"
If you see entries with 403 or RBAC: access denied, your AuthorizationPolicy is too restrictive and is catching StarRocks internal traffic.
Summary of Port Mappings
Port | Name | Type | Test Method
9010 | edit_log_port | FE-FE | SHOW FRONTENDS (Check Alive)
9020 | rpc_port | FE-FE/BE | SHOW FRONTENDS (Check Alive)
9030 | query_port | Client-FE | mysql client connection
9050 | heartbeat_port | FE-BE | SHOW BACKENDS (Check Alive)
9060 | be_port | FE-BE | Run a simple SELECT 1
8060 | brpc_port | BE-BE | Run a JOIN or GROUP BY query
8030/8040 | http_port | External | curl health check APIs
References
• deployment/environment_configurations.md
• administration/management/FE_configuration.mdRocky
06/02/2026, 1:52 AMRumit Jain
06/02/2026, 1:56 AMRocky
06/02/2026, 1:57 AM503 Service Unavailable response with the header server: envoy confirms that Envoy is still intercepting the traffic on port 8030, despite your exclusion annotations.
Since you are calling the service name (kube-starrocks-fe-service), the "503" is likely coming from the client-side sidecar (the pod where you ran the curl command) rather than the FE pod itself.
Here is how to troubleshoot and fix this:
1. Verify if the Exclusion is working on the Pod
Try to bypass the Kubernetes Service and the client-side proxy by calling the FE Pod IP directly from the same node or a non-Istio pod:
bash
# Get the FE Pod IP
kubectl get pods -l <http://starrocks.com/fe|starrocks.com/fe> -o wide
# Curl the Pod IP directly
curl -I http://<FE_POD_IP>:8030/api/bootstrap
* If it works (and server: envoy is gone): The inbound exclusion on the FE pod is working. The issue is your client-side sidecar trying to "mesh" a port that is no longer meshed on the destination.
* If it still says `server: envoy`: The FE pod has not correctly picked up the excludeInboundPorts annotation. Ensure you restarted the FE pods after applying the change.
2. The "mTLS Mismatch" Problem
If you have a global Istio policy requiring STRICT mTLS, but you have excluded port 8030 on the FE pod, the FE is now expecting plain TCP on that port. However, any client inside the mesh calling the service name will still try to use mTLS, which causes Envoy to throw a 503 because the handshake fails.
The Fix: Create a DestinationRule to explicitly disable TLS for StarRocks internal ports:
yaml
apiVersion: <http://networking.istio.io/v1alpha3|networking.istio.io/v1alpha3>
kind: DestinationRule
metadata:
name: starrocks-fe-disable-mtls
spec:
host: "kube-starrocks-fe-service.default.svc.cluster.local" # Adjust namespace
trafficPolicy:
portLevelSettings:
- port:
number: 8030
tls:
mode: DISABLE
- port:
number: 9030
tls:
mode: DISABLE
3. Verify Envoy Listeners
Run this command to see if Envoy is still listening on port 8030 on your FE pod:
bash
istioctl proxy-config listeners <FE_POD_NAME> --port 8030
* Expected result: If the port is successfully excluded, this command should return no output for port 8030.
* If it shows a listener: The annotation was not applied correctly. Check for typos (e.g., Ensure there are no spaces in the comma-separated list: "9010,9020,8030").
4. Check FE Health
Ensure the FE process is actually healthy and listening. Log into the FE pod and run:
bash
netstat -tuln | grep 8030
If the process isn't listening, the 503 is simply Envoy reporting that the "upstream" (the FE application) is down.
References
• deployment/environment_configurations.md
• administration/management/FE_configuration.md
• deployment/sr_operator.md
• quick_start/helm.md
• administration/management/BE_configuration.md
• faq/Deploy_faq.md
• administration/management/Logging.mdRumit Jain
06/02/2026, 2:03 AMRocky
06/02/2026, 2:03 AM\r\n), but it received a Line Feed (\n) without the preceding Carriage Return.
In the context of Istio, this usually happens because:
1. Envoy Interception: Even though you added exclusion annotations, the traffic might still be passing through an Envoy proxy (either on the client side or the server side) that is "normalizing" the HTTP request in a way that the StarRocks FE rejects.
2. Strict Validation: Newer versions of StarRocks (v3.2+) use a Netty version that is more sensitive to these RFC violations.
How to Fix
1. Disable Strict Header Validation (Recommended)
StarRocks added a specific configuration parameter to handle this exact scenario, especially for users behind proxies like Envoy or certain Load Balancers.
Add this to your FE configuration (fe.conf or via the StarRocksCluster CRD):
properties
enable_http_validate_headers = false
Note: This requires an FE restart to take effect.
2. Verify Exclusion is actually working
If you see server: envoy in the curl response and then this error in the FE logs, it means Envoy is still participating in the connection.
* On the FE Pod: Run istioctl proxy-config listeners <FE_POD_NAME> --port 8030. If it returns a listener, the exclusion annotation didn't work. Check for typos in your podAnnotations.
* On the Client Pod: If you are calling from another pod in the mesh, the client-side sidecar is likely intercepting the request because you are using the Service name.
3. Update your DestinationRule
To prevent Envoy from trying to "interpret" or "secure" the HTTP traffic (which can lead to these formatting issues), tell Istio to treat these ports as plain TCP and skip TLS:
yaml
apiVersion: <http://networking.istio.io/v1alpha3|networking.istio.io/v1alpha3>
kind: DestinationRule
metadata:
name: starrocks-fe-bypass
spec:
host: "kube-starrocks-fe-service.default.svc.cluster.local"
trafficPolicy:
portLevelSettings:
- port:
number: 8030
tls:
mode: DISABLE # Turns off mTLS for this port
Why does this happen?
Standard HTTP/1.1 requires \r\n. Many modern tools and proxies (including Envoy) try to be helpful by correcting or simplifying headers. However, if StarRocks' internal parser is set to validateHeaders=true, it will reject any request that doesn't exactly match the specification. By setting enable_http_validate_headers = false, you tell StarRocks to be more "forgiving" of these minor formatting differences.
References
• administration/management/FE_configuration.md
• sql-reference/http_sql_api.md
• deployment/environment_configurations.md
• deployment/sr_operator.md
References
• administration/management/FE_configuration.md
• sql-reference/http_sql_api.md
• deployment/environment_configurations.md
• deployment/sr_operator.md
• quick_start/helm.md
• administration/management/Logging.md
References
• sql-reference/http_sql_api.md
• administration/management/FE_configuration.mdRumit Jain
06/02/2026, 3:08 AMRocky
06/02/2026, 3:09 AM/metrics endpoint is returning multiple lines with the exact same metric name and label set, but different values.
This is a known issue that can occur with StarRocks FE nodes in two specific scenarios:
1. Known StarRocks FE Bug (v3.2.x / v3.3.x)
There is a documented issue (e.g., GitHub #59201) where the StarRocks FE /metrics endpoint emits duplicate samples for certain metrics, particularly those related to transaction counts or tablet metadata.
* The Cause: Some internal metric collectors in the FE do not correctly deduplicate labels when multiple threads report status, or when the is_leader label is inconsistently applied.
* The Fix:
* Upgrade: This is typically fixed in newer patch releases (v3.2.17+, v3.3.x).
* Config Workaround: You can try to minimize the metric set by ensuring you are not requesting "detailed" metrics unnecessarily. Ensure you haven't enabled with_table_metrics=all in your Prometheus scrape config unless required.
2. Istio Metric Merging Conflict
Since you just enabled Istio, it is highly likely that Istio Metric Merging is causing the conflict.
By default, Istio sidecars can "merge" the application's metrics (from port 8030) with the sidecar's own Envoy metrics. If both StarRocks and Envoy report a metric with the same name (like http_requests_total) but different labels or values, Prometheus will reject them.
To verify this:
Run a curl against the pod IP and check for duplicate lines:
bash
curl -s http://<FE_POD_IP>:8030/metrics | sort | uniq -d
If this returns lines, StarRocks is sending duplicates. If it doesn't, but Prometheus still complains, the "merging" at the proxy level is likely the culprit.
The Fix (Istio side):
Disable Istio's metric merging for the StarRocks pods so that Prometheus scrapes the FE and the sidecar separately (or scrapes only the FE). Add this annotation to your StarRocks FE/BE pods:
yaml
metadata:
annotations:
<http://prometheus.io/scrape|prometheus.io/scrape>: "true"
<http://prometheus.io/port|prometheus.io/port>: "8030"
<http://prometheus.io/path|prometheus.io/path>: "/metrics"
# Disable Istio merging to prevent duplicate ingestion errors
<http://proxy.istio.io/config|proxy.istio.io/config>: '{ "holdApplicationUntilProxyReceivesConfig": true }'
<http://sidecar.istio.io/rewriteAppHTTPProbers|sidecar.istio.io/rewriteAppHTTPProbers>: "false"
3. ServiceMonitor Label Conflict
If your ServiceMonitor uses honor_labels: true, it will keep the labels StarRocks generates. If StarRocks sends an instance label that conflicts with the one Prometheus assigns to the target, you can get duplicates.
* Check: In your ServiceMonitor, try setting honor_labels: false (or remove it, as false is usually default) to let Prometheus overwrite the labels.
Summary Checklist
1. Check StarRocks Version: If you are on a version around v3.2.16, you likely need a patch upgrade to fix internal metric duplication.
2. Verify Duplicates: Use the curl ... | sort | uniq -d command above to confirm if the FE is the one generating the duplicates.
3. Adjust Scrape Params: Ensure your Prometheus job isn't scraping the same pod twice (e.g., once via kubernetes-pods and once via ServiceMonitor).
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/metrics.md
• release_notes/release-3.2.md
• administration/management/FE_configuration.md
References
• administration/management/monitoring/Monitor_and_Alert.mdRocky
06/02/2026, 3:09 AMRumit Jain
06/02/2026, 3:20 AMstarrocksFESpec:
replicas: 3
image:
repository: <http://111111111.dkr.ecr.us-east-1.amazonaws.com/tracelink/starrocks/fe-ubuntu|111111111.dkr.ecr.us-east-1.amazonaws.com/tracelink/starrocks/fe-ubuntu>
tag: "4.0.1"
imagePullPolicy: IfNotPresent
entrypoint: {}
annotations:
<http://sidecar.istio.io/inject|sidecar.istio.io/inject>: "true"
<http://traffic.sidecar.istio.io/excludeInboundPorts|traffic.sidecar.istio.io/excludeInboundPorts>: "6090,8030,8040,8060,8167,9010,9020,9030,9050,9060,9070"
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "6090,8030,8040,8060,8167,9010,9020,9030,9050,9060,9070"
runAsNonRoot: true
readOnlyRootFilesystem: false
capabilities:
drop:
- ALL
sysctls: []
service:
type: "ClusterIP"
loadbalancerIP: ""
annotations: {}
labels: {}
ports:
- name: query
port: 9030
- name: http
port: 8030
loadBalancerSourceRanges: []
imagePullSecrets: []
serviceAccount: ""
nodeSelector: {}
podLabels: {}
hostAliases: []
schedulerName: ""
feEnvVars:
- name: LOG_CONSOLE
value: "1"
affinity: {}
tolerations: []
topologySpreadConstraints:
- maxSkew: 1
topologyKey: <http://topology.kubernetes.io/zone|topology.kubernetes.io/zone>
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
<http://app.kubernetes.io/component|app.kubernetes.io/component>: fe
minDomains: 3
resources:
requests:
cpu: 4
memory: 4Gi
limits:
cpu: 8
memory: 8Gi
storageSpec:
name: "fe"
storageClassName: ""
storageSize: 10Gi
storageMountPath: "/opt/starrocks/fe/meta"
logStorageClassName: ""
logStorageSize: 10Gi
logMountPath: "/opt/starrocks/fe/log"
emptyDirs: []
hostPaths: []
persistentVolumeClaimRetentionPolicy:
config: |
LOG_DIR = ${STARROCKS_HOME}/log
DATE = "$(date +%Y%m%d-%H%M%S)"
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx8192m -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
min_graceful_exit_time_second = 25
configyaml: {}
secrets:
- name: sr-admin-user-password
mountPath: /etc/starrocks/secrets/sr-admin-user-password
- name: sr-dml-user-password
mountPath: /etc/starrocks/secrets/sr-dml-user-password
- name: sr-readonly-user-password
mountPath: /etc/starrocks/secrets/sr-readonly-user-password
configMaps: []
terminationGracePeriodSeconds: 120
startupProbeFailureSeconds:
livenessProbeFailureSeconds:
readinessProbeFailureSeconds:
minReadySeconds: 0
podManagementPolicy: Parallel
lifecycle: {}
sidecars: []
sidecarsMap: {}
initContainers: [] maxUnavailablePods:
shareProcessNamespace:Rocky
06/02/2026, 3:21 AMstarrocksFESpec with the following changes:
1. Fix the "Line Feed must be preceded by Carriage Return" Error
Add enable_http_validate_headers = false to your config section. This disables strict RFC validation in the FE's internal web server (Netty), allowing it to accept requests that have been slightly modified by Envoy or other proxies.
2. Address Prometheus Ingestion Errors
The "samples with different value but same timestamp" error is a known issue in some StarRocks FE versions (Issue #59201) where the /metrics endpoint occasionally emits duplicate lines for the same metric/label set.
* Workaround: Set honor_labels: true in your Prometheus ServiceMonitor to ensure Prometheus respects the labels coming from StarRocks rather than trying to overwrite them.
* Istio Tweak: Since you are using Istio, add <http://sidecar.istio.io/rewriteAppHTTPProbers|sidecar.istio.io/rewriteAppHTTPProbers>: "false" to your annotations to prevent Istio from interfering with the health check/metrics traffic formatting.
Recommended starrocksFESpec Update
yaml
starrocksFESpec:
# ... existing fields ...
annotations:
<http://sidecar.istio.io/inject|sidecar.istio.io/inject>: "true"
# Port exclusion looks correct for the FE Pod
<http://traffic.sidecar.istio.io/excludeInboundPorts|traffic.sidecar.istio.io/excludeInboundPorts>: "6090,8030,8040,8060,8167,9010,9020,9030,9050,9060,9070"
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "6090,8030,8040,8060,8167,9010,9020,9030,9050,9060,9070"
# ADD THESE:
<http://sidecar.istio.io/rewriteAppHTTPProbers|sidecar.istio.io/rewriteAppHTTPProbers>: "false"
<http://prometheus.io/scrape|prometheus.io/scrape>: "true"
<http://prometheus.io/port|prometheus.io/port>: "8030"
config: |
LOG_DIR = ${STARROCKS_HOME}/log
DATE = "$(date +%Y%m%d-%H%M%S)"
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx8192m -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
min_graceful_exit_time_second = 25
# ADD THIS:
enable_http_validate_headers = false
Why you still see server: envoy
The 503 error you received with server: envoy despite the excludeInboundPorts annotation likely means the outbound proxy of the pod you are running curl from is intercepting the request to the kube-starrocks-fe-service.
To completely bypass Envoy for StarRocks internal traffic, you should also apply an Istio DestinationRule to the cluster to disable TLS for these specific ports:
yaml
apiVersion: <http://networking.istio.io/v1alpha3|networking.istio.io/v1alpha3>
kind: DestinationRule
metadata:
name: starrocks-fe-bypass
spec:
host: "kube-starrocks-fe-service.YOUR_NAMESPACE.svc.cluster.local"
trafficPolicy:
portLevelSettings:
- port: { number: 8030 }
tls: { mode: DISABLE }
- port: { number: 9030 }
tls: { mode: DISABLE }
DISABLE }
```
```
References
• administration/management/monitoring/alert.mdRumit Jain
06/02/2026, 10:14 AMRocky
06/02/2026, 10:15 AMappProtocol is not showing up in your FE StatefulSet is that the StarRocks Kubernetes Operator (prior to very recent updates) does not include appProtocol in its custom resource (CRD) schema. When you add it to your YAML, the Operator’s controller doesn't recognize the field and simply strips it out when generating the underlying Kubernetes resources.
To force Istio to treat port 8030 as plain TCP (bypassing the HTTP header validation errors) despite the Operator stripping appProtocol, use one of the following methods:
1. Rename Service Ports (Easiest Fix)
Istio uses a "Name-based Protocol Selection" as a fallback. If the appProtocol is missing, Istio checks if the port name starts with a specific prefix. By renaming your ports to start with tcp-, you force Istio into TCP mode.
Update your starrocksFESpec like this:
yaml
starrocksFESpec:
# ... other config ...
service:
type: "ClusterIP"
ports:
- name: tcp-query # Changed from 'query'
port: 9030
- name: tcp-http # Changed from 'http'
port: 8030
2. Add an Istio DestinationRule (Most Reliable)
Since the Operator is stripping your protocol settings from the Pod/Service level, you can define the protocol behavior at the Mesh level. This tells Istio: "No matter what the service says, treat traffic to these ports as plain TCP."
Apply this manifest to your namespace:
yaml
apiVersion: <http://networking.istio.io/v1alpha3|networking.istio.io/v1alpha3>
kind: DestinationRule
metadata:
name: starrocks-fe-tcp-force
spec:
host: "kube-starrocks-fe-service.YOUR_NAMESPACE.svc.cluster.local"
trafficPolicy:
portLevelSettings:
- port:
number: 8030
tls:
mode: DISABLE # Bypasses Envoy's HTTP/mTLS processing for this port
- port:
number: 9030
tls:
mode: DISABLE
3. Verify the Operator Version
Support for appProtocol was only recently discussed in the StarRocks Operator community (see GitHub Issue #753).
* If you are on an older version of the Operator (e.g., v1.8.x or below), it will ignore appProtocol.
* If you must have appProtocol in the final object, you would need to upgrade the StarRocks Operator to a version that specifically supports this field in the StarRocksCluster CRD.
Summary of what to do now:
1. Keep the enable_http_validate_headers = false in your fe.conf (via the config block).
2. Rename the ports in your Helm chart service spec to start with tcp-.
3. Apply a DestinationRule if you still see 400 or 503 errors from Envoy.
References
• deployment/sr_operator.md
• quick_start/helm.md
• administration/management/FE_configuration.md
References
• deployment/sr_operator.md
• administration/management/FE_configuration.md
• quick_start/helm.md
• deployment/environment_configurations.md
• administration/stargo.md
References
• administration/management/FE_configuration.md
• deployment/environment_configurations.md
• quick_start/helm.md
• deployment/sr_operator.mdRumit Jain
06/02/2026, 10:19 AMRocky
06/02/2026, 10:20 AMappProtocol and port naming:
1. Why appProtocol is missing from the StatefulSet
The StarRocks Operator controls the lifecycle of the StatefulSet. If the version of the Operator you are using doesn't have appProtocol in its CRD (Custom Resource Definition), it will silently strip that field when it generates the StatefulSet.
The Workaround: Use the Port Naming Convention. Istio will automatically treat the traffic as plain TCP if the port name starts with tcp-.
In your fe spec, ensure you have renamed the ports like this:
yaml
# In your Helm Chart / StarRocksCluster Spec
starrocksFESpec:
service:
ports:
- name: tcp-query # Prefix with 'tcp-'
port: 9030
- name: tcp-http # Prefix with 'tcp-'
port: 8030
2. Fixing the Prometheus Duplicate Error
Since the appProtocol change didn't stop the Prometheus warnings, the issue is likely the FE's internal metric generation.
Step A: Verify the Duplicates
Run this command from a pod within the cluster to see exactly which metrics are duplicated:
bash
curl -s <http://10.214.39.136:8030/metrics> | sort | uniq -d
If this returns anything, the FE is sending duplicate data.
Step B: Update FE Config
In your starrocksFESpec.config block, add these parameters to stabilize the HTTP server and metrics:
yaml
config: |
# ... existing config ...
# Disable strict HTTP header validation (Fixes the "Line Feed" error)
enable_http_validate_headers = false
# Minimize the metric set to reduce collision risk
with_table_metrics = false
Step C: Update your ServiceMonitor (Crucial)
If the FE is sending duplicates, you can tell Prometheus to ignore the "same timestamp" conflict by ensuring honor_labels is set correctly. In your ServiceMonitor for the FE:
yaml
spec:
endpoints:
- port: tcp-http
honorLabels: true # Tells Prometheus to keep labels from StarRocks
# Add this if Istio is still interfering with headers:
proxyUrl: <http://localhost:15000/stats/prometheus> # Optional: only if scraping via sidecar
Summary of required Spec changes:
1. Rename ports to tcp-query, tcp-http, and tcp-rpc in the service section of your spec. This bypasses the need for the appProtocol field that the Operator is stripping.
2. Add enable_http_validate_headers = false to the config string.
3. Check your StarRocks Operator version. If you are on an older version, it won't support `appProtocol`; upgrading the Operator is the only way to make that specific field stick in the StatefulSet.
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/alert.mdRumit Jain
06/02/2026, 11:30 AMselect count(*) from quickstart.crashdata;
+----------+
| count(*) |
+----------+
| 423725 |
+----------+
1 row in set (0.02 sec)
Starrocks > show compute nodes\G;
ERROR 1064 (HY000): Internal error processing forward
ERROR:
No query specifiedRocky
06/02/2026, 11:31 AMInternal error processing forward occurs when the FE node you are connected to (a Follower or Observer) attempts to forward an administrative command to the Leader FE, but the internal communication fails.
In StarRocks, commands like SHOW COMPUTE NODES, SHOW BACKENDS, and SHOW FRONTENDS must be executed by the Leader FE. If you connect to a Follower, it acts as a proxy and forwards the request to the Leader via the rpc_port (default 9020).
Potential Causes
1. FE Leader is missing or unstable
If the FE cluster has not elected a Leader, or the Leader is down, the Follower cannot forward the request.
* Check Pod Status: Run kubectl get pods to ensure all 3 FE pods are Running and Ready.
* Check Logs: Look at the fe.warn.log or fe.log on the Follower pod you are connected to. Look for errors containing "forward", "thrift", or "connection refused".
2. Network / Istio Blocking Internal Ports
Even though you have excludeInboundPorts/excludeOutboundPorts in your annotations, Istio's mTLS settings (especially if set to STRICT) can sometimes interfere with internal Thrift/RPC calls between FEs if they are resolving each other via Pod IPs rather than Service names.
* Verification: Try to curl or telnet from one FE pod to the Leader FE pod on port 9020 and 9010.
* Solution: Ensure the ports 9010 (edit log) and 9020 (RPC) are truly bypassed by the mesh. You may need an Istio PeerAuthentication policy set to PERMISSIVE for the StarRocks namespace to allow plain-text internal traffic if the exclusion is failing.
3. Missing priority_networks
In Kubernetes, pods often have multiple network interfaces or IP ranges. If FEs advertise the wrong IP to each other, the forwarding mechanism will try to connect to an unreachable address.
* Fix: Add priority_networks to your config block to tell StarRocks which CIDR range to use for internal communication (usually the Pod CIDR).
yaml
config: |
# Example for a typical K8s pod network
priority_networks = 10.0.0.0/8
4. Clock Skew
StarRocks FEs use BDB JE for metadata replication, which is extremely sensitive to time. If the clocks on your 3 FE nodes differ by more than 5 seconds, the Leader election will fail or become unstable, leading to forwarding errors.
* Fix: Ensure all Kubernetes nodes are running ntp or chronyd.
How to Debug
1. Find the Leader: Check the logs of all three FE pods. One should have a message like transfer to LEADER.
2. Connect directly: Try connecting your MySQL client directly to the Pod IP of the Leader FE instead of the LoadBalancer/Service. If show compute nodes works there, the issue is strictly the FE-to-FE forwarding.
3. Check FE Status: If you can run SHOW FRONTENDS;, check the IsMaster column to confirm which node is the Leader and if the Followers are successfully joined.
References
• administration/management/FE_configuration.md
• deployment/environment_configurations.md
• faq/operation_maintenance_faq.md
References
• administration/management/FE_configuration.md
• faq/Deploy_faq.mdRumit Jain
06/02/2026, 11:36 AMexcludeInboundPorts/excludeOutboundPorts from the annotatons now. And added appProtocol: TCP in the Services part. Is that is the reason.Rocky
06/02/2026, 11:36 AMappProtocol: TCP in the Service is almost certainly why you are seeing the "Internal error processing forward" error.
Why this happens:
1. Direct Pod-to-Pod Communication: StarRocks FEs communicate with each other (for Leader election and command forwarding) using Pod IPs, not the ClusterIP Service.
2. Service vs. Pod Interception: When you add appProtocol to a Service, Istio only applies that logic to traffic directed at the Service's IP. It does not affect how Istio handles traffic sent directly to a Pod's IP (e.g., via RPC port 9020 or Metadata port 9010).
3. Proxy Interference: By removing the excludeInboundPorts and excludeOutboundPorts annotations, you forced the internal binary traffic (Thrift on 9020 and BDBJE on 9010) through the Envoy sidecar. Envoy's protocol detection or mTLS wrapping often breaks these sensitive, stateful binary protocols.
Why "Internal error processing forward"?
When you run a command like SHOW COMPUTE NODES, the Follower FE you are connected to tries to forward that request to the Leader FE over port 9020. Because the sidecar is now intercepting that traffic and the "Service" appProtocol doesn't apply to Pod-to-Pod IP traffic, the connection is either mangled by protocol detection or dropped, leading to the "Forward" error.
The Solution
To fix this, you should re-add the exclusions. Internal StarRocks traffic should bypass the Istio sidecar for stability and performance.
Update your StarRocksCluster spec with these annotations:
yaml
starRocksFESpec:
annotations:
<http://traffic.sidecar.istio.io/excludeInboundPorts|traffic.sidecar.istio.io/excludeInboundPorts>: "9010,9020,9030"
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "9010,9020,9030"
* 9010 (edit_log_port): Used for BDBJE metadata sync. Extremely sensitive to latency/proxying.
* 9020 (rpc_port): Used for internal command forwarding (the cause of your current error).
* 9030 (query_port): The MySQL port. While it can be proxied, excluding it avoids the "header validation" and "line feed" issues you encountered earlier.
If you absolutely must have Istio intercept these ports:
You cannot rely on the appProtocol in the Service. You must ensure the Pod's container ports are named with a tcp- prefix (e.g., tcp-rpc) so that Istio treats all traffic to those Pod ports as raw TCP. However, because the StarRocks Operator manages the Pod template, it may strip these names unless you are using a very recent version that supports custom port naming in the CRD.
Recommendation: Stick with the port exclusions for internal FE-to-FE and FE-to-BE communication. It is the official and most stable way to run StarRocks inside an Istio mesh.
References
• administration/management/FE_configuration.md
• deployment/deploy_manually.md
• deployment/environment_configurations.md
• deployment/sr_operator.md
• quick_start/helm.mdRumit Jain
06/02/2026, 12:06 PMRocky
06/02/2026, 12:06 PMappProtocol: TCP field to the Services generated by the StarRocks Operator, you need to update the service.ports section within your StarRocksCluster YAML for both the starRocksFESpec and starRocksCnSpec.
In the Operator's CRD, the ports list allows you to override or extend the configuration of the default ports. To ensure the settings apply to the correct ports, you must use the exact names the Operator assigns to them.
Updated YAML Example
yaml
apiVersion: <http://starrocks.com/v1|starrocks.com/v1>
kind: StarRocksCluster
metadata:
name: starrockscluster-sample
spec:
starRocksFESpec:
# ... other FE settings ...
service:
type: ClusterIP # or LoadBalancer
ports:
- name: http
port: 8030
appProtocol: TCP
- name: query
port: 9030
appProtocol: TCP
- name: rpc
port: 9020
appProtocol: TCP
starRocksCnSpec:
# ... other CN settings ...
service:
type: ClusterIP
ports:
- name: be-http
port: 8040
appProtocol: TCP
- name: brpc
port: 8060
appProtocol: TCP
Key Considerations:
1. Port Names Matter: The Operator identifies ports by their names. If you use a different name (e.g., tcp-http), the Operator might create a new port entry instead of updating the existing one.
* FE Names: http (8030), query (9030), rpc (9020), edit-log (9010).
* CN/BE Names: be-http (8040), brpc (8060), heartbeat (9050), be-port (9060).
2. Operator Version: The appProtocol field is supported in Kubernetes 1.19+. If your StarRocks Operator version is older (pre-1.8.x), it might not recognize this field in the CRD and could strip it out. Ensure you are using a recent version of the Operator.
3. Istio and Port Naming: If your goal is to tell Istio to treat these as TCP, you can also use the Port Naming Convention. If you rename the ports to start with tcp- (e.g., name: tcp-http), Istio will automatically treat the traffic as TCP even without the appProtocol field. However, appProtocol: TCP is the modern, explicit way to do this.
Note on "Forward" Errors: If you are still seeing "Internal error processing forward," remember that appProtocol on the Service only affects traffic hitting the Service IP. Internal communication between nodes (using Pod IPs) is still governed by the Pod's sidecar. You should keep the excludeInboundPorts/excludeOutboundPorts annotations on the Pods to ensure internal RPC ports (9020, 9010, 8060) for the most stable performance and stability.
References
• deployment/sr_operator.md
• quick_start/helm.md
• administration/management/FE_configuration.md
• deployment/shared_data/minio.mdRumit Jain
06/02/2026, 12:09 PMRocky
06/02/2026, 12:09 PMappProtocol: TCP is not appearing is that the StarRocks Operator's Custom Resource Definition (CRD) currently has a fixed schema. If a field like appProtocol isn't explicitly defined in the StarRocksCluster CRD's ports specification, the Operator will ignore it or the Kubernetes API will strip it out during validation.
Based on current StarRocks Operator behavior and open feature requests (e.g., GitHub Issue #753), here is the situation:
1. Limited CRD Support
As of current stable versions, the StarRocksCluster CRD allows you to specify port numbers and names, but it does not yet have a generic field for appProtocol that you can set via the Helm chart.
* Automatic MySQL Protocol: Since version 1.8.4, the Operator automatically adds appProtocol: MySQL to the FE query port (9030) to help Istio with protocol detection.
* Other Ports: For other ports (like RPC 9020 or BE ports), the Operator does not currently provide a way to inject a custom appProtocol string through the CRD.
2. Why it's not in the StatefulSet
The appProtocol field is a property of the Service Port, not the StatefulSet Container Port. Even if it were working, you would only see it by running:
bash
kubectl get svc <cluster-name>-fe-service -o yaml
You will not see it in the Pod or StatefulSet definition.
3. Workaround: Port Naming
If your goal is to get Istio to treat these ports as raw TCP, you can use Istio's Port Naming Convention. Istio will automatically treat traffic as TCP if the port name starts with tcp-.
However, the StarRocks Operator also controls the port names (e.g., query, rpc, http). If you attempt to override the name in the Helm chart to something like tcp-rpc, the Operator might ignore it or create a duplicate port entry depending on its internal logic.
Recommended Path
1. Check the Service, not the StatefulSet: Verify if appProtocol: MySQL is already there for port 9030 using kubectl get svc ... -o yaml. If it is, port 9030 is already handled for Istio.
2. Use Port Exclusions (Highest Stability): For the other internal ports (9010, 9020, 8060) where you are getting "forwarding" errors, the most reliable method is still the annotation-based bypass mentioned previously. This is because StarRocks' internal binary protocols (Thrift and BDBJE) are very sensitive to the latency and header manipulation introduced by the Istio sidecar, regardless of whether it's labeled as TCP.
yaml
# Add this to your FE/CN spec in the Helm values
annotations:
<http://traffic.sidecar.istio.io/excludeInboundPorts|traffic.sidecar.istio.io/excludeInboundPorts>: "9010,9020,9030"
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "9010,9020,9030"
If you must have appProtocol: TCP for security compliance, you may need to wait for the resolution of Issue #753 in the starrocks-kubernetes-operator repository or manually patch the Service after the Operator creates it (though the Operator may overwrite your manual changes during its next reconciliation).
References
• deployment/sr_operator.md
• quick_start/helm.md
• administration/management/FE_configuration.md
• deployment/environment_configurations.md
• faq/Deploy_faq.md
• faq/operation_maintenance_faq.md
References
• quick_start/helm.md
• deployment/sr_operator.mdRumit Jain
06/02/2026, 12:27 PMRocky
06/02/2026, 12:28 PMquery_port) is fully configurable. You can change it to 8888, 8080, or any other available port.
To change this when using the StarRocks Operator or Helm chart, you need to update two things in your StarRocksCluster YAML:
1. The FE Configuration (to tell the StarRocks process to listen on the new port).
2. The Service Port (to tell Kubernetes/Istio to route traffic to the new port).
Example: Changing 9030 to 8888
Add the query_port to the config section and update the ports list in the `starRocksFESpec`:
yaml
starRocksFESpec:
# 1. Update the FE process configuration
config: |
query_port = 8888
# ... other configs ...
# 2. Update the Kubernetes Service/Container port mapping
service:
ports:
- name: query
port: 8888 # The port exposed by the Service
containerPort: 8888 # Must match the query_port in config above
Important Considerations:
* Port Conflicts:
* By default, 8030 is used for the FE HTTP UI.
* If you use the fe-proxy (often used for Stream Load), it typically uses 8080. Ensure your chosen port doesn't conflict with these.
* Istio & appProtocol: If you are still troubleshooting the Istio protocol issue, remember to keep your appProtocol: TCP (or appProtocol: MySQL) on this new port entry in the service.ports section.
* Updating Clients: Once changed, any MySQL clients, BI tools, or applications must be updated to connect to the new port (e.g., mysql -h <IP> -P 8888).
* Internal Communication: Changing the query_port is safe because it is the "external-facing" MySQL port. Internal FE-to-FE communication uses the rpc_port (9020) and edit_log_port (9010), which should generally remain as they are.
How to verify:
After applying the change, check that the FE configuration was picked up:
1. Check the service: kubectl get svc <cluster-name>-fe-service (should show 8888).
2. Check the FE log or run SHOW FRONTENDS; inside StarRocks (the QueryPort column should reflect the change).
References
• administration/management/FE_configuration.md
• deployment/environment_configurations.md
• deployment/sr_operator.md
• quick_start/helm.md
References
• quick_start/helm.md
• administration/management/FE_configuration.md
• deployment/sr_operator.md
• deployment/environment_configurations.mdRumit Jain
06/02/2026, 12:43 PMRocky
06/02/2026, 12:43 PMLost connection to MySQL server at 'waiting for initial communication packet' indicates that the CN pod's registration script is reaching a network socket, but it is not receiving the expected MySQL handshake.
This is happening because of two specific issues in your feSpec change:
1. Renaming Port Names (Critical)
The StarRocks Operator identifies ports by exact names. You changed the names to http-port and rpc-port.
* The Problem: The Operator uses the name rpc to determine which port to use for internal cluster communication. By renaming it to rpc-port, the Operator may fail to correctly configure the environment variables that the CN uses to find the FE.
* The Fix: Use the exact names http, rpc, and query.
2. FE Process Configuration Mismatch
If you change the service.port and containerPort to 8888 in the YAML, you must also tell the StarRocks FE process to listen on that port via the config section. If you don't, the Service will route traffic to port 8888 inside the pod, but the FE will still be listening on 9030.
3. Istio Protocol Mismatch
If you are using Istio, appProtocol: TCP is usually correct for the RPC port, but for the Query Port (8888), it should ideally be appProtocol: mysql. If Istio tries to handle the query port as generic TCP while the FE isn't responding correctly, you get the "waiting for initial communication packet" timeout.
──────────
Recommended Corrected Configuration
Update your StarRocksCluster YAML as follows:
yaml
starRocksFESpec:
# 1. You MUST update the FE process configuration to listen on 8888
config: |
query_port = 8888
http_port = 8030
rpc_port = 9020
service:
type: ClusterIP
ports:
- name: query # MUST be "query"
port: 8888
containerPort: 8888
appProtocol: mysql # Use "mysql" for port 8888/9030 if using Istio
- name: http # MUST be "http"
port: 8030
containerPort: 8030
appProtocol: TCP
- name: rpc # MUST be "rpc"
port: 9020
containerPort: 9020
appProtocol: TCP
# 2. To fix the "Lost connection" error in Istio, bypass the sidecar for internal ports
annotations:
<http://traffic.sidecar.istio.io/excludeInboundPorts|traffic.sidecar.istio.io/excludeInboundPorts>: "9020,9010"
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "9020,9010"
Why the CN is still failing:
The CN pods run a mysql command on startup to register themselves with the FE.
* If the FE is not listening on 8888 (because the config wasn't updated), the connection times out.
* If the rpc port name was changed, the CN might be trying to register with the FE using incorrect metadata, causing the FE to reject the registration.
To Verify:
1. Check the FE logs (kubectl logs <fe-pod>) to see if it says MySQL server started on 8888.
2. Check the CN pod environment variables (kubectl exec <cn-pod> -- env | grep FE) to ensure FE_QUERY_PORT is correctly set to 8888.
References
• faq/Others.md
• faq/Deploy_faq.md
• faq/operation_maintenance_faq.md
• administration/Meta_recovery.md
• deployment/deploy_manually.md
• deployment/environment_configurations.mdRumit Jain
06/02/2026, 12:59 PMstarrocksFESpec:
replicas: 3
image:
repository: <http://264308539041.dkr.ecr.us-east-1.amazonaws.com/tracelink/starrocks/fe-ubuntu|264308539041.dkr.ecr.us-east-1.amazonaws.com/tracelink/starrocks/fe-ubuntu>
tag: "4.0.1"
imagePullPolicy: IfNotPresent
entrypoint: {}
annotations:
<http://traffic.sidecar.istio.io/excludeInboundPorts|traffic.sidecar.istio.io/excludeInboundPorts>: "9020,9010"
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "9020,9010"
runAsNonRoot: true
readOnlyRootFilesystem: false
capabilities:
drop:
- ALL
sysctls: []
service:
type: "ClusterIP"
loadbalancerIP: ""
annotations: {}
labels: {}
ports:
- name: query
containerPort: 8888
port: 8888
appProtocol: mysql
- name: http
containerPort: 8030
appProtocol: TCP
- name: rpc
containerPort: 9020
appProtocol: TCP
loadBalancerSourceRanges: []
imagePullSecrets: []
serviceAccount: ""
nodeSelector: {}
podLabels: {}
hostAliases: []
schedulerName: ""
feEnvVars:
- name: LOG_CONSOLE
value: "1"
affinity: {}
tolerations: []
topologySpreadConstraints:
- maxSkew: 1
topologyKey: <http://topology.kubernetes.io/zone|topology.kubernetes.io/zone>
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
<http://app.kubernetes.io/component|app.kubernetes.io/component>: fe
minDomains: 3
resources:
requests:
cpu: 4
memory: 4Gi
limits:
cpu: 8
memory: 8Gi
storageSpec:
name: "fe"
storageClassName: ""
storageSize: 10Gi storageMountPath: "/opt/starrocks/fe/meta"
logStorageClassName: ""
logStorageSize: 10Gi
emptyDirs: []
hostPaths: []
persistentVolumeClaimRetentionPolicy:
config: |
LOG_DIR = ${STARROCKS_HOME}/log
DATE = "$(date +%Y%m%d-%H%M%S)"
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx8192m -XX:+UseG1GC -Xlog:gc*:${LOG_DIR}/fe.gc.log.$DATE:time"
edit_log_port = 9010
query_port = 8888
http_port = 8030
rpc_port = 9020
mysql_service_nio_enabled = true
sys_log_level = INFO
min_graceful_exit_time_second = 25
enable_http_validate_headers = false
configyaml: {}
secrets:
- name: sr-admin-user-password
mountPath: /etc/starrocks/secrets/sr-admin-user-password
- name: sr-dml-user-password
mountPath: /etc/starrocks/secrets/sr-dml-user-password
- name: sr-readonly-user-password
mountPath: /etc/starrocks/secrets/sr-readonly-user-password
configMaps: []
terminationGracePeriodSeconds: 120
startupProbeFailureSeconds:
livenessProbeFailureSeconds:
readinessProbeFailureSeconds:
minReadySeconds: 0
podManagementPolicy: Parallel
lifecycle: {}
sidecars: []
sidecarsMap: {}
initContainers: []
maxUnavailablePods:
shareProcessNamespace:Rocky
06/02/2026, 1:00 PMservice.ports
The edit_log_port (9010) is used for FE-to-FE metadata synchronization (BDBJE protocol). In your feSpec, you have it in the config but omitted it from the service.ports list. This prevents FEs from talking to each other, which is why you see socket connection ... 9010 failed.
2. Bypass Istio for Port 8888
The CN error Lost connection ... waiting for initial communication packet is a classic Istio symptom. When you use a non-standard port (8888) for MySQL, Istio's protocol detection often fails or times out. Since this is an internal registration step, it is highly recommended to exclude port 8888 from Istio's proxy.
3. Update the feSpec
Apply these specific changes to your `feSpec`:
yaml
starRocksFESpec:
annotations:
# Add 8888 and 9010 to the exclusion lists
<http://traffic.sidecar.istio.io/excludeInboundPorts|traffic.sidecar.istio.io/excludeInboundPorts>: "9010,9020,8888"
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "9010,9020,8888"
service:
ports:
- name: query
port: 8888
containerPort: 8888
appProtocol: mysql
- name: http
port: 8030
containerPort: 8030
appProtocol: TCP
- name: rpc
port: 9020
containerPort: 9020
appProtocol: TCP
- name: edit-log # ADD THIS PORT
port: 9010
containerPort: 9010
appProtocol: TCP
config: |
edit_log_port = 9010
query_port = 8888
http_port = 8030
rpc_port = 9020
# ... rest of your config
4. Important: Update the CN Spec
If your CN pods also have Istio sidecars, they must also have the excludeOutboundPorts annotation so they can talk to the FE's port 8888 without proxy interference.
In your starRocksCNSpec (or starRocksBeSpec if using BE):
yaml
starRocksCNSpec:
annotations:
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "9010,9020,8888"
Why this happened:
1. FE Failure: The PortConnectivityChecker failed because the FEs couldn't find a path to port 9010 on their peers. Without 9010, the FEs cannot elect a Leader. Without a Leader, the MySQL service (query_port) will not respond to registrations.
2. CN Failure: Even if the FE were up, Istio intercepts traffic on port 8888. Because it doesn't see standard MySQL traffic immediately (or due to mTLS handshake delays), it drops the connection, leading to the system error: 110 (Connection timed out) or the "initial communication packet" error.
Next Step: After applying these changes, check kubectl logs <fe-pod-name> and look for finished to get FE type: LEADER. Once one FE is a Leader, the CN pods should be able to register.
References
• administration/management/FE_configuration.md
• deployment/sr_operator.md
• faq/Deploy_faq.md
• deployment/environment_configurations.md
• quick_start/helm.md
• faq/operation_maintenance_faq.mdRumit Jain
06/02/2026, 1:10 PMRocky
06/02/2026, 1:11 PMConnection reset and Lost connection ... waiting for initial communication packet errors indicate that even though you've updated the ports, Istio is still intercepting and breaking the internal mTLS/MySQL handshake on the new port 8888 and the heartbeat port 9050.
In an Istio environment, StarRocks internal communication (which is high-frequency Thrift/MySQL/bRPC traffic) must bypass the Envoy sidecar. You must apply the exclusion annotations to both the FE and the CN specifications.
1. Update the FE Spec
Ensure the FE service includes port 9010 (which was missing) and the exclusion list is expanded.
yaml
starRocksFESpec:
annotations:
# Exclude all FE ports from Istio interception
<http://traffic.sidecar.istio.io/excludeInboundPorts|traffic.sidecar.istio.io/excludeInboundPorts>: "8888,9010,9020,8030"
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "8888,9010,9020,8030"
service:
ports:
- name: query
port: 8888
containerPort: 8888
- name: http
port: 8030
containerPort: 8030
- name: rpc
port: 9020
containerPort: 9020
- name: edit-log
port: 9010
containerPort: 9010
2. Update the CN Spec (Crucial)
The FE's Connection reset happens because it cannot talk to the CN's heartbeat port (9050). The CN's Lost connection happens because the CN's sidecar is interfering with the outbound call to the FE's MySQL port (8888).
Add these annotations to your `starRocksCnSpec`:
yaml
starRocksCnSpec:
annotations:
# 1. Exclude CN's own ports so FE can heartbeat/RPC them
<http://traffic.sidecar.istio.io/excludeInboundPorts|traffic.sidecar.istio.io/excludeInboundPorts>: "9050,9060,8060,9070"
# 2. Exclude FE's ports so CN can talk to FE without sidecar interference
<http://traffic.sidecar.istio.io/excludeOutboundPorts|traffic.sidecar.istio.io/excludeOutboundPorts>: "8888,9010,9020,9050,9060,8060,9070"
Why this is still failing:
* Heartbeat Reset: The FE uses the rpc port (9020) to send heartbeats to the CN's heartbeat_service_port (9050). If Istio intercepts port 9050 on the CN pod, it tries to wrap the Thrift traffic in mTLS. If the FE (sender) isn't using the same mTLS context or the handshake is slow, the connection is reset.
* MySQL Timeout (110): When the CN pod starts, it executes a mysql -h <FE_IP> -P 8888 command to register. Since 8888 is a non-standard MySQL port, Istio's "Automatic Protocol Detection" often waits for the server to speak first (the "initial communication packet"). In MySQL, the server does speak first, but Istio's proxy often buffers this or times out while trying to determine if the traffic is HTTP or TCP.
Troubleshooting Step:
If you apply the above and it still fails, run this command from inside a CN pod to see if it can reach the FE without MySQL protocol overhead:
nc -zv <fe-service-name> 8888
If nc succeeds but mysql fails, the issue is 100% Istio protocol interference on port 8888.
References
• administration/management/FE_configuration.md
• deployment/sr_operator.md
• faq/operation_maintenance_faq.md
• deployment/environment_configurations.md
• sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md
References
• deployment/deploy_manually.md
• deployment/environment_configurations.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.mdRocky
06/02/2026, 1:11 PMRumit Jain
06/02/2026, 1:32 PMRocky
06/02/2026, 1:32 PMquery_port changes from the FE configuration into the CN's registration environment variables.
The Fix: Manually set FE_QUERY_PORT in the CN Spec
You must explicitly tell the CN pods to use port 8888 for their registration handshake by adding the FE_QUERY_PORT environment variable to your starRocksCnSpec.
Update your StarRocksCluster YAML as follows:
yaml
starRocksCnSpec:
# ... other fields (replicas, image, etc.) ...
cnEnvVars:
- name: FE_QUERY_PORT
value: "8888"
# Ensure this matches the service name seen in your error logs
- name: FE_SERVICE_NAME
value: "kube-starrocks-fe-service"
Why this is necessary:
1. Registration Script: When a CN pod starts, it runs a mysql client command (e.g., ALTER SYSTEM ADD COMPUTE NODE...) to register itself with the FE.
2. Default Values: This script uses the environment variable FE_QUERY_PORT. If it isn't set in the pod's env section, it defaults to 9030.
3. Connection Timeout (110): Because your FE is now listening on 8888, the CN's attempt to reach 9030 fails with a timeout (System Error 110).
Verification Steps:
1. Check Pod Env: Run kubectl exec <cn-pod-name> -- env | grep FE_QUERY_PORT to verify the pod actually has the new value.
2. Manual Test: From inside a CN pod, try connecting manually using the new port:
bash
mysql -h kube-starrocks-fe-service -P 8888 -uroot
If this works, the environment variable fix will allow the pod to come healthy.
Reminder on Istio
If you have Istio enabled, ensure that port 8888 is added to the excludeInboundPorts and excludeOutboundPorts annotations in both the FE and CN specs. Istio's protocol sniffing often breaks the MySQL handshake on non-standard ports like 8888, which can lead to the "Lost connection" or "Waiting for initial communication packet" errors you saw earlier.
References
• administration/management/FE_configuration.md
• deployment/sr_operator.md
• faq/operation_maintenance_faq.md
• deployment/environment_configurations.md
• sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md
References
• administration/management/FE_configuration.md
• deployment/environment_configurations.md
• deployment/deploy_manually.mdRumit Jain
06/02/2026, 1:51 PMStarrocks > show frontends\G;
*************************** 1. row ***************************
Id: 3
Name: kube-starrocks-fe-2.kube-starrocks-fe-search.olymsre01.svc.cluster.local_9010_1780370832448
IP: kube-starrocks-fe-2.kube-starrocks-fe-search.olymsre01.svc.cluster.local
EditLogPort: 9010
HttpPort: 8030
QueryPort: 9030
RpcPort: 9020
Role: FOLLOWER
ClusterId: 1609701678
Join: true
Alive: true
ReplayedJournalId: 27105
LastHeartbeat: 2026-06-02 13:45:11
IsHelper: true
ErrMsg:
StartTime: 2026-06-02 13:39:35
Version: 4.0.1-cd9df36
*************************** 2. row ***************************
Id: 1
Name: kube-starrocks-fe-0.kube-starrocks-fe-search.olymsre01.svc.cluster.local_9010_1780370777968
IP: kube-starrocks-fe-0.kube-starrocks-fe-search.olymsre01.svc.cluster.local
EditLogPort: 9010
HttpPort: 8030
QueryPort: 9030
RpcPort: 9020
Role: LEADER
ClusterId: 1609701678
Join: true
Alive: true
ReplayedJournalId: 27106
LastHeartbeat: 2026-06-02 13:45:11
IsHelper: true
ErrMsg:
StartTime: 2026-06-02 13:39:36
Version: 4.0.1-cd9df36
*************************** 3. row ***************************
Id: 2
Name: kube-starrocks-fe-1.kube-starrocks-fe-search.olymsre01.svc.cluster.local_9010_1780370831958
IP: kube-starrocks-fe-1.kube-starrocks-fe-search.olymsre01.svc.cluster.local
EditLogPort: 9010
HttpPort: 8030
QueryPort: 9030
RpcPort: 9020
Role: FOLLOWER
ClusterId: 1609701678
Join: true
Alive: true
ReplayedJournalId: 27105
LastHeartbeat: 2026-06-02 13:45:11
IsHelper: true
ErrMsg:
StartTime: 2026-06-02 13:39:37
Version: 4.0.1-cd9df36
3 rows in set (0.03 sec)
ERROR:
No query specifiedRocky
06/02/2026, 1:52 PMSHOW FRONTENDS still shows port 9030 while you are successfully connecting on 8888 is that SHOW FRONTENDS displays information from the cluster's persistent metadata, which is not automatically updated when you change the fe.conf file.
Why this happens
1. Metadata vs. Config: When a StarRocks FE cluster is first initialized or when a node is added via ALTER SYSTEM ADD FOLLOWER, its port information (QueryPort, HttpPort, etc.) is recorded in the cluster's metadata (the image and edit logs).
2. Process vs. Catalog: When you updated the feSpec, the FE process restarted with the new query_port = 8888 and successfully started listening on that port. This is why you can connect to it. However, the FE Leader's catalog still holds the original registration record (9030) for those nodes.
3. Heartbeat Behavior: While FE nodes send heartbeats to the Leader, those heartbeats typically update the "Alive" status and "ReplayedJournalId," but they do not dynamically overwrite the port metadata in the Leader's memory.
How to verify the actual port
To confirm that the FE process is indeed configured to use 8888, run this command in your MySQL client:
sql
ADMIN SHOW FRONTEND CONFIG LIKE 'query_port';
If this returns 8888, the node is correctly configured and running on the new port. The 9030 in SHOW FRONTENDS is currently "cosmetic" stale metadata.
How to fix the metadata (Update SHOW FRONTENDS)
To make the SHOW FRONTENDS output match reality, the FE nodes usually need to be re-registered. Note: Since you are using the StarRocks Operator, be careful with manual DROP commands as the Operator might try to reconcile the pods.
For Followers/Observers:
1. Connect to the Leader FE.
2. Drop the follower: ALTER SYSTEM DROP FOLLOWER "node_host:9010";
3. The Operator should automatically restart the pod. If it doesn't join back with the correct port, you may need to manually add it back (or let the Operator's initialization script handle it) using the current ports.
For the Leader:
Updating the Leader's own registered port in the metadata is more complex because it is the source of truth. Often, this requires a metadata migration or "re-electing" a new leader after updating all followers.
Is it a problem?
As long as:
* Your applications (and the CN pods) are configured to use 8888.
* The ADMIN SHOW FRONTEND CONFIG shows 8888.
* The Alive column in SHOW FRONTENDS is true.
The cluster will function correctly. The discrepancy in SHOW FRONTENDS is a known behavior where metadata doesn't track fe.conf changes for existing nodes.
Recommendations
1. Check CN Registration: Ensure your CN pods are healthy. If they still fail, double-check that you added the FE_QUERY_PORT: "8888" environment variable to the cnEnvVars as discussed previously.
2. Stick to 8888: Since you've successfully moved to 8888, keep your K8s Service and internal configs pointed there.
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_FRONTENDS.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
• faq/operation_maintenance_faq.md
References
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_FRONTENDS.mdRocky
06/02/2026, 1:52 PMRumit Jain
06/02/2026, 1:55 PMstarrocksFESpec:
replicas: 3
image:
repository: 264308539041.dkr.ecr.us-east-1.amazonaws.com/tracelink/starrocks/fe-ubuntu
tag: "4.0.1"
imagePullPolicy: IfNotPresent
entrypoint: {}
annotations:
traffic.sidecar.istio.io/excludeInboundPorts: "6090,8030,8040,8060,8167,9010,9020,9030,9050,9060,9070,8888"
traffic.sidecar.istio.io/excludeOutboundPorts: "6090,8030,8040,8060,8167,9010,9020,9030,9050,9060,9070,8888"
runAsNonRoot: true
readOnlyRootFilesystem: false
capabilities:
drop:
- ALL
sysctls: []
service:
type: "ClusterIP"
loadbalancerIP: ""
annotations: {}
labels: {}
ports:
- name: query
containerPort: 8888
port: 8888
appProtocol: mysql
- name: http
containerPort: 8030
appProtocol: TCP
- name: rpc
containerPort: 9020
appProtocol: TCP
loadBalancerSourceRanges: []
imagePullSecrets: []
serviceAccount: ""
nodeSelector: {}
podLabels: {}
hostAliases: []
schedulerName: ""
feEnvVars:
- name: LOG_CONSOLE
value: "1"
affinity: {}
tolerations: []
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app.kubernetes.io/component: fe
minDomains: 3
resources:
requests:
cpu: 4
memory: 4Gi
limits:
cpu: 8
memory: 8Gi
storageSpec:
name: "fe"
storageClassName: ""
storageSize: 10Gi storageMountPath: "/opt/starrocks/fe/meta"
logStorageClassName: ""
logStorageSize: 10Gi
emptyDirs: []
hostPaths: []
persistentVolumeClaimRetentionPolicy:
config: |
LOG_DIR = ${STARROCKS_HOME}/log
DATE = "$(date +%Y%m%d-%H%M%S)"
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx8192m -XX:+UseG1GC -Xlog:gc*:${LOG_DIR}/fe.gc.log.$DATE:time"
edit_log_port = 9010
query_port = 8888
http_port = 8030
rpc_port = 9020
mysql_service_nio_enabled = true
sys_log_level = INFO
min_graceful_exit_time_second = 25
enable_http_validate_headers = false
configyaml: {}
secrets:
- name: sr-admin-user-password
mountPath: /etc/starrocks/secrets/sr-admin-user-password
- name: sr-dml-user-password
mountPath: /etc/starrocks/secrets/sr-dml-user-password
- name: sr-readonly-user-password
mountPath: /etc/starrocks/secrets/sr-readonly-user-password
configMaps: []
terminationGracePeriodSeconds: 120
startupProbeFailureSeconds:
livenessProbeFailureSeconds:
readinessProbeFailureSeconds:
minReadySeconds: 0
podManagementPolicy: Parallel
lifecycle: {}
sidecars: []
sidecarsMap: {}
initContainers: []
maxUnavailablePods:
shareProcessNamespace:Rocky
06/02/2026, 1:55 PMADMIN SHOW FRONTEND CONFIG returns 9030, it confirms that the StarRocks FE process is still listening on port 9030 inside the container.
The reason you are able to connect via port 8888 is likely that your Kubernetes Service is configured to map Port 8888 (External/Service) to TargetPort 9030 (Internal/Container).
Why this is happening
In the StarRocks Operator, there are two different "ports" to consider:
1. Service Port: Controlled by the service section in your YAML. This is what you use in your MySQL client.
2. Container Port (Process Port): Controlled by the fe.conf file (or the config section in the CRD). This is what the FE process actually binds to.
If you only changed the service port to 8888 but did not explicitly add query_port = 8888 to your FE configuration, the process stays on 9030.
How to synchronize them
To make the FE process actually run on 8888 (so that ADMIN SHOW FRONTEND CONFIG and SHOW FRONTENDS eventually reflect reality):
1. Update the FE Config:
Add the query_port to the config section of your StarRocksCluster YAML.
yaml
starRocksFeSpec:
config: |
query_port = 8888
# Ensure other ports match your service spec if you changed them
http_port = 8030
rpc_port = 9020
edit_log_port = 9010
2. Update the Service Spec:
Ensure the containerPort matches the port.
yaml
service:
ports:
• name: query
port: 8888
containerPort: 8888 # This must match query_port in config
3. Update CN Environment Variable:
Ensure your CN pods are looking for the FE on 8888.
yaml
starRocksCnSpec:
cnEnvVars:
• name: FE_QUERY_PORT
value: "8888"
Why SHOW FRONTENDS still says 9030
Even after the process restarts on 8888, SHOW FRONTENDS might still show 9030. This is because frontend metadata is persistent. The FE Leader stores the ports of all followers in its BDBJE metadata catalog.
* To update this, you usually have to ALTER SYSTEM DROP FOLLOWER and let the node re-join, or wait for the Leader to update its catalog (which doesn't always happen automatically for port changes).
* Recommendation: If everything is working (CNs are healthy, queries work), you can ignore the SHOW FRONTENDS display value for now. It is primarily "cosmetic" once the connection is established.
Final Verification
After applying the config change and the pods restart:
1. Run kubectl exec <fe-pod> -- netstat -tunlp to see if the process is listening on 8888.
2. Run ADMIN SHOW FRONTEND CONFIG LIKE 'query_port';. It should now return 8888.
References
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
• deployment/sr_operator.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_FRONTENDS.md
• deployment/environment_configurations.md
References
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
• deployment/sr_operator.mdRocky
06/02/2026, 1:55 PMRocky
06/02/2026, 1:59 PMADMIN SHOW FRONTEND CONFIG returns 9030 means the FE process is ignoring your query_port = 8888 setting in the config block and is falling back to the default.
There are three likely reasons for this:
1. Invalid Syntax in config Block
In your config block, you have this line:
yaml
DATE = "$(date +%Y%m%d-%H%M%S)"
fe.conf is a static key-value properties file, not a shell script. Including shell commands like $(date ...) or variable expansions like ${STARROCKS_HOME} in the config block can cause the FE to fail to parse the file correctly. When the FE encounter a parsing error in fe.conf, it often ignores the rest of the file or falls back to defaults for specific keys.
Fix: Remove the shell-style variables from the config block. StarRocks handles LOG_DIR and JAVA_OPTS specially, but they should be plain strings or set via feEnvVars.
2. Environment Variables Overriding fe.conf
The StarRocks Docker image entrypoint often prioritizes environment variables over the fe.conf file. Even if you don't see them in your YAML, the Operator might be injecting them, or the base image might have defaults.
Verification:
Run this command to see what environment variables are actually present inside the running FE pod:
bash
kubectl exec <fe-pod-name> -- env | grep PORT
If you see QUERY_PORT=9030, that is your culprit. To fix this, explicitly add the environment variable to your `feEnvVars`:
yaml
feEnvVars:
- name: QUERY_PORT
value: "8888"
3. The "Service" Port vs "Process" Port
In your YAML, you set:
yaml
ports:
- name: query
containerPort: 8888
port: 8888
If ADMIN SHOW FRONTEND CONFIG says 9030, then the process is listening on 9030. If the Pod Spec says containerPort: 8888, K8s is looking for a process on 8888. Usually, this results in a Connection Refused error unless Istio or a LoadBalancer is re-routing the traffic.
Recommended Steps to Fix:
1. Clean up the config block: Remove the DATE and LOG_DIR lines which contain shell syntax.
2. Explicitly set the Port Env Var: Add QUERY_PORT to feEnvVars.
3. Check the actual file: Run this to see what the FE actually sees in its config file:
bash
kubectl exec <fe-pod-name> -- cat /opt/starrocks/fe/conf/fe.conf | grep query_port
4. Restart the FE pods: After applying the YAML changes, ensure the pods actually restart (kubectl rollout restart statefulset <fe-name>).
Updated feEnvVars snippet:
yaml
feEnvVars:
- name: LOG_CONSOLE
value: "1"
- name: QUERY_PORT
value: "8888"
Once ADMIN SHOW FRONTEND CONFIG returns 8888, your CN pods will be able to register correctly using the FE_QUERY_PORT: "8888" environment variable.
References
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
• deployment/sr_operator.md
• deployment/environment_configurations.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_FRONTENDS.md
References
• administration/management/FE_configuration.md
• deployment/sr_operator.md
• deployment/environment_configurations.mdRocky
06/02/2026, 1:59 PMRumit Jain
06/03/2026, 7:04 AMRocky
06/03/2026, 7:05 AM7g) or Graviton4 (8g) families are highly recommended. StarRocks has been significantly optimized for ARM architecture (especially from version 3.3 onwards), showing up to a 50% price-performance improvement over x86 counterparts in some benchmarks.
Recommended Instance Types
1. Compute Nodes (CN) / Backend (BE)
These nodes are compute-intensive and benefit heavily from high memory bandwidth (DDR5 on Graviton3+).
* Best Balance (Standard): m7g.4xlarge
* Specs: 16 vCPU, 64 GB RAM.
* Why: Matches the StarRocks recommended ratio of 1 vCPU to 4 GB RAM for production BE/CN nodes.
* High Performance / Complex Queries: r7g.4xlarge
* Specs: 16 vCPU, 128 GB RAM.
* Why: Best for memory-intensive OLAP queries, large joins, or high concurrency where more RAM per core is needed.
* With Local Data Cache: m7gd.4xlarge or r7gd.4xlarge
* Specs: Same as above but includes Local NVMe SSDs.
* Why: Essential for Shared-data architecture (CN nodes) to utilize the local Data Cache for sub-second query performance on hot data.
2. Frontend Nodes (FE)
FE nodes handle metadata management and query planning. They require lower CPU power but need stable memory for the catalog.
* Recommended: m7g.2xlarge
* Specs: 8 vCPU, 32 GB RAM.
* Why: Metadata management is memory-sensitive. While StarRocks officially recommends at least 16 GB, 32 GB provides a safer buffer for growing metadata.
* Cost-Optimized: c7g.2xlarge
* Specs: 8 vCPU, 16 GB RAM.
* Why: Sufficient for smaller clusters or those with limited metadata.
Comparison: Graviton3 vs. Graviton4
* Graviton3 (7g): The current "sweet spot" for StarRocks. It uses DDR5 memory and is widely benchmarked by the StarRocks community with proven stability.
* Graviton4 (8g): Offers ~30% better performance over Graviton3. If available in your region, m8g or r8g instances are excellent choices for future-proofing, though they may carry a slightly higher hourly cost.
Key Configuration Tips for Graviton
1. StarRocks Version: Ensure you are running v3.3.0 or later to take full advantage of ARM-specific instruction set optimizations.
2. JDK: Use JDK 11 or 17 (depending on your StarRocks version) and ensure you use the AArch64 build of the JDK.
3. Operating System: Use an ARM-native AMI, such as Amazon Linux 2023 or Ubuntu 22.04 (ARM64).
4. Vectorization: StarRocks vectorization is fully supported on ARM, but note that it uses SIMD (NEON/SVE) instead of x86 AVX2.
References
• release_notes/release-3.3.md
• deployment/plan_cluster.md
• deployment/deployment_prerequisites.md
• faq/Deploy_faq.md
References
• faq/Deploy_faq.md
• deployment/plan_cluster.md
• deployment/deployment_prerequisites.md
• faq/Others.md
• introduction/Architecture.mdRumit Jain
06/03/2026, 7:16 AMstarrocksCluster:
namespace: "fkt0"
componentValues:
serviceAccount: ABC-starrocks-s3-sa
tolerations:
- key: "node-type"
operator: "Equal"
value: "graviton"
effect: "NoSchedule"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["fkt0"]
- key: <http://karpenter.sh/capacity-type|karpenter.sh/capacity-type>
operator: In
values: [ "on-demand" ]
- key: <http://kubernetes.io/arch|kubernetes.io/arch>
operator: In
values: ['arm64']
- key: <http://kubernetes.io/os|kubernetes.io/os>
operator: In
values: ['linux']
- key: node-type
operator: In
values: ["graviton"]
# ============================================================
# FE-PROXY — EXPOSE THROUGH ALB (HTTP only)
# ============================================================
starrocksFeProxySpec:
enabled: true
image:
tag: 1.28.0
resources:
requests:
cpu: 1
memory: 2Gi
limits:
cpu: 1
memory: 2Gi
tolerations:
- key: "node-type"
operator: "Equal"
value: "graviton"
effect: "NoSchedule"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: ["fkt0"]
- key: <http://karpenter.sh/capacity-type|karpenter.sh/capacity-type>
operator: In
values: [ "on-demand" ]
- key: <http://kubernetes.io/arch|kubernetes.io/arch>
operator: In
values: ['arm64']
- key: <http://kubernetes.io/os|kubernetes.io/os>
operator: In
values: ['linux']
- key: node-type
operator: In
values: ["graviton"]
# ============================================================
# FE (FrontEnd Service) — EXPOSE THROUGH NLB (MySQL + HTTP)
# ============================================================
starrocksFESpec:
image:
tag: "4.0.1"
resources:
requests:
cpu: 3
memory: 8Gi
limits:
cpu: 3
memory: 8Gi
config: |
run_mode = shared_data
cloud_native_storage_type = S3
aws_s3_path = ABC-data
aws_s3_region = eu-central-1
aws_s3_endpoint = <https://s3.eu-central-1.amazonaws.com>
enable_load_volume_from_conf=true
aws_s3_use_instance_profile=false
aws_s3_use_aws_sdk_default_behavior=true
enable_trace_historical_node = true
audit_log_modules = slow_query, query, connection
audit_log_json_format = true
qe_slow_log_ms = 1000
aws_s3_enable_partitioned_prefix=true
aws_s3_num_partitioned_prefix=64
automated_cluster_snapshot_interval_seconds=600
storageSpec:
storageSize: 10Gi
logStorageSize: 10Gi
tolerations:
- key: "node-type"
operator: "Equal"
value: "graviton"
effect: "NoSchedule"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: [ "fkt0" ]
- key: <http://karpenter.sh/capacity-type|karpenter.sh/capacity-type>
operator: In
values: [ "on-demand" ]
- key: <http://kubernetes.io/arch|kubernetes.io/arch>
operator: In
values: ['arm64']
- key: <http://kubernetes.io/os|kubernetes.io/os>
operator: In
values: ['linux']
- key: node-type
operator: In
values: ["graviton"]
# ============================================================
# CN (Compute Node)
# ============================================================
starrocksCnSpec:
replicas: 1
image:
tag: "4.0.1"
resources:
requests:
cpu: 8
memory: 16Gi
limits:
cpu: 8
memory: 16Gi
storageSpec:
storageSize: 20Gi
logStorageSize: 20Gi
tolerations:
- key: "node-type"
operator: "Equal"
value: "graviton"
effect: "NoSchedule"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: namespace
operator: In
values: [ "fkt0" ]
- key: <http://karpenter.sh/capacity-type|karpenter.sh/capacity-type>
operator: In
values: [ "spot" ]
- key: <http://kubernetes.io/arch|kubernetes.io/arch>
operator: In
values: ['arm64']
- key: <http://kubernetes.io/os|kubernetes.io/os>
operator: In
values: ['linux']
- key: node-type
operator: In
values: ["graviton"]
autoScalingPolicy: # Automatic scaling policy of the CN cluster.
maxReplicas: 10 # The maximum number of CNs is set to 10.
minReplicas: 2 # The minimum number of CNs is set to 1.
# operator creates an HPA resource based on the following field.
# see <https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/> for more information.
hpaPolicy:
metrics: # Resource metrics
- type: Resource
resource:
name: memory # The average memory usage of CNs is specified as a resource metric.
target:
# The elastic scaling threshold is 60%.
# When the average memory utilization of CNs exceeds 60%, the number of CNs increases for scale-out.
# When the average memory utilization of CNs is below 60%, the number of CNs decreases for scale-in.
averageUtilization: 60
type: Utilization
- type: Resource
resource:
name: cpu # The average CPU utilization of CNs is specified as a resource metric.
target:
# The elastic scaling threshold is 60%.
# When the average CPU utilization of CNs exceeds 60%, the number of CNs increases for scale-out.
# When the average CPU utilization of CNs is below 60%, the number of CNs decreases for scale-in.
averageUtilization: 60
type: Utilization
behavior: # The scaling behavior is customized according to business scenarios, helping you achieve rapid or slow scaling or disable scaling.
scaleUp:
policies:
- type: Pods
value: 1
periodSeconds: 10
scaleDown:
policies:
- type: Pods
value: 1
periodSeconds: 30
stabilizationWindowSeconds: 300
selectPolicy: MaxRocky
06/03/2026, 7:16 AMquery_port = 8888 in the config block, the process may still listen on 9030 if the environment variable isn't set.
* Add QUERY_PORT to feEnvVars.
* Update JAVA_OPTS to be safer. If your limit is 8Gi, setting -Xmx8192m will cause the pod to be OOMKilled because it doesn't leave room for off-heap memory.
2. Configure CN Data Cache (Crucial for S3)
In shared-data mode, the CN needs a local disk to cache data from S3. Without this, every query will pull from S3, which is slow and expensive.
* Increase CN Storage: 20Gi is very small for an 8-core node. Recommend at least 100Gi-200Gi if using EBS.
* Update CN Config: Explicitly define storage_root_path.
3. Resource Tuning for Graviton
* RAM Ratio: For 8 vCPUs on Graviton, 32Gi RAM is recommended. 16Gi is tight for OLAP workloads and may lead to OOM during complex joins.
Suggested Values Update
yaml
starrocksFESpec:
# ... (image, resources)
feEnvVars:
- name: LOG_CONSOLE
value: "1"
- name: QUERY_PORT # Forces the process to use 8888
value: "8888"
config: |
run_mode = shared_data
query_port = 8888
# Use -Xmx6g for an 8Gi RAM limit to leave room for the OS/Off-heap
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx6g -XX:+UseG1GC"
# ... (other S3 configs)
aws_s3_path = my-bucket-name/data-prefix # Ensure this includes the bucket name
starrocksCnSpec:
resources:
requests:
cpu: 8
memory: 32Gi # Increased for stability on ARM
limits:
cpu: 8
memory: 32Gi
cnEnvVars:
- name: FE_QUERY_PORT # Tells CN to find FE on 8888
value: "8888"
storageSpec:
storageSize: 200Gi # Larger for Data Cache
storageMountPath: "/opt/starrocks/cn/storage"
config: |
# Mandatory for shared-data local cache
storage_root_path = /opt/starrocks/cn/storage
starlet_port = 9070
# Optimize cache usage (percentage of storageSpec)
starlet_star_cache_disk_size_percent = 80
4. Correct Karpenter/Node Labels
Your YAML had some URL-style formatting in the labels (likely from a copy-paste). They should be standard Kubernetes labels:
yaml
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "<http://karpenter.sh/capacity-type|karpenter.sh/capacity-type>" # Cleaned up
operator: In
values: ["spot"]
- key: "<http://kubernetes.io/arch|kubernetes.io/arch>"
operator: In
values: ["arm64"]
5. FEProxy Note
Your starrocksFeProxySpec uses tag: 1.28.0. Ensure you are using the official image starrocks/fe-proxy. If you are using the default Nginx-based proxy provided by the operator, it usually defaults to a compatible version; manual tagging is only needed if you have a custom security requirement.
Final Verification
After applying these:
1. Run ADMIN SHOW FRONTEND CONFIG LIKE 'query_port';. It should now return 8888.
2. Run SHOW BACKENDS; (or SHOW COMPUTE NODES;). Check the DataUsedCapacity column to ensure the local cache is being utilized.
References
• deployment/sr_operator.md
• deployment/shared_data/s3.md
• administration/management/FE_configuration.md
• deployment/plan_cluster.md
• using_starrocks/caching/block_cache.md
• deployment/environment_configurations.md
ReferencesRumit Jain
06/03/2026, 7:52 AMRocky
06/03/2026, 7:53 AMpersistentVolumeClaimRetentionPolicy depends on the component. For your CN nodes, the answer is generally Yes, keep it as Delete, but there are trade-offs to consider.
CN Nodes (Compute Nodes)
In shared-data mode, CN storage is used almost exclusively for Data Cache. Since your primary data is safely stored in S3, the EBS volume on a CN is essentially "expendable."
* Why Delete is recommended:
* Cost Management: If you are using Horizontal Pod Autoscaling (HPA), your CNs will scale up and down. If you set this to Retain, every time the cluster scales down, the EBS volumes will remain "orphaned" in your AWS account, and you will continue to pay for them even though no pod is using them.
* Avoiding Stale Cache: In rare cases (like cluster-level restores), old cache data can become "stale" or inconsistent with the new metadata. Starting with a fresh volume ensures the CN pulls the most up-to-date data from S3.
* The Trade-off (The "Cold Start"):
* If you delete the PVC, a new or restarted CN pod will start with a cold cache. The first few queries after a scale-up or rollout will be slower as the CN fetches data from S3 to populate the new EBS volume.
Recommended CN Policy:
yaml
starrocksCnSpec:
persistentVolumeClaimRetentionPolicy:
whenDeleted: Delete
whenScaled: Delete # Crucial for HPA to clean up EBS on scale-down
──────────
FE Nodes (Frontend)
Warning: You should not use Delete for FE nodes if you can avoid it.
FE nodes store the Metadata Catalog (using BDB JE). If you delete the PVCs for all FE nodes, you lose your entire database schema, user permissions, and table metadata.
* Why Retain is recommended: If a pod is accidentally deleted or the StatefulSet is recreated, you want the FE to reattach to its existing metadata volume to recover the cluster state.
Recommended FE Policy:
yaml
starrocksFESpec:
persistentVolumeClaimRetentionPolicy:
whenDeleted: Retain
Summary Table
Component | Storage Role | Recommended Policy | Reason
FE | Metadata (Critical) | Retain | Losing these volumes means losing the cluster metadata.
CN | Data Cache (Performance) | Delete | Saves money on EBS during auto-scaling; cache can be rebuilt from S3.
Note on Kubernetes Versions
The persistentVolumeClaimRetentionPolicy field is a feature of StatefulSet available in Kubernetes 1.27+ (Stable) or 1.23+ (Alpha/Beta). Ensure your EKS cluster version supports this before relying on it for automatic cleanup.
References
• deployment/sr_operator.md
• using_starrocks/caching/block_cache.md
• deployment/shared_data/s3.md
• administration/management/FE_configuration.md
• quick_start/helm.md
References
• deployment/sr_operator.md
• using_starrocks/caching/block_cache.md
• deployment/shared_data/s3.md
• administration/management/FE_configuration.md
• quick_start/helm.md
• deployment/plan_cluster.md
References
• using_starrocks/caching/block_cache.md
• deployment/sr_operator.md
• quick_start/helm.mdRocky
06/03/2026, 7:53 AMRumit Jain
06/03/2026, 8:00 AMRocky
06/03/2026, 8:00 AMpreStop hook. This tells StarRocks to stop sending new queries to the node and try to finish existing ones before the pod terminates.
yaml
# Add this to your starrocksCnSpec
lifecycle:
preStop:
exec:
command:
- /bin/bash
- -c
- |
# Notify FE to stop scheduling to this CN
# Replace <FE_IP> and <QUERY_PORT> or use a script that connects to the cluster
mysql -h $FE_HOST -P $QUERY_PORT -u root -e "ALTER SYSTEM DROP COMPUTE NODE '$MY_IP:9050';"
sleep 30 # Give existing queries a window to finish
2. Cache "Cold Start"
When a new Spot node replaces a reclaimed one, its local Data Cache (EBS/NVMe) will be empty.
* Effect: The first few queries touching data previously cached on the old node will be slower as they fetch data from S3.
* Mitigation: If your workload is sensitive to these spikes, you can use Persistent Volumes (PVCs) for the cache. If the pod is rescheduled quickly, it might reattach to the same EBS volume. However, most users accept the "cold start" and use Delete on their PVCs to save on EBS costs (as discussed earlier).
3. Availability Strategy
Never put all your CNs on Spot instances if you have strict SLA requirements.
* Best Practice: Use a "Mixed" approach. Keep a small "base" of On-Demand Graviton instances (e.g., 2 nodes) to handle baseline traffic, and use Spot for the auto-scaling "burst" nodes.
* Karpenter Config: You can configure Karpenter to prioritize Spot but fallback to On-Demand if Spot capacity for arm64 is unavailable.
Summary Checklist for Graviton Spot CNs
* [x] Architecture: Use run_mode = shared_data.
* [x] Image: Use a StarRocks version optimized for ARM (v3.3+).
* [x] Operator: Use a preStop hook to "Drop" the CN from the cluster.
* [x] Node Affinity: Ensure <http://kubernetes.io/arch|kubernetes.io/arch>: arm64 and <http://karpenter.sh/capacity-type|karpenter.sh/capacity-type>: spot are in your Helm values.
* [x] Scaling: Set minReplicas to at least 2 or 3 across multiple Availability Zones to minimize the impact of a single AZ-wide Spot reclamation.
References
• deployment/shared_data/s3.md
• introduction/Architecture.md
• administration/management/BE_configuration.md
• deployment/plan_cluster.md
• deployment/sr_operator.md
• quick_start/shared-data.md
References
• quick_start/shared-data.mdRocky
06/03/2026, 8:00 AMRumit Jain
06/03/2026, 8:05 AMRocky
06/03/2026, 8:05 AMJAVA_OPTS were applied correctly to the FE process, you can use any of the following three methods.
Since JAVA_OPTS are JVM-level arguments rather than internal StarRocks configuration parameters, they won't appear in the standard ADMIN SHOW FRONTEND CONFIG SQL output.
1. Check the Startup Logs (Recommended)
StarRocks FE prints the JVM startup arguments at the beginning of its standard output log.
bash
# Get the name of your FE pod
kubectl get pods -n fkt0 | grep fe
# View the fe.out log (the first ~50 lines will show the JVM arguments)
kubectl exec -it <fe-pod-name> -n fkt0 -- head -n 50 log/fe.out
What to look for: Look for a line starting with JVM arguments: or the listing of the command. You should see -Xmx6g and -XX:+UseG1GC in that list.
2. Check the running process inside the Pod
You can inspect the actual running Java process to see what flags the kernel is using.
bash
kubectl exec -it <fe-pod-name> -n fkt0 -- ps aux | grep java
What to look for: The output will show the full java command. Verify that it contains:
* -Dlog4j2.formatMsgNoLookups=true
* -Xmx6g
* -XX:+UseG1GC
3. Verify the Environment Variable
Since the StarRocks Operator injects these settings, you can check if the environment variable is present in the container's shell.
bash
kubectl exec -it <fe-pod-name> -n fkt0 -- env | grep JAVA_OPTS
4. Check the fe.conf file
In the Helm deployment, the configuration you provided is written into the fe.conf file inside the pod.
bash
kubectl exec -it <fe-pod-name> -n fkt0 -- cat conf/fe.conf | grep JAVA_OPTS
Troubleshooting
If you don't see the changes:
* Restart the Pods: If you updated the Helm values, the StarRocks Operator should trigger a rolling restart. If it didn't, try deleting the FE pods manually (kubectl delete pod ...) to force them to recreate with the new config.
* Operator Logs: If the pods aren't restarting, check the StarRocks Operator logs to see if there is a validation error in your YAML.
References
• administration/management/logs.md
• administration/management/FE_configuration.md
• deployment/sr_operator.md
• deployment/environment_configurations.md
References
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
• administration/management/BE_configuration.mdRumit Jain
06/03/2026, 8:33 AMRocky
06/03/2026, 8:33 AMps aux output and StarRocks best practices, this configuration is technically functional but risky for an 8GB Pod.
Here is the breakdown of why and how to adjust it:
1. The "70% Rule"
For systems with less than 32GB of total RAM, StarRocks recommends setting the JVM Heap (-Xmx) to no more than 70% of the available memory.
* Your setup: 6GB / 8GB = 75%
* Recommended max: 70% of 8GB = 5.6GB
2. Why 6GB might be too high
A Java process in Kubernetes doesn't just use the Heap. It also requires memory for:
* BDB JE Cache: StarRocks FE uses Berkeley DB for metadata, which consumes off-heap memory.
* Metaspace & Threads: JVM overhead, stack memory for hundreds of threads, and loaded classes.
* Direct Memory: Used for query parsing and network buffers.
* Container Overhead: The OS/container environment itself.
If the Heap + these overheads exceed 8GB, the Kubernetes OOM Killer will instantly restart the FE pod, causing cluster instability.
3. Production Recommendation
* Minimum Specs: For production environments, StarRocks officially recommends a minimum of 16GB RAM for FE nodes (even for small clusters with < 1M tablets).
* Immediate Action: If you must stay at 8GB, consider dropping Xmx to 5GB (-Xmx5g) to provide a safer buffer for the BDB metadata store and prevent random restarts.
4. How to Monitor if it's "OK"
Watch your pods for a few days. If you see the RESTARTS count increasing in kubectl get pods, run:
bash
kubectl describe pod <fe-pod-name> -n <namespace>
Look for Terminated: OOMKilled. If you see that, it confirms your Xmx is too high for the 8GB limit.
Summary:
If this is a Dev/Test environment with very little data, 6GB is likely fine. If this is Production, you should either increase the Pod limit to 12GB-16GB or lower the heap to 5GB to ensure stability.
References
• faq/Others.md
• knowledge/trouble_shooting/fe_memory_problems.md
• administration/management/FE_configuration.md
• deployment/environment_configurations.md
• faq/operation_maintenance_faq.md
References
• faq/Others.md
• knowledge/trouble_shooting/fe_memory_problems.md
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.mdRumit Jain
06/03/2026, 5:13 PMRocky
06/03/2026, 5:13 PMmax_user_connections)
By default, individual users often have a relatively low connection limit (in some versions, it defaults to 100).
* How to check:
sql
SHOW PROPERTY FOR 'root';
* How to change:
If you are running a production workload, it is highly recommended to increase this limit for your application users.
sql
-- Recommended production value is 1000
ALTER USER 'your_user' SET PROPERTIES ("max_user_connections" = "1000");
2. Global Node Connection Limit (qe_max_connection)
This is the total number of connections allowed across all users to a single FE node.
* Default: 4096 (in v3.1.12+ and v3.2.7+). In older versions, it was 1024.
* Configuration: This is an FE configuration parameter found in fe.conf.
* Recommended Value: 4096 is typically sufficient for most clusters. If you have many application instances and high concurrency, you can increase this, but ensure your FE has enough memory and file descriptors (ulimit -n).
3. Idle Connection Timeout (wait_timeout)
To prevent "connection leaks" where idle clients keep connections open forever, StarRocks uses a timeout.
* Default: 28,800 seconds (8 hours).
* Recommended: For many web applications, this is too long. You might want to lower it to 1 hour (3600s) to reclaim resources faster.
sql
SET GLOBAL wait_timeout = 3600;
Summary of Recommendations
Scope | Parameter | Recommended Value
Per User | max_user_connections | 1000
Global (FE) | qe_max_connection | 4096
Idle Timeout | wait_timeout | 3600 (1 hour)
Note: If you see the error Reach limit of connections, check both your application's connection pool settings and the max_user_connections property for that specific user.
References
• administration/management/resource_management/Query_management.md
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• deployment/post_deployment_setup.md
• administration/management/monitoring/alert.md
References
• deployment/environment_configurations.md
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• deployment/post_deployment_setup.mdRumit Jain
06/03/2026, 5:35 PMCaused by: io.vertx.mysqlclient.MySQLException:
{errorMessage=Reach user-level(qualifiedUser: sr_dml_user) connection limit,
currentUserMaxConn=1024,
connectionMap.size=1260,
connByUser.totConn=1260,
user.currConn=1024,
node=kube-starrocks-fe-2.kube-starrocks-fe-search.plattest03.svc.cluster.local:9010,
errorCode=1064,
sqlState=HY000}Rocky
06/03/2026, 5:35 PMsr_dml_user has hit its maximum allowed concurrent connections.
According to your log:
* Limit: 1024 (The maximum allowed for this specific user).
* Current Usage: 1260 (The total connection count being tracked).
Since 1260 > 1024, StarRocks is rejecting new connection attempts from your Vert.x application.
How to Fix
1. Increase the limit for this user
Run this SQL command as a root or admin user to double the limit (or set it to your desired value):
sql
-- Increase to 2048 (or higher if needed)
ALTER USER 'sr_dml_user' SET PROPERTIES ("max_user_connections" = "2048");
To verify the change was applied, run:
sql
SHOW PROPERTY FOR 'sr_dml_user';
2. Clean up idle connections
If your application isn't actually running 1000+ active queries, you likely have many "Sleep" (idle) connections taking up slots. You can reduce the time StarRocks keeps these alive:
sql
-- Reduce idle timeout to 1 hour (default is 8 hours)
SET GLOBAL wait_timeout = 3600;
3. Investigate the connection source
Use this command to see what those 1260 connections are doing. If you see hundreds of connections from the same IP in a Sleep state, your application's connection pool (Vert.x) might be configured too high or not closing connections properly.
sql
SHOW PROCESSLIST;
Why is it 1260 if the limit is 1024?
The connByUser.totConn=1260 in the error message indicates that while the enforcement kicked in at 1024, there are likely multiple Frontend (FE) nodes in your cluster. Each FE tracks connections independently, or there was a sudden burst of requests that exceeded the counter before the rejection could stop them all.
Recommendation: Increase the user limit to 2048 and check your application's connection pool settings to ensure they don't exceed this new exceed the total FE capacity (global limit qe_max_connection is usually 4096).
References
• administration/management/resource_management/Query_management.md
• faq/operation_maintenance_faq.md
• administration/management/FE_configuration.md
• administration/management/monitoring/alert.md
References
• administration/management/resource_management/Query_management.md
• faq/operation_maintenance_faq.md
• administration/management/FE_configuration.md
• administration/management/monitoring/alert.md
References
• faq/operation_maintenance_faq.md
• administration/management/monitoring/alert.md
• knowledge/usage/best-practice.md
• administration/management/resource_management/Query_management.md
• faq/loading/Loading_faq.md
• administration/management/FE_configuration.mdRumit Jain
06/03/2026, 5:40 PMRocky
06/03/2026, 5:41 PMSleep: This means the connection is open but currently doing nothing. It is waiting for the client to send a new query.
* Time: 4384: This connection has been sitting idle for 73 minutes.
* Info: SELECT 1: This was the last command run. It is a common "heartbeat" or validation query used by connection pools (like Vert.x or HikariCP) to make sure the connection is still alive.
* The Issue: Because StarRocks has a default 8-hour (28800 seconds) idle timeout, these connections stay open until they hit that limit, eventually exhausting your max_user_connections (1024).
──────────
How to resolve this
1. Reduce the StarRocks Idle Timeout (Immediate Fix)
Lower the wait_timeout so StarRocks automatically closes connections that have been idle for too long (e.g., 30 minutes instead of 8 hours).
sql
-- Set to 1800 seconds (30 minutes)
SET GLOBAL wait_timeout = 1800;
Existing idle connections will be closed once their "Time" exceeds 1800.
2. Adjust your Vert.x Application Pool
Since you are using the Vert.x MySQL client, your application is likely creating more connections than it needs and not releasing them. Check these settings in your code:
* maxPoolSize: If this is set to 1024 or higher across multiple application pods, you will hit the limit. Reduce this to a smaller number (e.g., 50–100 per pod).
* idleTimeout: Set this to a value lower than the StarRocks wait_timeout. For example, if you set StarRocks to 30 mins, set Vert.x to 10-20 mins.
3. Verify Connection Closure
Ensure your application code is properly returning connections to the pool or closing them in a finally block / onComplete handler. If you create a new client for every request without closing it, you will quickly "leak" connections into a Sleep state.
Summary:
The "Sleep" connections are "camping" on your available slots. Lowering wait_timeout to 1800 is the fastest way to reclaim those slots, but you should also reduce the maxPoolSize in your Vert.x configuration.
References
• faq/operation_maintenance_faq.md
• sql-reference/System_variable.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• faq/Sql_faq.md
References
• faq/operation_maintenance_faq.md
• sql-reference/System_variable.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• faq/Sql_faq.md
• administration/management/FE_configuration.md
• administration/management/resource_management/Query_management.md
• deployment/post_deployment_setup.md
References
• faq/Sql_faq.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• faq/operation_maintenance_faq.mdRumit Jain
06/03/2026, 5:42 PMRocky
06/03/2026, 5:43 PMSELECT 1 queries you see are almost certainly not intentional business logic written by your developers. Instead, they are heartbeat/validation queries automatically triggered by your application's connection pool (in this case, the Vert.x MySQL client).
Why this is happening:
1. Connection Validation: Most connection pools (Vert.x, HikariCP, Druid, etc.) run a tiny query like SELECT 1 to verify that a connection is still "alive" before handing it to your application code.
2. Keep-Alive: Pools often send this query periodically to prevent the database or a network firewall from closing an idle connection.
3. The "Sleep" Status: In your SHOW PROCESSLIST output, the Command: Sleep combined with Info: SELECT 1 means:
* The pool sent SELECT 1 to test the connection.
* The test succeeded.
* The connection is now sitting idle in the pool, waiting for your app to use it.
Is it a problem?
While the query itself is harmless and extremely lightweight, the number of connections it leaves behind is the issue. Because StarRocks keeps connections open for 8 hours by default (wait_timeout), your pool is likely filling up with these "validated" but idle connections until you hit the 1024 limit.
Recommended Actions:
* Application Side: Check your Vert.x configuration. Look for settings like test-on-borrow or a validation query. If you have a very high maxPoolSize, reduce it to match your actual needs.
* StarRocks Side: As mentioned previously, reduce wait_timeout to something like 3600 (1 hour) or 1800 (30 mins). This forces StarRocks to prune these "Sleeping" connections much faster if the application pool isn't using them.
sql
-- Reclaim slots faster by timing out idle connections after 30 mins
SET GLOBAL wait_timeout = 1800;
References
• faq/operation_maintenance_faq.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• sql-reference/System_variable.md
• administration/management/resource_management/Query_management.md
• deployment/post_deployment_setup.md
References
• faq/operation_maintenance_faq.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• sql-reference/System_variable.md
• administration/management/resource_management/Query_management.md
• deployment/post_deployment_setup.mdRumit Jain
06/03/2026, 5:45 PMRocky
06/03/2026, 5:45 PMSleep state (as seen in your SHOW PROCESSLIST), increasing the limit is a "band-aid" fix that will eventually result in the same error once the new limit is reached.
Here is the strategic recommendation:
1. Fix the "Sleep" buildup first (Highly Recommended)
Since your connections are sitting idle for over 70 minutes, StarRocks is holding those slots open unnecessarily.
* Reduce `wait_timeout`: Set this to 30 minutes (1800) or 1 hour (3600). This will automatically prune those idle Vert.x connections and free up slots for new ones.
sql
SET GLOBAL wait_timeout = 1800;
2. When to increase the limit
You should increase the limit if:
* You have many application pods (e.g., 20+ pods) and each has a maxPoolSize of 50-100. In this case, 1024 is simply too low for your architecture.
* Your application legitimately runs hundreds of concurrent DML operations at the exact same time.
If you decide to increase it, set it to 2048:
sql
ALTER USER 'sr_dml_user' SET PROPERTIES ("max_user_connections" = "2048");
3. Check the Global FE Limit
If you increase the user limit beyond 1024, ensure the StarRocks Frontend (FE) itself can handle it.
* Older versions of StarRocks had a global limit (qe_max_connection) of 1024.
* Newer versions (v3.1.12+, v3.2.7+) default to 4096.
If you are on an older version, you may also need to update the FE configuration in `fe.conf`:
properties
qe_max_connection = 4096
(Changing this requires an FE restart.)
Summary Recommendation
Do not just increase the limit. First, reduce wait_timeout to 1800. If the errors persist after that, then second, increase the user's max_user_connections to 2048. This ensures you are solving the resource leak while also providing enough headroom for growth.
References
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• sql-reference/System_variable.md
• administration/management/resource_management/Query_management.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
References
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• sql-reference/System_variable.md
• administration/management/resource_management/Query_management.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
References
• administration/management/FE_configuration.md
• sql-reference/System_variable.md
• administration/management/resource_management/query_queues.md
• deployment/environment_configurations.md
• administration/management/BE_configuration.mdRumit Jain
06/04/2026, 1:24 AMwait_timeout of 28800 seconds (8 hours).Rocky
06/04/2026, 1:24 AMwait_timeout)
This shows how long StarRocks will wait for an idle connection before closing it.
sql
SHOW VARIABLES LIKE 'wait_timeout';
* Default: 28800 (8 hours).
* Goal: If you see a lot of "Sleep" connections, you likely want this to be lower (e.g., 1800 or 3600).
2. Check a User's Connection Limit
To see the specific limit assigned to the user experiencing the issue (e.g., sr_dml_user):
sql
SHOW PROPERTY FOR 'sr_dml_user' LIKE 'max_user_connections';
* If this property isn't set, the user defaults to the global limit or a system default (often 1024).
3. Check Current Connection Count
To see how many connections are currently active or sleeping, run:
sql
SHOW PROCESSLIST;
To get a quick count of connections per user:
sql
-- This requires scanning the processlist;
-- manually you can just count the rows in the output above.
4. Check Global FE Connection Limit
The Frontend (FE) has a global limit for all combined users. You can check this via:
sql
-- Check the variable (if available in your version)
SHOW VARIABLES LIKE 'qe_max_connection';
-- OR check the FE configuration directly
ADMIN SHOW FRONTEND CONFIG LIKE 'qe_max_connection';
Summary of what to look for:
* If wait_timeout is 28800 and your SHOW PROCESSLIST has many rows where Time is high (e.g., > 4000) and Command is Sleep, then the 8-hour timeout is definitely why your connection slots are being exhausted.
References
• sql-reference/System_variable.md
• faq/operation_maintenance_faq.md
• administration/management/resource_management/Query_management.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• administration/management/resource_management/query_queues.md
References
• sql-reference/System_variable.md
• faq/operation_maintenance_faq.md
• administration/management/resource_management/Query_management.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• administration/management/resource_management/query_queues.md
• using_starrocks/running_queries.md
• administration/management/FE_configuration.md
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• administration/management/resource_management/query_queues.md
• administration/management/resource_management/Query_management.mdRumit Jain
06/04/2026, 1:25 AMRocky
06/04/2026, 1:26 AMsr_dml_user is hitting its specific limit of 1024, while your StarRocks cluster is capable of handling up to 4096 total connections. Because your wait_timeout is set to 8 hours, connections are staying "alive" in a Sleep state long after your application has finished with them, filling up those 1024 slots.
I recommend taking the following two steps to resolve this:
1. Reduce the Idle Timeout (Immediate Relief)
Shorten the wait_timeout so StarRocks automatically closes idle connections after 30 minutes instead of 8 hours. This will "recycle" your connection slots much faster.
sql
SET GLOBAL wait_timeout = 1800;
Note: This affects new connections. Existing sleeping connections will still follow the old 8-hour timeout until they naturally expire or are killed.
2. Increase the User's Connection Limit
Since your global capacity (qe_max_connection) is 4096, you have plenty of room to allow this specific user more than 1024 connections. I recommend doubling it to 2048:
sql
ALTER USER 'sr_dml_user' SET PROPERTIES ("max_user_connections" = "2048");
Why this is the best path:
* Safety: You aren't changing the global cluster limit (which is already high enough at 4096).
* Efficiency: Reducing wait_timeout ensures your FE memory isn't wasted holding onto thousands of "Sleeping" connections from your Vert.x pool that are no longer being used.
* Capacity: Increasing the user property to 2048 gives your application room to grow without hitting the wall again immediately.
References
• sql-reference/System_variable.md
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• administration/management/resource_management/Query_management.md
References
• sql-reference/System_variable.md
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• administration/management/resource_management/Query_management.md
• sql-reference/sql-statements/account-management/ALTER_USER.mdRumit Jain
06/04/2026, 1:41 AMRocky
06/04/2026, 1:41 AMwait_timeout to 30 minutes in the current cluster. It is a safe and recommended operation.
Here is exactly what will happen to your connections:
1. Existing "Sleep" Connections
By default, nothing happens to them immediately.
In StarRocks (consistent with MySQL behavior), SET GLOBAL only applies to new connections created after the command is run. Your current connections that are already "sleeping" will still hold their original 8-hour timeout.
2. How to apply it to the current "Sleepers"
To force the existing connections to adopt the new 30-minute limit (or to clear them out), you have two options:
* Option A: The REFRESH CONNECTIONS command (Recommended)
If you are on a recent version (v3.1+), you can run this after setting the global variable. it tells all existing connections to pull the new global values:
sql
SET GLOBAL wait_timeout = 1800;
REFRESH CONNECTIONS;
Once refreshed, any connection that has already been idle for more than 1800 seconds will be closed by the server.
* Option B: Manually Kill the Oldest Connections
If REFRESH CONNECTIONS is not available, you can manually kill the connections that have been sleeping for too long. Find the IDs using SHOW PROCESSLIST and run:
sql
KILL <connection_id>;
3. New Connections
Any new connection created by your Vert.x application after you run SET GLOBAL wait_timeout = 1800; will automatically inherit the 30-minute timeout.
Summary of the plan:
1. Run SET GLOBAL wait_timeout = 1800;.
2. Run REFRESH CONNECTIONS; to apply it to the current 1024 connections.
3. The FE will then automatically begin closing those "Sleep" connections that have exceeded the 30-minute mark, instantly freeing up slots for your application.
References
• sql-reference/System_variable.md
• sql-reference/sql-statements/cluster-management/config_vars/REFRESH_CONNECTIONS.md
• faq/operation_maintenance_faq.md
• sql-reference/sql-statements/cluster-management/nodes_processes/KILL.md
• administration/management/resource_management/Query_management.md
References
• sql-reference/System_variable.md
• sql-reference/sql-statements/cluster-management/config_vars/REFRESH_CONNECTIONS.md
• faq/operation_maintenance_faq.md
• sql-reference/sql-statements/cluster-management/nodes_processes/KILL.md
• administration/management/resource_management/Query_management.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
References
• sql-reference/sql-statements/cluster-management/nodes_processes/KILL.md
• administration/management/resource_management/Query_management.md
• faq/operation_maintenance_faq.mdRocky
06/04/2026, 1:41 AMRumit Jain
06/04/2026, 1:44 AMRocky
06/04/2026, 1:44 AMmaxLifetime to Server wait_timeout
The most common cause of "connection leak" symptoms is a mismatch between the client's connection pool and the database.
* The Rule: Your client-side maxLifetime must be shorter than the StarRocks wait_timeout.
* Recommendation: If you set StarRocks wait_timeout to 30 minutes (1800s), set your client pool's maxLifetime to 25 minutes. This ensures the client retires the connection gracefully before the server kills it, preventing "broken pipe" errors.
2. Optimize Connection Pool Sizing
In Vert.x, check your MySQLConnectOptions or `PoolOptions`:
* Don't over-allocate: If your app only processes 100 concurrent requests, a pool of 500 is wasteful.
* Idle Timeout: Set idleTimeout in your Vert.x pool options to a low value (e.g., 5-10 minutes) so the client closes its own idle connections without waiting for StarRocks to do it.
3. Use Stream Load for DML (instead of SQL Inserts)
If your sr_dml_user is performing high-frequency INSERT statements, you should consider switching to Stream Load via HTTP.
* Why: JDBC inserts create a new transaction/connection state for every batch. Stream Load is an HTTP-based push that is significantly more efficient for StarRocks and doesn't consume the MySQL protocol connection slots (max_user_connections).
* Vert.x approach: Use WebClient to PUT data to the FE's Stream Load endpoint.
4. Client-Side Load Balancing
If you have multiple FEs, do not hardcode a single FE IP.
* JDBC: Use the load balancing syntax to distribute connections across all FEs:
text
jdbc:mysql:<loadbalance://fe1:9030,fe2:9030/db?loadBalanceBlacklistTimeout=5000>
* Proxy: Use a load balancer (like F5, HAProxy, or ProxySQL) to handle the connections. This allows the application to connect to one "virtual" IP while the proxy manages the pool to StarRocks.
5. Proper Resource Cleanup
Ensure your Vert.x code is consistently closing connections in finally blocks or using the reactive withConnection pattern:
java
// Vert.x Example
pool.withConnection(conn -> {
return conn.query("...").execute();
}).onComplete(ar -> {
// Connection is automatically returned to pool here
});
If you manually acquire a connection with pool.getConnection(), failing to call connection.close() will leak a "Sleep" connection until the wait_timeout finally kills it.
6. Enable useConfigs=maxPerformance
In your JDBC string, add:
text
&useConfigs=maxPerformance&rewriteBatchedStatements=true
This reduces the overhead of metadata queries that some drivers run every time a connection is pulled from the pool.
References
• administration/management/resource_management/Load_balance.md
• administration/management/FE_configuration.md
• loading/StreamLoad.md
• faq/operation_maintenance_faq.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
References
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• quick_start/shared-data.md
• quick_start/shared-nothing.mdRocky
06/04/2026, 1:44 AMRumit Jain
06/04/2026, 1:48 AMRocky
06/04/2026, 1:49 AMkube-starrocks-fe-service:9030, Kubernetes randomly (or via round-robin) picks one of your 3 FE pods.
* The Benefit: Your 1,024-connection limit per user is actually per FE. Since you have 3 FEs, your application effectively has a total capacity of 3,072 connections (1,024 × 3) across the cluster, provided the load is balanced evenly.
* The Risk: If your connection pool is "sticky" or doesn't rotate, one FE might end up with 1,024 connections (hitting the limit) while the others are empty.
2. Stream Load and the "FE-Proxy"
If your application team is doing Stream Load (HTTP PUT to port 8030) instead of just SQL:
* Standard K8s Services can sometimes cause issues with the 307 Redirects that StarRocks uses for Stream Load (where an FE tells the client to send data to a specific BE).
* In the StarRocks Operator/Helm chart, there is a component called FE-Proxy. It is specifically designed to handle these redirects and provide a stable entry point for high-performance loading. If your team starts doing heavy data loading, look into enabling starrocksFeProxySpec.
3. Monitoring Connection Distribution
To see if your K8s service is distributing connections evenly, you should check the connection count on each individual FE pod. Run this on each FE:
sql
-- Run this on each FE pod individually to see how many connections it's holding
SHOW PROCESSLIST;
If you see one FE has ~1000 connections and others have ~100, your K8s service isn't balancing effectively (this can happen with long-lived connections).
Recommended Improvements
* Keep the Service: It’s the right way to handle pod failover. If one FE pod dies, K8s removes it from the service automatically.
* Application Side: Use the JDBC load-balancing URL if possible (even within K8s). Instead of pointing to the service, you can point to the individual pod DNS names (e.g., fe-0.fe-search.ns, fe-1.fe-search.ns). This allows the JDBC driver to handle failover and balancing more intelligently than the basic K8s L4 logic.
Summary: Your approach is correct. The issues you are seeing with wait_timeout and max_user_connections are standard StarRocks configuration tunings that apply regardless of whether you use EKS or bare metal.
References
• deployment/sr_operator.md
• quick_start/helm.md
• administration/management/resource_management/Load_balance.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
References
• deployment/sr_operator.md
• quick_start/helm.md
• administration/management/resource_management/Load_balance.mdRumit Jain
06/04/2026, 2:31 AMRocky
06/04/2026, 2:32 AMBE CPU Idle | Idle < 10% for 30s | Indicates CPU bottleneck on BE nodes.
| BE Mem | Usage > 90% | Defaults to 90% of server RAM via mem_limit.
| Disk Avail | Free < 20% | Critical for high-volume loading; prevents BE from going offline.
| FE JVM Heap | Usage >= 80% | High heap usage can lead to long GC pauses or FE OOM.
Availability | FE Service | count(up{group="fe"}) < 3 | Alert if the number of active FEs drops.
| BE Service | node_info{state="dead"} > 0 | Alert if any BE node goes offline.
Performance | FE Query QPS | Increase > 100% in 1m | Detects sudden spikes in application traffic.
| Txn Failed | Failure Rate > 5% | Indicates loading issues (Stream Load, Routine Load, etc.).
2. Monitoring Connection Limits (Max Connections)
To track connection exhaustion (the issue you've been seeing), StarRocks provides specific connection metrics.
* Alerting on Connection Count:
Use this PromQL to alert when a user is nearing their limit (default limit is usually 100 or 1024):
bash
sum(starrocks_fe_connection_total{job="$job_name"}) by (user) > 90
This metric tracks current active connections per user. If this value stays consistently high, your application may be leaking connections or your pool size is too large.
* Requirements: To get user-level breakdown in Prometheus, you must configure your scrape job to include the user labels. Add this to your `prometheus.yml`:
yaml
params:
with_user_connections: ['all']
3. Monitoring Automated Snapshots (BACKUP/RESTORE)
StarRocks uses the BACKUP and RESTORE commands for snapshots to remote storage (S3/EKS).
* Active Job Tracking: Use starrocks_fe_unfinished_backup_job.
* Alert Logic: If you have an automated process that runs a backup daily, you can alert if unfinished_backup_job remains at 0 during your scheduled window (job didn't start) or if it stays at 1 for an abnormally long time (job hung).
* Failure Detection:
Currently, there is no direct "failed_backup_total" counter in the standard Prometheus exporter. To track failures, it is recommended to:
1. Monitor Logs: Alert on the string BACKUP with status FAILED in the fe.log.
2. SQL Monitoring: Use an external exporter or script to query SHOW BACKUP and alert if the State of the latest entry is FINISHED but the Message or Result indicates an error.
Quick Tips for EKS
Since you are on EKS, ensure your Prometheus configuration also monitors K8s Persistent Volume (PV) capacity for your FE metadata (/meta) and BE storage (/storage), as running out of disk space on the FE metadata partition can corrupt the cluster.
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.md
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• administration/management/Backup_and_restore.md
• faq/Exporting_faq.mdRocky
06/04/2026, 2:32 AMRocky
06/04/2026, 2:53 AMsum(starrocks_fe_connection_total) by (user) > 90 | Triggers when any user reaches 90% of their max_user_connections (default 100 or 1024).
Total FE Connections | starrocks_fe_connection_total > 4000 | High total connections on an FE can lead to thread exhaustion.
FE Thread Count | starrocks_fe_thread_num_total > 1000 | Monitor the number of active threads in the FE JVM.
Note: To get per-user connection metrics, ensure your Prometheus scrape config includes params: { with_user_connections: ["all"] }.
──────────
2. Automated Snapshot & Backup Alerts
StarRocks does not have a "failed_backup_total" counter. Instead, you monitor the state of the jobs:
Metric Name | PromQL / Alert Condition | Description
Unfinished Backup Jobs | starrocks_fe_unfinished_backup_job > 0 | Indicates a backup is currently running.
Stuck Backup Alert | starrocks_fe_unfinished_backup_job > 0 for 2 hours| Alert if a snapshot has been running for an abnormally long time, which usually indicates it is hung or the remote repository (S3) is unreachable. No Successful Backup | (Custom Script/Log) | Since there is no "last_success_timestamp" metric, most users alert on the absence of a
FINISHED status in the FE logs or via a sidecar script querying SHOW BACKUP.
──────────
3. FE-Proxy & CN Metrics
* FE-Proxy (Nginx-based): If you are using the Operator's FE-Proxy, it is an Nginx-based redirector. You should monitor its availability using the standard Kubernetes up metric or its specific service port (default 8080).
* CN (Compute Nodes): CNs use the same metrics as BEs (prefixed with starrocks_be_), but they will report 0 for disk-related storage metrics since they are stateless.
──────────
4. Recommended Alert Thresholds
Category | Metric | Alert Threshold | Severity
Service | up{group="fe"} | count < 3 | Critical
| node_info{state="dead"} | count > 0 | Critical
Resource | BE CPU Idle | < 10% for 30s | Warning
| BE Mem Usage | > 90% of mem_limit | Warning
| FE JVM Heap | > 80% usage | Warning
| Disk Available | < 20% free | Critical
Internal | Meta Log Count | > 100,000 | Warning (Checkpoint Failure)
| Compaction Score | > 800 | Warning (Write Stall Risk)
Troubleshooting "Max Connections"
If the starrocks_fe_connection_total alert fires:
1. Run SHOW PROCESSLIST; to identify "Sleep" connections.
2. Check if the application is leaking connections (not closing them).
3. Verify if the K8s FE-Proxy or Service is concentrating all connections on one FE instead of distributing them across all three.
4. Temporarily increase the limit: ALTER USER 'user' SET PROPERTIES ("max_user_connections" = "2000");.
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/BE_configuration.md
• administration/management/monitoring/alert.mdRumit Jain
06/04/2026, 2:56 AMstarrocks_fe_unfinished_backup_job one for each FE node. Does that mean that each FE pod is taking the snapshot and filling up the S3 bucket?Rocky
06/04/2026, 2:56 AMstarrocks_fe_unfinished_backup_job = 1 to Prometheus.
2. S3 Bucket Safety
You are not filling up your S3 bucket three times.
* Only the Leader FE writes the metadata file to S3.
* The BEs (or CNs) upload the actual data files directly to S3. Even though you have multiple CNs, they collaborate on a single set of backup files; they do not duplicate the work.
3. How to verify which node is the Leader
If you want to confirm which pod is currently driving the backup, you can run:
sql
SHOW FRONTENDS;
Look for the node where the Role is LEADER. That is the only pod actively managing the snapshot.
Summary for your Alerts
When setting up your Prometheus alert, you should use an aggregation to avoid getting three separate alerts for the same job:
* Recommended Alert: max(starrocks_fe_unfinished_backup_job) > 0
* Interpretation: If the max is 1, a backup is running. If it stays at 1 for longer than your typical backup window (e.g., max(starrocks_fe_unfinished_backup_job) > 0 for 4 hours), then you should investigate a hung job.
References
• administration/management/Backup_and_restore.md
• administration/cluster_snapshot.md
• administration/Meta_recovery.md
• administration/management/monitoring/metrics.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_FRONTENDS.md
References
• administration/management/Backup_and_restore.md
• administration/cluster_snapshot.md
• administration/Meta_recovery.md
• administration/management/monitoring/metrics.md
References
• administration/cluster_snapshot.md
• faq/Exporting_faq.md
• deployment/shared_data/s3.md
• administration/management/Backup_and_restore.mdRumit Jain
06/04/2026, 3:06 AMstarrocks_fe_thread_num_totalRocky
06/04/2026, 3:07 AMstarrocks_fe_thread_pool_* metrics instead of starrocks_fe_thread_num_total, it is likely because your version or exporter configuration uses the internal RPC and task thread pool metrics rather than a single global counter.
For monitoring connection and thread-related exhaustion, here is how to use the metrics you have:
1. Monitoring MySQL Connections (The "Max Connection" Issue)
The "Max Connection" error usually refers to the MySQL protocol limit. The metric for this is typically:
* Metric: starrocks_fe_connection_total
* Alert Rule: starrocks_fe_connection_total > 800 (assuming your max_connections is 1024).
* Per-User Alert: If you have enabled user-level metrics, use sum(starrocks_fe_connection_total) by (user).
2. Monitoring the FE Thread Pools
The starrocks_fe_thread_pool metrics you see refer to internal FE task pools (like those used for metadata operations or internal RPCs). Use these to detect if the FE itself is becoming unresponsive:
Metric Name | What it indicates | Alert Threshold
starrocks_fe_thread_pool_wait | Threads waiting to get a connection/task. | > 0 for 5m (indicates a backlog)
starrocks_fe_thread_pool_active | Currently busy threads in the pool. | Close to the pool size (usually 100-200)
starrocks_fe_thread_pool_idle | Available capacity in the pool. | == 0 (indicates pool is saturated)
3. Monitoring JVM Threads
Since StarRocks FE runs on the JVM, you may also see general JVM thread metrics. If starrocks_fe_thread_num_total is missing, look for:
* Metric: jvm_thread{type="count"} or starrocks_fe_jvm_thread_count
* Usage: This tracks the total number of OS threads the FE process has spawned. A healthy FE usually stays between 300 and 1000 threads. If it spikes toward 4000+, you are likely hitting an OS thread limit or a major connection leak.
Summary: Which one should you alert on?
1. For "Too many connections" errors: Alert on starrocks_fe_connection_total.
2. For "FE becoming slow/unresponsive": Alert on starrocks_fe_thread_pool_wait > 5.
3. For "System-level thread exhaustion": Alert on jvm_thread > 2000.
Note: If you want to check your actual max_connections limit to set your thresholds correctly, run:
sql
SHOW VARIABLES LIKE 'max_connections';
-- and for specific users
SHOW PROPERTY FOR 'username' LIKE 'max_user_connections';
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• administration/management/resource_management/Query_management.md
References
• administration/management/monitoring/metrics.mdRumit Jain
06/04/2026, 3:26 AMRocky
06/04/2026, 3:26 AMSELECT 1 and a state of EOF is a classic sign of connection pool "keep-alive" or "validation" overhead.
Here is what you should investigate on the client side (application level) and the proxy level:
1. Connection Pool Validation (The SELECT 1 Mystery)
The SELECT 1 in your process list indicates that your application's connection pool (e.g., HikariCP, Druid, or DBCP) is sending "heartbeat" queries to ensure the connection is still alive.
* The Issue: If your minIdle (minimum idle connections) is set too high, the pool will keep hundreds of connections open and constantly "poke" StarRocks with SELECT 1.
* What to check:
* `minIdle`: Set this to a lower value (e.g., 5-10) rather than keeping it equal to maxPoolSize.
* `maxLifetime`: Ensure your client-side "maximum connection lifetime" is shorter than the StarRocks wait_timeout (default 8 hours). We recommend setting client maxLifetime to around 30 minutes to ensure connections are recycled before the server or proxy kills them.
* `idleTimeout`: Lower the time a connection can sit idle in the pool before being retired.
2. FE-Proxy (Nginx/HAProxy) Timeouts
Since you are using FE-Proxy, there is a middleman between your app and the FE nodes.
* EOF State: The State: EOF in your process list often suggests the FE is waiting for data but the proxy or client has already moved toward closing the socket.
* Timeout Mismatch: If the FE-Proxy (Nginx) has a keepalive_timeout of 60 seconds, but your Java application thinks the connection is good for 30 minutes, the application will try to use a "dead" connection, or the proxy will leave "orphaned" sessions on the FE.
* Action: Ensure wait_timeout (StarRocks), Proxy Timeout (Nginx), and maxLifetime (App) are aligned.
* Rule of thumb: App Max Lifetime < Proxy Timeout < StarRocks wait_timeout.
3. Client Leakage
If the number of Sleep connections continues to grow and never drops, your application might not be calling .close() on its database connections or JDBC objects.
* What to check: Search your code for any place where a Connection, Statement, or ResultSet is opened but not wrapped in a try-with-resources block.
4. Adjusting StarRocks Server-Side
If your application genuinely needs high concurrency but you want to clean up these "Sleep" sessions faster, you can reduce the idle timeout globally in StarRocks:
sql
-- Reduce idle timeout to 1 hour (default is 8 hours)
SET GLOBAL wait_timeout = 3600;
SET GLOBAL interactive_timeout = 3600;
Summary Checklist for Client Side:
1. Reduce minIdle in your JDBC pool configuration.
2. Set maxLifetime to 1800000ms (30 minutes).
3. Check FE-Proxy logs for "upstream timed out" errors which correlate with those EOF states.
4. Use SHOW PROCESSLIST to see which specific client IP (Host column) is creating the most Sleep connections to isolate the misbehaving microservice.
References
• faq/operation_maintenance_faq.md
• sql-reference/System_variable.md
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/resource_management/Query_management.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
References
• faq/operation_maintenance_faq.md
• sql-reference/System_variable.mdRumit Jain
06/04/2026, 3:55 AMRocky
06/04/2026, 3:56 AMuser.
* With unique users: You can guarantee Application A gets 40% of the CPU and Application B gets 10% by binding each user to a specific resource group.
* With a shared user: StarRocks cannot distinguish between the two applications, so a single heavy query from App B could impact the performance of App A.
2. Auditability and Troubleshooting
As seen in your previous issue with the high number of Sleep connections, having unique users makes troubleshooting much easier.
* Audit Logs: In the fe.audit.log, every query is tagged with a User. If you see a spike in slow queries or system load, you can instantly see which application is responsible.
* Process List: If you run SHOW PROCESSLIST, you can see exactly which service is holding open hundreds of idle connections.
3. Connection Management
StarRocks allows you to set limits on a per-user basis to protect the cluster's stability:
* `max_user_connections`: You can prevent a buggy application from accidentally opening 1,000 connections and crashing the FE, while still allowing other applications to connect.
sql
-- Limit one specific app to 100 connections
ALTER USER 'app_search'@'%' SET PROPERTY 'max_user_connections' = '100';
4. Security (Principle of Least Privilege)
Using a per-application user allows you to follow the security principle of "least privilege":
* Application A (Reporting): Needs only SELECT on db1.
* Application B (ETL/DML): Needs INSERT and DELETE on db1.
* Risk Mitigation: If the credentials for Application A are compromised, the attacker cannot delete data or access other databases because that user lacks those specific roles/privileges.
Summary Recommendation
Scenario | Best Practice
User Identification | Create one user per microservice/application (e.g., srv_orders_api, srv_bi_dashboard).
Permissions | Create Roles (e.g., role_read_only, role_etl_developer) and grant those roles to the application users.
Control | Bind those users to Resource Groups to ensure performance stability.
References
• administration/user_privs/authorization/User_privilege.md
• administration/management/resource_management/resource_group.md
• best_practices/authentication_authorization.md
• sql-reference/sql-statements/account-management/ALTER_USER.md
References
• faq/resource_isolation_faq.md
• administration/management/resource_management/resource_group.mdRumit Jain
06/04/2026, 7:21 AMRocky
06/04/2026, 7:21 AMmax-pool-size to be large enough to handle your average concurrency, and your wait-queue to be small (e.g., 2x-3x the pool size) to fail fast rather than creating a massive backlog of slow requests.
2. Connection Timeout (10,000ms)
Your timeout is 10 seconds.
* In high-concurrency systems, 10 seconds is quite long for a user to wait for a connection. Most modern microservices set this closer to 3,000ms - 5,000ms.
_ If you keep it at 10s while having a queue of 500, you are essentially telling your application: _"It's okay to make the user wait 10 seconds for a response during a bottleneck."*
3. Relation to your "Sleep" connections
If you have 20 connections per pod and you have, for example, 10 pods, you are opening 200 connections to StarRocks.
* If those connections are showing up as Sleep in SHOW PROCESSLIST, it means your application has successfully grabbed a connection from the pool but is not currently running a query.
* The Mismatch: If your StarRocks FE is showing many Sleep connections while your client application is complaining about the Wait Queue being full, it often means:
1. Connection Leak: Your code is getting a connection but not calling .close() to return it to the pool.
2. Thread Starvation: Your application's internal thread pool (not the DB pool) is stuck, so it’s holding the DB connection "checked out" while it does other slow work.
Improved Configuration Recommendation
If you are using a standard framework (like Spring Boot with HikariCP or Quarkus/Vert.x), consider these adjustments:
Parameter | Recommended Change | Reason
Max Pool Size | 30 - 50 | Increase slightly if your StarRocks FE has capacity (check qe_max_connection).
Max Wait Queue | 50 - 100 | Don't let 500 requests pile up. It's better to return an "Overloaded" error quickly than to have 500 threads waiting for 10 seconds.
Connection Timeout | 3,000ms | Fail faster so your upstream load balancer or user can retry or see a clear error.
Max Lifetime | 1,800,000ms (30m) | Ensure client connections are younger than StarRocks wait_timeout.
Summary
Your current settings allow for a massive backlog (500) that can lead to long tail latencies and timeout errors under load. You should either increase the pool size to match your expected peak concurrency or decrease the wait queue to force the application to handle overload more gracefully.
References
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• administration/management/resource_management/Query_management.md
• deployment/environment_configurations.md
ReferencesRumit Jain
06/04/2026, 12:31 PMRocky
06/04/2026, 12:31 PMconnections = (CPU cores * 2) + Disk Count.
* For StarRocks: Since StarRocks handles hundreds of concurrent queries easily, a pool of 20–50 per application pod is standard. If you have many application pods (e.g., 20 pods), you are already hitting the FE with 400–1000 connections.
* If the queue stays full: Increasing the pool from 20 to 50 might help, but only if your FE has the headroom (check qe_max_connection in StarRocks, default is often 1024 or higher).
3. Monitoring the "Borrow Wait"
Instead of a fixed ratio, you should monitor the Connection Borrow Wait Time in your application metrics (e.g., Prometheus/Micrometer).
* Healthy: Average wait time < 10ms.
* Warning: Average wait time > 100ms (this means your pool is too small).
* Critical: Wait time hitting your 10,000ms timeout (this is what you are likely seeing).
4. Connection to your "Sleep" issue
If your Wait Queue is full (500/500) but StarRocks shows your connections are Sleep/EOF:
* Thread Starvation: Your application might have run out of worker threads, so it’s not even trying to use the DB connections it has.
* Connection Leak: Your code is taking a connection from the pool but failing to call .close(). The pool thinks all 20 are "in use," so it forces everyone else into the 500-person wait queue, but the FE sees them as "Sleep" because no SQL is actually being sent.
Summary Recommendation
* Decrease Wait Queue: Drop it from 500 to 100. This forces your app to fail faster rather than hanging.
* Increase Max Pool Size: Try 40 or 50 if your FE can handle the total connection count (Pods * Pool Size).
* Shorten Timeout: Reduce connection timeout to 3,000ms - 5,000ms. If a connection isn't available in 5 seconds, it’s unlikely to become available in 10.
References
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• administration/management/resource_management/query_queues.md
• administration/management/resource_management/Query_management.md
• best_practices/audit_log_resource_group.md
References
• administration/management/FE_configuration.mdRocky
06/04/2026, 12:31 PMRumit Jain
06/05/2026, 3:04 AMRocky
06/05/2026, 3:04 AMstarrocks_fe_connection_total
Despite the name "total," this metric functions as a Gauge in the Prometheus exporter. It represents the instantaneous count of all established MySQL connections currently held by a specific Frontend (FE) node.
How to use it:
* Metric Name: starrocks_fe_connection_total
* What it includes: Both active connections (currently running a query) and idle connections (those in a Sleep state).
* In Grafana: You should sum this metric across all FE instances to see the total cluster-wide connection count:
promql
sum(starrocks_fe_connection_total)
──────────
Supporting Metrics for Context
If you need to distinguish between "in-use" and "idle," you can look at these two metrics together:
1. starrocks_fe_connection_total: All open connections.
2. starrocks_fe_unfinished_query: The number of queries currently running (active).
* Calculation: connection_total - unfinished_query = Idle (Sleep) connections.
Alternative Methods (SQL)
If you are not using Prometheus/Grafana and want to see this via a SQL client:
* Command: SHOW STATUS LIKE 'Threads_connected';
* This is the standard MySQL-compatible command that StarRocks supports to show the current number of active connections for the FE you are connected to.
* Command: SHOW PROCESSLIST;
* This gives you the granular list of every connection, its user, and whether its state is Query (in-use) or Sleep (idle).
References
• administration/management/monitoring/metrics.md
• sql-reference/sql-statements/administration/SHOW_PROCESSLIST.md
• administration/management/FE_configuration.md (See qe_max_connection)
References
• administration/management/monitoring/metrics.mdRumit Jain
06/05/2026, 3:08 AMstarrocks_fe_unfinished_query in prometheusRocky
06/05/2026, 3:09 AMstarrocks_fe_unfinished_query in your Prometheus, it is likely due to one of three reasons: the StarRocks version you are running, the specific way metrics are labeled, or your Prometheus scrape configuration.
Here is how to find the equivalent information and verify the metric name:
1. Check the FE Metrics Endpoint Directly
The most reliable way to see exactly what your StarRocks FE is exporting is to curl its metrics endpoint directly from your terminal:
bash
curl http://<FE_IP>:<FE_HTTP_PORT>/metrics | grep query
(Default HTTP port is 8030).
Look for any metric ending in _query or containing running. Depending on your version, it might be named:
* starrocks_fe_unfinished_query (Current standard)
* starrocks_fe_query_running (Legacy/Variant)
_ starrocks_fe_query_total (Note: This is a _counter* of all queries ever run, not current active ones).
2. Check for "Warehouse" or "Resource Group" Labels
In newer versions of StarRocks (especially Shared-Data or 3.x+), queries are often tracked within a Warehouse or Resource Group. The metric might exist but require a sum because it is split by labels:
* Metric: starrocks_fe_unfinished_query{warehouse="default_warehouse"}
* Metric: starrocks_fe_resource_group_query_running (If using Resource Groups).
Try searching for just unfinished or running in your Prometheus expression browser to see the full list of available gauges.
3. Alternative: Use the BE-side Metric
If the FE metric is missing or unreliable in your specific build, you can look at the BE (Backend) metric. This counts how many query fragments are currently being executed on the data nodes:
* Metric: starrocks_be_pip_query_ctx_cnt (Number of running queries on a BE).
* Metric: starrocks_be_query_scan_bytes_per_second (Can indicate active work).
4. Query it via SQL
If you can't find it in Prometheus, you can always see the "In-Use vs Idle" breakdown directly in the database to verify your connection pool behavior:
sql
-- Total connections (In-Use + Idle)
SHOW STATUS LIKE 'Threads_connected';
-- List of every connection and its state
-- Look for "Query" (Active) vs "Sleep" (Idle)
SHOW PROCESSLIST;
Summary Recommendation
If starrocks_fe_unfinished_query is truly missing, the single best metric for Total Open Connections (the one you asked for originally) remains:
starrocks_fe_connection_total
If you see this number staying at 20 (your max pool size) while your application queue is filling up, but SHOW PROCESSLIST shows most connections are in Sleep, you have a Connection Leak in your client-side code.
References
• administration/management/monitoring/metrics.md
• administration/management/resource_management/query_queues.md
• sql-reference/sql-statements/administration/SHOW_PROCESSLIST.md
• using_starrocks/running_queries.md
• administration/management/FE_configuration.md
References
• administration/management/monitoring/metrics.md
• using_starrocks/running_queries.md
• administration/management/resource_management/query_queues.md
• administration/management/FE_configuration.mdRocky
06/05/2026, 3:09 AMRumit Jain
06/05/2026, 3:20 AMRocky
06/05/2026, 3:20 AM.close()), the 20 connections will quickly fill up with "idle/leaked" sessions. Because your queue is so large (500), your application won't crash immediately; it will just become extremely slow, making the bug much harder to find.
4. StarRocks Internal Reference
StarRocks itself uses a large internal query queue (query_queue_max_queued_queries defaults to 1024), but this is intended to protect the BE (Backend) CPU/Memory from being overwhelmed by thousands of active SQL executions.
Your application-level pool should be the "fast gatekeeper," not a second warehouse for waiting queries.
Summary Checklist:
1. Increase Pool Size: Set to 40-50 (unless you have 100+ application pods, in which case keep it smaller).
2. Slash the Wait Queue: Reduce from 500 to 100.
3. Monitor starrocks_fe_connection_total: If this stays flat at your "Max Pool Size" while the queue is full, you are either under-provisioned or leaking connections.
References
• administration/management/FE_configuration.md
• administration/management/resource_management/query_queues.md
• sql-reference/System_variable.md
• faq/operation_maintenance_faq.md
• best_practices/audit_log_resource_group.md
References
• administration/management/FE_configuration.md
• sql-reference/System_variable.md
• administration/management/BE_configuration.mdRumit Jain
06/07/2026, 2:40 AMRocky
06/07/2026, 2:40 AMup{job="starrocks-fe"} == 0 | 1m | Investigate FE pod logs or EKS events (OOMKill?).
CN Node Down | up{job="starrocks-cn"} == 0 | 1m | CN pods are stateless; check if EKS is scaling or nodes are failing.
FE Leader Missing | sum(starrocks_fe_is_leader) != 1 | 1m | The cluster has no leader to coordinate writes/metadata.
2. Connection & Query Alerts (Performance)
Since you were concerned about connection pools, these are vital.
Alert Name | Metric / PromQL | Threshold | Action
High Connection Usage | starrocks_fe_connection_total / 4096 | 80%| (Based on default
qe_max_connection of 4096). Scale up FE or check for leaks.
Query Latency (P99) | histogram_quantile(0.99, sum by (le) (rate(starrocks_fe_query_latency_ms_bucket[5m]))) | 5000ms| Adjust threshold based on your SLA. Indicates slow scans or resource contention. Query Error Rate |
rate(starrocks_fe_query_err_total[5m]) / rate(starrocks_fe_query_total[5m]) | 5%| Check logs for syntax errors, timeouts, or "Memory not enough" errors. 3. Compute Node (CN) Health CNs are the "workhorses." In EKS, they are prone to CPU throttling and OOM (Out of Memory). Alert Name | Metric / PromQL | Threshold | Action CN CPU Usage |
starrocks_be_cpu_usage | 85%| If sustained, trigger EKS Horizontal Pod Autoscaler (HPA) to add more CNs. CN Mem Usage |
starrocks_be_mem_usage / starrocks_be_mem_limit | 90%| Very Critical. CNs will kill queries or crash (OOM) above 90%. CN Data Cache Disk |
starrocks_be_data_cache_disk_usage | 90%| For FE+CN, data is in S3. If the local disk cache is full, performance will drop. 4. Frontend (FE) Control Plane Health FE is Java-based. Heap management is the most common issue. Alert Name | Metric / PromQL | Threshold | Action FE JVM Heap |
starrocks_fe_jvm_heap_usage | 85%| Risk of "Stop the World" GC. Increase
JAVA_OPTS in your Helm chart.
Edit Log Write Latency | starrocks_fe_edit_log_write_latency_ms | 100ms| High latency indicates the EBS volume for metadata is too slow (check IOPS). 5. EKS Specific (K8s) Since you are on EKS, monitor the Pod status directly. Alert Name | Metric / PromQL | Threshold | Action Pod Restarts |
increase(kube_pod_container_status_restarts_total[30m]) | 2| Indicates "CrashLoopBackOff" or OOMKills. Volume Pending |
kube_persistentvolumeclaim_status_phase{phase="Pending"} | 0| FE cannot start because EKS cannot provision the EBS volume. ────────── Rocky’s Pro-Tip for EKS: If you are using the StarRocks Kubernetes Operator, ensure your CN
resources.limits.memory is slightly higher (about 10%) than the mem_limit configured in StarRocks. This prevents the EKS Kubelet from killing the pod before StarRocks has a chance to manage its own memory and spill queries to disk.
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• deployment/helm.md
• administration/management/resource_management/query_queues.md
• deployment/operator.md
ReferencesRumit Jain
06/08/2026, 3:41 AMRocky
06/08/2026, 3:41 AMaws_s3_enable_partitioned_prefix = true
* What it does: When enabled, StarRocks does not store all data files under a single flat path. Instead, it creates multiple sub-folders (prefixes) and distributes the data files across them using a hash.
* Why use it: Amazon S3 has a hard limit on request rates: 3,500 PUT/POST/DELETE and 5,500 GET/HEAD requests per second per prefix.
* In FE+CN context: If your CN nodes are performing heavy scans (GET) or massive data ingestion (PUT) and you hit these limits, S3 will return 503 Service Unavailable or "Slow Down" errors. Enabling this property effectively multiplies your S3 throughput capacity by the number of prefixes you define.
2. aws_s3_num_partitioned_prefix = 64
* What it does: Defines the total number of sub-folders (partitions) StarRocks will create to spread the data.
* The Math: With a value of 64, your theoretical S3 throughput limit for the cluster becomes:
* Read: 64 x 5,500 = 352,000 requests/sec
* Write: 64 x 3,500 = 224,000 requests/sec
* Recommendation: 64 is a common and safe default for large-scale clusters. It ensures that even with a very large CN fleet in EKS, you will never be throttled by S3's metadata layer.
Important Constraints
* Versions: This feature is supported starting from v3.2.4.
* Immutability: These properties cannot be changed after the Storage Volume is created. If you try to change them later, StarRocks will not be able to find the existing data because the hashing path will have changed.
* Location Requirement: When using this feature, the LOCATIONS for your storage volume must point to the bucket root (e.g., <s3://my-starrocks-bucket>) without a sub-path.
Summary for EKS users:
If you are running a production cluster on EKS with high-frequency loading or many concurrent users, you should always enable this when first setting up your Storage Volume to avoid hitting S3 scaling bottlenecks as your data grows.
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• administration/management/resource_management/query_queues.md
• using_starrocks/StarRocks_intro.md
• administration/management/monitoring/metrics.md
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.mdRumit Jain
06/08/2026, 3:48 AMRocky
06/08/2026, 3:48 AM<s3://bucket-name/<cluster_uuid>/db<db_id>/<table_id>/<partition_id>/data/>
When aws_s3_enable_partitioned_prefix is true, StarRocks adds a numeric "shard" folder at the very beginning of the key:
<s3://bucket-name/<prefix_id>/<cluster_uuid>/db<db_id>/<table_id>/<partition_id>/data/>
* <prefix_id>: This is a number between 0 and num_partitioned_prefix - 1 (e.g., 0 to 63).
* Visual Example:
text
<s3://my-bucket/0/a1b2c3d4.../db1001/1002/1003/data/segment_1.dat>
<s3://my-bucket/15/a1b2c3d4.../db1001/1004/1005/data/segment_2.dat>
<s3://my-bucket/63/a1b2c3d4.../db1001/1006/1007/data/segment_3.dat>
2. What kind of partitioning is this?
This is Hash-Based Partitioning for S3 Throughput Optimization.
It is not the same as the logical partitioning you define in your SQL (like PARTITION BY RANGE(date)). Here is how it compares to the styles you mentioned:
* Is it Hash-Based? Yes. StarRocks takes a unique identifier for the data (internally, the Partition ID or Tablet ID) and applies a hash function. The result determines which of the 64 prefixes the data will live in.
* Is it Date-Based or Category-Based? No. It is completely agnostic to your business logic. The goal isn't to help humans browse folders; it's to help S3's backend scale.
* Is it Hive-Style? No. Hive-style (key=value/) is designed for metadata discovery. This StarRocks feature is a performance-first layout designed to bypass S3 limits.
Why this specific structure?
Amazon S3 scales its performance by "learning" your prefix patterns. If all your files start with the same string (e.g., `s3://bucket/starrocks_data/...`), S3 eventually funnels all those requests through the same internal index partition, hitting a ceiling of 3,500–5,500 requests/sec.
By starting the path with a randomized hash prefix (like 0/, 1/, etc.), you force S3 to treat each shard as a separate entry point. This allows the cluster to handle 64x the requests compared to a standard flat folder structure.
Important Summary:
* Partitioning Type: Internal Hash-based Prefixing.
* User Impact: None (SQL queries remain the same).
* Requirement: Your LOCATIONS must be a bare bucket name (<s3://my-bucket>) because StarRocks needs control of the very first character in the path to ensure the hash works effectively.
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
• deployment/shared_data/s3.md
• sql-reference/sql-functions/table-functions/files.mdRumit Jain
06/08/2026, 3:55 AMRocky
06/08/2026, 3:55 AMfe.conf, and they cannot be applied to an existing Storage Volume.
According to the StarRocks documentation, there are three specific reasons why your configuration isn't taking effect:
1. fe.conf Limitation
The partitioned prefix feature must be configured using the CREATE STORAGE VOLUME SQL statement. StarRocks specifically ignores these two parameters if they are placed in the fe.conf file.
2. Immutability
These properties are immutable. Once a Storage Volume is created (including the default builtin_storage_volume created automatically during your EKS deployment), you cannot enable or change the sharding logic for it. To use this feature, you must create a new Storage Volume.
3. Location Constraint
For sharding to work, the LOCATIONS parameter in your SQL must point only to the bucket root (e.g., <s3://starrocks-data>). If you provide a sub-path (like `s3://starrocks-data/my-cluster/`), the partitioned prefix feature will not function.
──────────
How to fix this
If you want to use the sharded structure, you need to create a new Storage Volume via SQL:
sql
CREATE STORAGE VOLUME my_sharded_volume
TYPE = S3
LOCATIONS = ("<s3://starrocks-data>") -- Must be bucket root
PROPERTIES
(
"aws.s3.region" = "us-east-1",
"aws.s3.enable_partitioned_prefix" = "true",
"aws.s3.num_partitioned_prefix" = "64",
-- Include your credential settings here --
"aws.s3.use_instance_profile" = "true"
);
-- Set it as the default for new databases/tables
SET my_sharded_volume AS DEFAULT STORAGE VOLUME;
What happens to existing data?
* Existing Tables: Will continue to live in the old path (`s3://starrocks-data/cbdbeb34...`). You cannot "move" them into the sharded structure automatically.
* New Tables: Once you set the new volume as default, any new tables created will follow the sharded path: <s3://starrocks-data/<0-63>/<uuid>/>....
Summary Recommendation
Since you are in a FE+CN (Shared-Data) architecture on EKS, if you have not yet loaded significant production data, I recommend creating a new sharded Storage Volume now. If you already have a lot of data, you would need to INSERT INTO ... SELECT your data from the old tables into new tables created on the sharded volume to get the performance benefits.
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• administration/management/FE_configuration.md
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
• deployment/shared_data/s3.mdRumit Jain
06/08/2026, 3:58 AMRocky
06/08/2026, 3:58 AMfe.conf section of your Helm chart will not work.
While many StarRocks settings can be configured via the configuration file, the Partitioned Prefix feature is a strict exception. According to the StarRocks documentation, these properties are explicitly ignored when defined in fe.conf.
Why it isn't working for you
1. Creation Method: The feature can only be enabled during the execution of a CREATE STORAGE VOLUME SQL statement. It cannot be enabled via the configuration file.
2. Built-in Volume Limitation: When you use Helm with enable_load_volume_from_conf: true, the StarRocks Operator/FE automatically creates a builtin_storage_volume. This automated process only supports basic S3 credentials and does not support the partitioned prefix parameters.
3. Immutability: Once a storage volume is created (like your current one), these properties cannot be added or changed.
The Correct Way to do this on EKS
Since the Helm chart and Operator do not currently support defining these logical sharding properties in the values.yaml, you must perform a manual one-time setup via SQL after the cluster is running.
Step 1: Create a New Sharded Storage Volume
Run this SQL command from any MySQL client connected to your FE:
sql
CREATE STORAGE VOLUME sharded_s3_volume
TYPE = S3
LOCATIONS = ("<s3://starrocks-data>") -- Must be bucket root, no sub-paths!
PROPERTIES
(
"enabled" = "true",
"aws.s3.region" = "us-east-1", -- Change to your region
"aws.s3.use_instance_profile" = "true",
"aws.s3.enable_partitioned_prefix" = "true",
"aws.s3.num_partitioned_prefix" = "64"
);
Step 2: Set it as the Default
This ensures all future databases and tables use the sharded structure:
sql
SET sharded_s3_volume AS DEFAULT STORAGE VOLUME;
Can I automate this?
If you strictly want to avoid manual SQL, you have two options:
* Helm Post-Install Job: Create a small Kubernetes Job in your Helm chart that runs a container with a MySQL client to execute the SQL commands above after the FE pods are ready.
* Init SQL (Future): Currently, the StarRocks Helm chart does not have a native initSql field for cluster initialization like some other databases. Manual execution or a custom K8s Job is the standard approach for logical database configuration.
Summary
If you leave the properties in your Helm chart's fe.config, they will simply sit in the fe.conf file unused. To see the folder structure change to the sharded format (`s3://bucket/0/cluster-id/...`), you must use the CREATE STORAGE VOLUME SQL command.
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• administration/management/FE_configuration.md
• deployment/shared_data/feature-support-shared-data.md
• quick_start/shared-data.md
References
• deployment/shared_data/feature-support-shared-data.md
• quick_start/shared-data.md
• deployment/shared_data/hdfs.mdRumit Jain
06/08/2026, 4:01 AMRocky
06/08/2026, 4:01 AMfe.conf are being ignored because StarRocks does not support enabling the Partitioned Prefix feature via the configuration file. It can only be enabled during a manual CREATE STORAGE VOLUME SQL command.
Here is how to handle your situation:
1. Do you need to delete the automatically created volume?
No, and you actually cannot.
StarRocks prevents you from dropping the builtin_storage_volume. However, you do not need to delete it to use the same bucket. You can simply create a second storage volume pointing to the same bucket but with the sharding feature enabled.
Since the Partitioned Prefix adds a number (0-63) to the very beginning of the S3 path, it will not conflict with the data currently stored by the built-in volume.
* Old path: <s3://starrocks-data/<cluster_uuid>/>...
* New sharded path: <s3://starrocks-data/shard_id/<cluster_uuid>/>...
2. How to fix this in your current cluster
Since your cluster is already running, follow these steps via your MySQL client:
1. Create the new sharded volume:
sql
CREATE STORAGE VOLUME sharded_v1
TYPE = S3
LOCATIONS = ("<s3://starrocks-data>") -- Must be bucket root
PROPERTIES
(
"enabled" = "true",
"aws.s3.region" = "us-east-1",
"aws.s3.use_instance_profile" = "false",
"aws.s3.use_aws_sdk_default_behavior" = "true",
"aws.s3.enable_partitioned_prefix" = "true",
"aws.s3.num_partitioned_prefix" = "64"
);
2. Set it as the default:
sql
SET sharded_v1 AS DEFAULT STORAGE VOLUME;
3. Clean up your Helm config:
Remove aws_s3_enable_partitioned_prefix and aws_s3_num_partitioned_prefix from your Helm fe.config because they are effectively dead code there.
3. Recommendation for the future (Clean Setup)
If you want a "clean" setup in a new environment where you don't have an extra builtin_storage_volume cluttering your list:
1. Set enable_load_volume_from_conf = false in your Helm chart.
2. After the FE is up, the cluster will start but will not allow you to create databases.
3. Connect via MySQL and run the CREATE STORAGE VOLUME and SET ... AS DEFAULT commands manually (or via a K8s Job).
Summary of why your fe.conf failed:
* Property Ignore: StarRocks core code only looks for enable_partitioned_prefix during the SQL execution of CREATE STORAGE VOLUME.
* Bucket Constraint: The Partitioned Prefix requires the location to be just <s3://bucket-name>. Your fe.conf setup (specifically aws_s3_path) is often interpreted as a full path, which would invalidate the prefixing logic anyway.
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• sql-reference/sql-statements/cluster-management/storage_volume/DROP_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
References
• sql-reference/sql-statements/cluster-management/storage_volume/DROP_STORAGE_VOLUME.md
• administration/user_privs/authorization/privilege_item.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.mdRumit Jain
06/08/2026, 5:58 AMCREATE STORAGE VOLUME sharded_v1
TYPE = S3
LOCATIONS = ("<s3://starrocks-data>")
PROPERTIES
(
"enabled" = "true",
"aws.s3.region" = "us-east-1",
"aws.s3.use_instance_profile" = "false",
"aws.s3.use_aws_sdk_default_behavior" = "true",
"aws.s3.enable_partitioned_prefix" = "true",
"aws.s3.num_partitioned_prefix" = "64"
);
SET sharded_v1 AS DEFAULT STORAGE VOLUME;
How to test this?Rocky
06/08/2026, 5:59 AMsharded_v1 is indeed the default.
sql
DESCRIBE STORAGE VOLUME sharded_v1;
In the Params column, verify that you see "aws.s3.enable_partitioned_prefix":"true" and "aws.s3.num_partitioned_prefix":"64". Also, ensure IsDefault is true.
2. Create a Test Table
Since the default storage volume is only applied to newly created databases or tables, create a fresh database and table to trigger the new logic:
sql
CREATE DATABASE test_sharding;
USE test_sharding;
CREATE TABLE test_table (
id INT,
name VARCHAR(20)
)
DISTRIBUTED BY HASH(id);
INSERT INTO test_table VALUES (1, 'rocky');
3. Inspect the S3 Path via SQL
You don't need to log into the AWS Console to verify this. Use the SHOW PROC command to see the internal storage path StarRocks has assigned:
sql
-- Find your database ID first
SHOW DATABASES;
-- Use the DB name or ID to check the tables
SHOW PROC '/dbs/test_sharding';
What to look for in the StoragePath column:
* Old format (Built-in): <s3://starrocks-data/cbdbeb34->... (UUID at the root)
* New format (Sharded): <s3://starrocks-data/24/cbdbeb34->... (A number between 0-63 will now appear before the cluster UUID)
Alternative: Check information_schema
If you have many partitions, you can run this query to see the exact S3 path for every data file in the new table:
sql
SELECT TABLE_NAME, STORAGE_PATH
FROM information_schema.partitions_meta
WHERE DB_NAME = 'test_sharding';
Summary of Results
If the STORAGE_PATH starts with a number (e.g., <s3://starrocks-data/15/>... or `s3://starrocks-data/42/...`), the partitioned prefix is working. This sharding helps avoid S3 request throttling by spreading metadata and data operations across multiple S3 partitions.
References
• sql-reference/sql-statements/cluster-management/storage_volume/DESC_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• faq/shared_data_faq.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• knowledge/admin_and_operation/shared_data_compaction.md
References
• sql-reference/sql-statements/cluster-management/storage_volume/DESC_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• faq/shared_data_faq.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• knowledge/admin_and_operation/shared_data_compaction.md
• sql-reference/sql-statements/cluster-management/storage_volume/SHOW_STORAGE_VOLUMES.md
• loading/s3.md
• deployment/shared_data/hdfs.md
• deployment/shared_data/minio.mdRocky
06/08/2026, 5:59 AMRumit Jain
06/08/2026, 6:03 AMSHOW PROC '/dbs/test_sharding';
+---------+------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+--------------------------------------------------------------------------------------------+
| TableId | TableName | IndexNum | PartitionColumnName | PartitionNum | State | Type | LastConsistencyCheckTime | ReplicaCount | PartitionType | StoragePath |
+---------+------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+--------------------------------------------------------------------------------------------+
| 67367 | test_table | 1 | | 1 | NORMAL | CLOUD_NATIVE | NULL | 16 | UNPARTITIONED | <s3://srekubvir-olymsre01-starrocks-data/37f4670c-c74e-4b68-b4ec-47bd726c701e/db67365/67367> |
+---------+------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+--------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)Rocky
06/08/2026, 6:07 AMRocky
06/08/2026, 6:09 AMSHOW PROC doesn't show the prefix
There is a known display issue (tracked in StarRocks GitHub Issue #48995) where SHOW PROC '/dbs/...' and similar commands show the logical base path of the table rather than the actual physical path on S3 when partitioned prefix is enabled.
Because the prefix is calculated at the tablet or partition level (using a hash), a single table might technically have data spread across multiple different prefix folders. The FE currently simplifies the "Table Path" display by omitting the prefix.
2. Is it actually working?
Yes. The fact that you see a numeric folder like 92 at the root of your bucket is the proof. If the feature were disabled, StarRocks would put the cluster UUID (37f4670c-...) directly at the root of the bucket.
To verify this, look inside the 92 folder in your S3 console. You should see your cluster UUID (37f4670c-...) inside it.
3. Why is the folder named 92 if you set 64?
This is the part that needs investigation. If you set "aws.s3.num_partitioned_prefix" = "64", the folders should only be numbered 0 through 63. Seeing a folder named 92 suggests one of the following:
* Property mismatch: The property in your sharded_v1 volume might be different from what was in your fe.conf. Please run this command to check the actual setting:
sql
DESCRIBE STORAGE VOLUME sharded_v1;
Check if aws.s3.num_partitioned_prefix is indeed 64. If it is 100 or 1024, then 92 is a valid folder.
* Old Data: If you had a previous storage volume or a different test where this was set higher, that folder might be leftover.
* Built-in Volume: Check if the table was accidentally created using the builtin_storage_volume. You can verify which volume a table is using with:
sql
SHOW CREATE TABLE test_table;
4. How to see the "Real" path via SQL
To see the actual paths including the prefixes for each partition, try querying the system metadata directly:
sql
SELECT TABLE_NAME, PARTITION_NAME, STORAGE_PATH
FROM information_schema.partitions_meta
WHERE DB_NAME = 'test_sharding';
If the partitioned prefix is active for those specific data files, the STORAGE_PATH here should (in newer versions) show the full path including the numeric prefix.
References
• sql-reference/sql-statements/cluster-management/storage_volume/DESC_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• faq/shared_data_faq.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/storage_volume/SHOW_STORAGE_VOLUMES.md
References
• administration/management/FE_configuration.md
• sql-reference/System_variable.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/management/BE_configuration.mdRocky
06/08/2026, 6:09 AMRumit Jain
06/08/2026, 6:11 AMDESCRIBE STORAGE VOLUME sharded_v1;
+------------+------+-----------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------+
| Name | Type | IsDefault | Location | Params | Enabled | Comment |
+------------+------+-----------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------+
| sharded_v1 | S3 | true | <s3://srekubvir-olymsre01-starrocks-data> | {"aws.s3.region":"us-east-1","aws.s3.num_partitioned_prefix":"64","aws.s3.enable_partitioned_prefix":"true","aws.s3.use_aws_sdk_default_behavior":"true","aws.s3.endpoint":""} | true | |
+------------+------+-----------+-----------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------+
1 row in set (0.00 sec)
Starrocks > SHOW CREATE TABLE test_table;
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_table | CREATE TABLE `test_table` (
`id` int(11) NULL COMMENT "",
`name` varchar(20) NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`id`, `name`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`id`)
PROPERTIES (
"compression" = "LZ4",
"datacache.enable" = "true",
"enable_async_write_back" = "false",
"file_bundling" = "true",
"replication_num" = "1",
"storage_volume" = "sharded_v1"
); |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
Starrocks > SELECT TABLE_NAME, PARTITION_NAME, STORAGE_PATH
-> FROM information_schema.partitions_meta
-> WHERE DB_NAME = 'test_sharding';
+------------+----------------+-----------------------------------------------------------------------------------------------------+
| TABLE_NAME | PARTITION_NAME | STORAGE_PATH |
+------------+----------------+-----------------------------------------------------------------------------------------------------+
| test_table | test_table | <s3://srekubvir-olymsre01-starrocks-data/92/37f4670c-c74e-4b68-b4ec-47bd726c701e/db67365/67367/67369> |
+------------+----------------+-----------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)Rocky
06/08/2026, 6:12 AM92 appearing in your S3 path confirms that the Partitioned Prefix feature is active, but it also reveals that StarRocks is currently using the default value of 256 prefixes instead of the 64 you specified in your Storage Volume.
Why you see "92"
If your setting of 64 were active, the folder name would be a number between 0 and 63. Because you see 92, the system is almost certainly using the default range of 0 to 255.
In StarRocks, the prefix is calculated using a hash of the internal path (typically the cluster UUID or tablet ID) modulo the number of prefixes:
prefix = hash(path) % num_partitioned_prefix
Since $92 < 256$ but $92 > 63$, the effective value for num_partitioned_prefix is currently at least 93 (most likely 256).
Possible reasons your "64" was ignored:
1. StarRocks Version:
While the feature was introduced in v3.2.4, early implementations sometimes had the prefix count hardcoded to 256 or relied on a global configuration rather than the individual Storage Volume property. Ensure you are on a recent release (e.g., v3.2.7+ or v3.3.x).
2. FE Configuration Override:
There is a global FE configuration parameter that can override or set the default for this behavior. Check your fe.conf or run the following command to see if a global limit is set:
sql
ADMIN SHOW FRONTEND CONFIG LIKE '%partitioned_prefix%';
If aws_s3_num_partitioned_prefix is set to 256 in your fe.conf, it may be taking precedence in your specific version.
3. Property Immutability:
The documentation notes that these properties are immutable once the storage volume is created. If the volume was initially created with the default (or if the 64 was added via an ALTER command later), it might not have taken effect. However, your DESCRIBE shows it is set to 64 now, which suggests a propagation issue between the FE's metadata and the path generator.
How to fix/verify
To force the system to use 64, you can try the following:
1. Check FE Config: If aws_s3_num_partitioned_prefix exists in your FE config, set it to 64 and restart the FE.
2. Test a New Volume: Create a brand-new storage volume with a different name (e.g., sharded_v2) and the 64 property set from the very first CREATE statement. Create a new table using that volume and check if the prefix folder then falls within the 0-63 range.
3. Check Logs: Look at the fe.log during the creation of the table or volume. If there was a parsing error (e.g., if it expected an integer but received a string), it might have silently defaulted to 256.
Summary: The feature is working (your data is being sharded), but it is using the default sharding factor of 256. For most S3 performance use cases, 256 is actually the recommended value, as it provides more "headroom" to prevent S3 throttling.
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/DESC_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
• faq/shared_data_faq.md
data_faq)
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/DESC_STORAGE_VOLUME.mdRocky
06/08/2026, 6:12 AMRumit Jain
06/08/2026, 6:14 AMADMIN SHOW FRONTEND CONFIG LIKE '%partitioned_prefix%';
Empty set (0.01 sec)Rocky
06/08/2026, 6:15 AMADMIN SHOW FRONTEND CONFIG returns an empty set is that Partitioned Prefix settings are properties of the Storage Volume, not global Frontend (FE) configuration variables.
1. Why the command is empty
ADMIN SHOW FRONTEND CONFIG only shows parameters defined in your fe.conf file or internal FE global settings. Because the sharding logic is tied to a specific storage destination (the Storage Volume), StarRocks stores these settings as metadata for that volume rather than a global cluster-wide variable.
You have already verified the setting correctly using:
sql
DESCRIBE STORAGE VOLUME sharded_v1;
The fact that this command shows "aws.s3.num_partitioned_prefix":"64" means the FE knows about your requirement.
2. Why folder "92" exists
Since you see a folder named 92, and your setting is 64, the system is almost certainly using the default value of 256 instead of your custom value. In StarRocks, the folder name is calculated as:
Hash(Path) % num_partitioned_prefix
If the setting 64 were active, the folder name could only be between 0 and 63.
Possible Reasons for the mismatch:
* Property Immutability: In many StarRocks versions, the num_partitioned_prefix property is immutable. If you created the storage volume first and then tried to ALTER it to add the prefix count, the change may show up in DESCRIBE but the underlying path generator may still be using the default it was "born" with.
* Version Bug: There is a known behavior in some early 3.2.x versions where the Storage Volume property was ignored, and the system defaulted to 256 regardless of the input.
* Built-in Volume: If your cluster was started with enable_load_volume_from_conf = true, it might be using the builtin_storage_volume settings which default to 256.
How to verify and fix
1. Check your Version: Ensure you are on StarRocks v3.2.10+ or v3.3.3+. There were several fixes related to how Storage Volume properties are propagated.
2. Test with a New Volume: To see if the property is being ignored, create a brand-new storage volume with the property included in the initial CREATE statement:
sql
CREATE STORAGE VOLUME test_prefix_vol
TYPE = S3
LOCATIONS = ("<s3://your-bucket>")
PROPERTIES (
"aws.s3.enable_partitioned_prefix" = "true",
"aws.s3.num_partitioned_prefix" = "16" -- Use a small number like 16 to test
);
Create a new table using this volume and check the path. If you still see folders $> 15$, then your specific StarRocks version is ignoring the volume property and using the hardcoded default.
Note: For S3 performance, 256 is the recommended value. Unless you have a strict requirement to limit the folder count at the root, the current behavior (defaulting to 256) is actually optimal for S3's request-per-second limits.
References
• administration/management/FE_configuration.md
• deployment/shared_data/azure.md
• quick_start/shared-data.mdRumit Jain
06/08/2026, 6:23 AMfor whenDeleted: Delete
whenDeleted: Retain
whenScaled: Delete
IN case of CN pods.
persistentVolumeClaimRetentionPolicy specifies the retention policy for PersistentVolumeClaims associated with the component.
# The whenDeleted field is supported for all components, and it determines whether to delete PVCs when the StatefulSet is deleted.
# The whenScaled field is only supported for the CN component.
persistentVolumeClaimRetentionPolicy:
whenDeleted: Delete
whenDeleted: Retain
whenScaled: DeleteRocky
06/08/2026, 6:24 AMpersistentVolumeClaimRetentionPolicy is as follows:
Recommended Configuration
yaml
starRocksCnSpec:
persistentVolumeClaimRetentionPolicy:
whenDeleted: Retain
whenScaled: Delete
Why this is recommended:
1. whenScaled: Delete (Highly Recommended)
CN nodes in StarRocks are designed to be elastic. They are frequently scaled up and down based on query load. Since CN nodes primarily use local storage for Data Cache (temporary copies of data from S3/object storage), you do not need to keep the disks when a node is scaled down.
* Benefit: Prevents "PVC Leaking" where orphan disks stay in your cloud account and continue to cost money even though the nodes are gone.
* Trade-off: If you scale back up, the new pod will have a "cold" cache and must re-fetch data from remote storage. However, for most elastic workloads, the cost savings of deleting the volume far outweigh the benefit of keeping a stale cache.
2. whenDeleted: Retain (Recommended for Stability)
This determines what happens if the entire StarRocks cluster (or the CN StatefulSet) is deleted.
* Benefit: Setting this to Retain is a safety measure. If you accidentally delete the cluster or are performing a complex manual upgrade, your cache remains on the disks. If you recreate the cluster with the same name, the new pods can attach to the existing PVCs and start with a "warm" cache immediately.
* Note: If you are in a Test/Dev environment and want total cleanup, you can set this to Delete.
Important Syntax Note
In your provided snippet, you listed whenDeleted twice with different values. In YAML, the last value usually overrides the previous ones, or it may cause a parsing error. You should only have one of each:
Corrected Snippet:
yaml
# Use this for CN nodes
persistentVolumeClaimRetentionPolicy:
whenDeleted: Retain # Keep cache if cluster is deleted (safer)
whenScaled: Delete # Auto-clean disks when scaling down (saves money)
Contrast with BE Nodes
Unlike CN nodes, BE (Backend) nodes in a shared-nothing or traditional StarRocks deployment store the primary data. For BE nodes, you should almost always use Retain for both fields to prevent permanent data loss. However, since your question specifically asked about CN pods, the whenScaled: Delete policy is the standard optimization.
References
• deployment/shared_data/s3.md
• data_source/data_cache.md
• deployment/shared_data/minio.mdRumit Jain
06/08/2026, 6:27 AMRocky
06/08/2026, 6:27 AMwhenDeleted: Delete isn't "wrong" in a technical sense (since CNs are stateless regarding the primary data), it is generally considered risky or inefficient for production environments.
Here is why keeping whenDeleted: Delete is usually avoided for CN pods:
1. The "Cold Start" Performance Penalty
The CN pods store a Data Cache (Block Cache) on their local disks. This cache stores hot data retrieved from S3.
* What happens: If you delete the cluster (or the StatefulSet) with this policy, 100% of your cached data is wiped.
* The Result: When the cluster comes back up, every single query will be a "Cache Miss." Queries that usually take 500ms might suddenly take 10+ seconds because the CN must fetch every byte from S3 over the network. It can take hours or even days of query traffic to "warm up" the cache back to its previous performance level.
2. Significant Increase in S3/Object Storage Costs
Cloud providers charge for GET requests and sometimes for Data Transfer Out (if the S3 bucket is in a different region/account).
* What happens: If you wipe 2TB of cache across your CN nodes, StarRocks must perform millions of S3 GET requests to refill that cache as users run queries.
* The Result: You pay for the data transfer and the API calls twice—once when you first loaded it, and again when you have to re-fetch it because the local copy was deleted.
3. Lack of a Safety Net for Accidental Deletion
In Kubernetes, it is relatively easy to accidentally delete a StarRocksCluster custom resource or a namespace via a CI/CD glitch or human error.
* With `Delete`: Your cache is gone instantly. Even if you redeploy the cluster 1 minute later, the performance is ruined.
* With `Retain`: If the cluster is deleted accidentally, the cloud disks (EBS/PD) stay alive. When you redeploy the cluster with the same name, the new pods will automatically "claim" those old disks. The CNs will start up with a 100% warm cache, and your users won't notice any performance dip.
4. Infrastructure Pressure on Startup
When a cluster starts with a completely empty cache, the sudden burst of queries can lead to:
* Network Bottlenecks: All CNs fighting for bandwidth to pull data from S3.
* High CPU/IO Wait: CNs spending more time waiting for network I/O than processing data.
This can lead to a "death spiral" where pods appear healthy but queries time out because the system is overwhelmed by the initial cache-filling phase.
Summary: When is it okay to use Delete?
You should only use whenDeleted: Delete for:
* Short-lived Test/Dev Environments: Where you want to ensure total cost cleanup and don't care about performance.
* CI/CD Runners: Where clusters are spun up for a single test and then destroyed.
For Production: Use whenDeleted: Retain. It costs a few extra dollars to keep the disks if you temporarily delete the cluster, but it saves you from a performance nightmare and high S3 request bills.
References
• using_starrocks/caching/block_cache.md
• data_source/data_cache.mdRumit Jain
06/08/2026, 7:17 AMMon Jun 8 07:10:25 UTC 2026] Process conf file fe.conf ...
[Mon Jun 8 07:10:25 UTC 2026] first start fe with meta not exist.
nc: getaddrinfo for host "kube-starrocks-fe-service.olymsre01" port 9030: Name or service not knownRocky
06/08/2026, 7:18 AMnc -z ...) before it fully initializes the metadata. However:
1. The Pod is waiting for the Service to exist so it can resolve the hostname.
2. The Operator often waits for at least one Pod to be "Ready" before it creates the Service and Search Service.
3. The Readiness Probe fails because the FE process hasn't started (it's still stuck in the "waiting for service" loop).
This results in the pods staying in a Running state but never becoming Ready, and the Services never being created.
2. How to fix it
You can break this deadlock using one of the following methods:
A. Manual Service Creation (The "Kickstart")
The quickest way to fix this is to manually create the missing service so the DNS name becomes resolvable. Once the FE pods see the name, they will finish starting up, and the Operator will take over management of the service.
1. Get the YAML of a standard FE service from the StarRocks documentation or your Helm chart.
2. Apply it manually to the olymsre01 namespace.
3. Once the pods become 1/1 Ready, the Operator will reconcile and update the service if needed.
B. Check for Namespace/DNS Issues (EKS Specific)
The hostname kube-starrocks-fe-service.olymsre01 suggests your namespace is olymsre01. Ensure that:
* The Namespace olymsre01 actually exists.
* CoreDNS in your EKS cluster is functioning correctly. If CoreDNS is failing, the nc command will fail even if the service is created. Check with:
bash
kubectl get pods -n kube-system -l k8s-app=kube-dns
C. Ensure the Operator is Running
Check the logs of the starrocks-operator pod. If the Operator has crashed or doesn't have the correct RBAC permissions in the olymsre01 namespace, it will never create the services.
bash
kubectl logs -l <http://app.kubernetes.io/name=starrocks-operator|app.kubernetes.io/name=starrocks-operator> -n <operator-namespace>
Look for errors like permission denied or failed to create service.
D. Use "IP" Host Type (If FQDN is not required)
If you are not strictly required to use FQDN, check your StarRocksCluster CRD or Helm values.yaml. If enableFQDN is set to true, the FE nodes must resolve the service name to start. Setting this to false (the default in some versions) allows nodes to start using IP addresses, which often bypasses this specific DNS check during the first boot.
3. Summary of the Log
The line first start fe with meta not exist means the FE is trying to bootstrap a brand new cluster. It is currently stuck in a loop trying to find "Helper" nodes or its own service name to determine its role in the cluster. Because the service kube-starrocks-fe-service hasn't been created yet, nc (netcat) fails with Name or service not known.
Recommendation: Check the StarRocks Operator logs first to see why it isn't creating the service. If the Operator is healthy, manually create a placeholder service with the name kube-starrocks-fe-service in namespace olymsre01 to "jump-start" the FE pods.
References
• deployment/helm.md
• quick_start/helm.md
• administration/management/enable_fqdn.md
References
• quick_start/shared-data.md
• administration/management/enable_fqdn.md
• administration/Meta_recovery.md
• quick_start/helm.mdRumit Jain
06/08/2026, 9:11 AMRocky
06/08/2026, 9:11 AMe2 folder (or any 2-character hex string like a1, f0, etc.) in your S3 bucket is a sign that you have enabled the Partitioned Prefix feature in your StarRocks Storage Volume configuration.
What is the e2 folder?
In StarRocks v3.2.4 and later, when you create a Storage Volume with the property "aws.s3.enable_partitioned_prefix" = "true", StarRocks automatically prepends a 2-character hash prefix (like /e2/) to the data paths in S3.
* Why it exists: AWS S3 has performance limits based on "prefixes" (paths). If all your data is under one single folder (like your cluster UUID), S3 might throttle your requests once you reach a high volume of transactions (over 3,500 PUT/DELETE or 5,500 GET requests per second per prefix).
* The Solution: By adding a random-looking hash like e2 at the beginning of the path, StarRocks spreads the I/O load across multiple S3 partitions, significantly increasing the maximum throughput and avoiding SlowDown errors.
Why is it not in your SHOW PROC output?
In the SHOW PROC output you provided:
<s3://srekubvir-olymsre01-starrocks-data/09266979-262c-42cd-b162-16c7c30da381/db10218/10220>
StarRocks often displays the logical storage path in SHOW PROC. Even if the physical objects in S3 are stored with a prefix (e.g., s3://.../e2/09266979...), the metadata layer maps the table to its logical root.
Is this a problem?
No, this is actually a recommended performance optimization for production.
If you did not intend to have this folder, check your CREATE STORAGE VOLUME statement for this property:
sql
PROPERTIES (
"aws.s3.enable_partitioned_prefix" = "true" -- This causes the 'e2' type folders
);
Recommendation
If you are running a high-concurrency or high-throughput workload on EKS, leave it enabled. It prevents S3 performance bottlenecks.
Warning: Do not manually move or rename the e2 folder in S3. StarRocks calculates that hash prefix internally to find the data. If you move it, the FE will lose track of the data files, and queries will fail with "File not found" errors.
References
• deployment/shared_data/s3.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/feature-support-shared-data.md
References
• faq/shared_data_faq.md
• deployment/shared_data/hdfs.md
• deployment/shared_data/s3.md
• quick_start/shared-data.mdRumit Jain
06/08/2026, 9:13 AMRocky
06/08/2026, 9:13 AMe2 (and other similar 2-character folders like 00, a1, ff) are created because the Partitioned Prefix feature is enabled on your Storage Volume.
When will it create a "new" folder?
StarRocks doesn't create all folders at once. A "new" 2-character folder is created in your S3 bucket the moment data is written whose internal hash matches that prefix.
1. During Ingestion: When you load data, StarRocks generates data files (segments). It calculates a hash for these files.
2. Prefix Assignment: If the hash results in a1, and that's the first time that hash has occurred, S3 will show a new a1/ folder.
3. Total Folders: By default, StarRocks uses 256 prefixes (00 through ff). As your cluster grows and you add more tables or data, you will eventually see all 256 of these folders in your S3 bucket.
What is the Use Case?
The primary use case is High-Performance Scaling and avoiding AWS S3 throttling.
* Overcoming S3 Limits: AWS S3 has a performance limit per "prefix" (path). A single prefix can handle roughly 3,500 PUT/COPY/POST/DELETE and 5,500 GET requests per second.
* Preventing Throttling: In a large StarRocks cluster with many CN nodes reading/writing simultaneously, a single path (like `s3://bucket/cluster_id/...`) would quickly hit these limits, causing S3 to return 503 SlowDown errors and slowing down your queries.
* Parallelism: By splitting data into 256 different top-level prefixes (like /e2/, /a1/, etc.), you effectively multiply S3's throughput capacity by 256. This allows your cluster to scale to massive IOPS without hitting cloud provider bottlenecks.
Summary
* It's automatic: You don't need to manage these folders.
* It's for speed: It ensures your S3 bucket can keep up with the high-speed data processing of StarRocks.
* It's normal: Seeing folders like e2 at the root of your bucket is the expected behavior for a production-ready StarRocks shared-data deployment.
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• faq/shared_data_faq.md
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
• deployment/shared_data/s3.mdRumit Jain
06/08/2026, 9:56 AMRocky
06/08/2026, 9:57 AMistiod (Istio sidecar injection) for the initpwd job in a StarRocks deployment while ensuring the job can complete successfully, you must address the common "hanging job" issue where the Istio sidecar prevents the Pod from terminating.
There are two primary ways to handle this depending on your requirements and Kubernetes version:
1. Disable Injection (Recommended for most)
If your Istio mesh is in PERMISSIVE mode, the simplest way is to disable sidecar injection for the initpwd pod. This allows the job to talk to the FE nodes without requiring its own sidecar, and it will terminate cleanly.
In your Helm values.yaml, add the <http://sidecar.istio.io/inject|sidecar.istio.io/inject>: "false" annotation:
yaml
starrocks:
initPassword:
enabled: true
passwordSecret: starrocks-root-pass
# Custom annotations for the initpwd job
annotations:
<http://sidecar.istio.io/inject|sidecar.istio.io/inject>: "false"
2. Enable Injection with Auto-Termination
If your mesh is in STRICT mTLS mode, the initpwd job must have a sidecar to communicate with the FE. To prevent the job from hanging in a Running state after finishing its task, you have two options:
A. Native Sidecar Support (K8s 1.29+)
If you are on a recent version of EKS (Kubernetes 1.29 or later), Istio 1.20+ supports native sidecar containers. The sidecar will automatically terminate when the main container finishes.
Ensure your Istio installation is configured to use the SidecarContainers feature gate.
B. Manual Quit (Older K8s versions)
If you are on an older version of Kubernetes, the sidecar will not stop on its own. You would typically need to send a quitquitquit command to the sidecar. However, since the initpwd job script is internal to the StarRocks Operator/Helm chart, you cannot easily modify the script.
The most reliable workaround for Istio in this scenario is:
1. Set the annotation <http://proxy.istio.io/config|proxy.istio.io/config>: '{ "holdApplicationUntilProxyReceivesConfig": true }' to ensure the proxy is ready before the password script runs.
2. If the pod hangs in Running (0/1) after completion, you may need to manually delete the completed pod or use a script to call the Istio termination endpoint.
Configuration via Helm
Ensure you are using the correct field in your values.yaml to pass these settings to the job:
yaml
starrocks:
initPassword:
enabled: true
passwordSecret: starrocks-root-pass
annotations:
<http://sidecar.istio.io/inject|sidecar.istio.io/inject>: "true"
# Ensures the sidecar is ready before the script starts
<http://proxy.istio.io/config|proxy.istio.io/config>: '{ "holdApplicationUntilProxyReceivesConfig": true }'
Summary of common symptoms
* Pod status Completed (0/1): This is actually success. The 0/1 indicates the main container finished, but the sidecar is still there. In newer Helm charts, this is ignored and the cluster proceeds.
* Pod status Running (1/2): The job is finished but the sidecar is keeping the pod alive. If this blocks your automation, use the "Disable Injection" method above.
References
• quick_start/helm.md
• deployment/helm.md
• administration/management/FE_configuration.md
Note: For the StarRocks Operator, ensure you are on version 1.8.5 or higher, as it includes several improvements for Istio protocol handling.
References
• quick_start/helm.md
• deployment/helm.md
• loading/Kafka-connector-starrocks.mdRumit Jain
06/08/2026, 11:24 AMRocky
06/08/2026, 11:24 AMstorageClassName of an existing PersistentVolumeClaim (PVC), you cannot simply update your YAML and expect the data to move. You must perform a migration.
For StarRocks FE pods, which store critical metadata, the most reliable method is an Offline Migration using a temporary "migrator" pod.
Step 1: Preparation & Backup
Before touching the storage, ensure your metadata is safe:
1. Create a metadata snapshot: Run this in your MySQL client:
sql
ALTER SYSTEM CREATE IMAGE;
2. Verify the snapshot: Check the FE logs (fe.log) for "push image.* successful" or check the /meta/image directory in your current EBS volume to ensure a recent image.XXXX file exists.
Step 2: Scale Down
Stop the FE pods to ensure no new metadata is written during the copy.
bash
# Update your StarRocksCluster CRD or Helm values to set replicas to 0
kubectl patch starrockscluster <cluster-name> --type='json' -p='[{"op": "replace", "path": "/spec/starRocksFeSpec/replicas", "value": 0}]'
Step 3: Create New PVCs
Create new PVCs that use your new StorageClass. You should create one for each FE pod (e.g., if you had 3 FEs, create 3 new PVCs).
* Name them temporarily: e.g., fe-meta-new-0, fe-meta-new-1.
* Match the size: Ensure they are at least the same size as the old EBS volumes.
Step 4: Copy Data (The "Migrator" Pod)
Use a temporary Pod to mount both the old and new volumes to copy the data.
yaml
apiVersion: v1
kind: Pod
metadata:
name: fe-migration-pod
spec:
containers:
- name: migrator
image: alpine
command: ["sleep", "3600"]
volumeMounts:
- name: old-vol
mountPath: /mnt/old
- name: new-vol
mountPath: /mnt/new
volumes:
- name: old-vol
persistentVolumeClaim:
claimName: fe-meta-kube-starrocks-fe-0 # Your old PVC name
- name: new-vol
persistentVolumeClaim:
claimName: fe-meta-new-0 # Your new PVC name
Once the pod is running:
bash
kubectl exec fe-migration-pod -- cp -av /mnt/old/. /mnt/new/
Repeat this for all FE nodes.
Step 5: Swap PVCs
For the StarRocks Operator to pick up the new volumes, the PVCs must match the names the Operator expects (e.g., fe-meta-<cluster-name>-fe-0).
1. Delete the old PVCs: kubectl delete pvc fe-meta-kube-starrocks-fe-0.
2. Update the new PVCs:
* If your StorageClass supports "Retain" policy, you can delete the temporary PVCs and recreate them with the original names but pointing to the new PVs.
* Alternative: The easiest way is to delete the old PVCs, update your StarRocksCluster CRD/Helm values with the new storageClassName, and then quickly copy the data into the newly created PVCs before the FE pods start.
Step 6: Update Configuration & Scale Up
1. Update your YAML: Update the storageClassName in your StarRocksCluster spec or Helm values.yaml.
2. Scale back up:
bash
kubectl patch starrockscluster <cluster-name> --type='json' -p='[{"op": "replace", "path": "/spec/starRocksFeSpec/replicas", "value": 3}]'
Important Notes
* File Permissions: StarRocks runs as a specific user (usually UID 1000). Ensure the copied files in /mnt/new have the correct ownership: chown -R 1000:1000 /mnt/new.
* Clean Start: If an FE fails to start after migration, check fe.warn.log. It is often due to an IP change or a locked bdb directory. If you are in HA (3 FEs), you can often start one "clean" and let it catch up, but copying the metadata folder is the faster way.
References
• administration/Meta_recovery.md
• deployment/shared_data/s3.md
• faq/operation_maintenance_faq.md
References
• administration/Meta_recovery.mdRumit Jain
06/08/2026, 11:36 AMRocky
06/08/2026, 11:40 AMsql
-- This creates a full snapshot of metadata and data pointers in S3
SELECT * FROM information_schema.cluster_snapshots;
2. Deploy a New Cluster: Create a new StarRocksCluster YAML (or Helm chart) using the new StorageClass.
3. Restore from Snapshot: Configure the new cluster's fe.conf or the Operator's spec to start from the snapshot URI. The FE will pull the metadata from S3 into the new EBS volumes automatically.
Case 2: Shared-nothing Cluster (Standard EBS Storage)
In the standard architecture, "Cluster Snapshot" as a single command does not exist. Instead, you use the BACKUP and RESTORE commands via a remote repository (S3/MinIO).
1. Create a Repository: Link both old and new clusters to the same S3 bucket.
2. Backup: BACKUP SNAPSHOT db_name.snapshot_1 TO repository_name;
3. New Cluster: Deploy a brand new StarRocks cluster using the new StorageClass.
4. Restore: RESTORE SNAPSHOT db_name.snapshot_1 FROM repository_name;
Note: BACKUP/RESTORE only moves data tables. You will have to manually recreate users, permissions, and resource groups in the new cluster.
──────────
Is there an easier way? (The "Rolling Migration" Strategy)
If you want to avoid a full backup/restore and keep the cluster online, the "Kubernetes native" way to change a StorageClass for BE nodes is to add new nodes and decommission old ones:
1. Update Configuration: Change the storageClassName in your StarRocksCluster CRD/Helm values.
2. Add New Nodes: Increase the replica count (e.g., from 3 to 6). The Operator will create 3 new BEs using the new StorageClass.
3. Decommission Old Nodes: Use ALTER SYSTEM DECOMMISSION BACKEND "host:port"; on the old nodes. StarRocks will automatically move the data shards (tablets) from the old EBS volumes to the new ones while the cluster is running.
4. Scale Down: Once data migration is 100% finished, decrease the replica count back to 3 and delete the old PVCs.
For FE Nodes: Since FE nodes are the "brain" and don't support automatic decommissioning for data migration, you must still use the Migrator Pod method mentioned earlier or the Shared-data Cluster Snapshot method.
References
• administration/cluster_snapshot.md
• administration/management/Backup_and_restore.md
• faq/operation_maintenance_faq.md
References
• administration/cluster_snapshot.md
• administration/management/Backup_and_restore.md
• faq/operation_maintenance_faq.md
• administration/Meta_recovery.md
• sql-reference/sql-statements/backup_restore/RESTORE.md
• sql-reference/sql-statements/backup_restore/BACKUP.md
• sql-reference/sql-statements/cluster-management/backend/DECOMMISSION_BACKEND.md
-BACKEND)Rocky
06/08/2026, 11:40 AMRocky
06/08/2026, 11:40 AMRocky
06/08/2026, 11:40 AMRocky
06/08/2026, 11:40 AMRocky
06/08/2026, 11:40 AMRocky
06/08/2026, 11:40 AMRocky
06/08/2026, 11:40 AMRocky
06/08/2026, 11:40 AMRocky
06/08/2026, 11:40 AMRumit Jain
06/08/2026, 11:42 AMRocky
06/08/2026, 11:42 AMstorageClassName field in a Kubernetes PVC is immutable. You cannot change it on an existing volume.
Here is the recommended workflow to migrate to a new StorageClass using the Cluster Snapshot feature in an FE+CN (shared-data) architecture:
1. Generate the Snapshot
In your current cluster, ensure you have a recent snapshot. By default, StarRocks maintains one automated snapshot, but you should verify it:
sql
SELECT * FROM information_schema.cluster_snapshots;
Note the storage_path of the latest snapshot. It will be something like <s3://your-bucket/path/to/snapshot/>.
2. Prepare the New Cluster Configuration
You cannot simply "update" the existing cluster's YAML because the Operator won't be able to change the existing PVCs.
1. Create a ConfigMap containing the cluster_snapshot.yaml file. This file tells the FE leader where to find the snapshot in S3.
yaml
cluster_snapshot:
cluster_snapshot_path: "<s3://your-bucket/path/to/snapshot/>"
storage_volume_name: "builtin_storage_volume" # Must match your original volume name
2. Define the new StarRocksCluster CRD (or update your Helm values) with:
* The new storageClassName for both FE and CN.
* A volume mount to put the cluster_snapshot.yaml into the FE's /opt/starrocks/fe/conf/ directory.
3. The "Clean Slate" Requirement
To perform a restore, the new storage must be empty.
* If you deploy a new cluster (recommended): The new PVCs will naturally be empty.
* If you reuse the same cluster name: You must delete the old PVCs (kubectl delete pvc ...) after scaling the cluster down to 0. If the old PVCs exist, the FE will try to start using the old metadata instead of triggered a restore.
4. Perform the Restore
The restore is triggered by the Leader FE starting with a specific flag.
* Manual/Operator: You need to ensure the Leader FE starts with the argument --cluster_snapshot.
* In the StarRocks Operator, you can temporarily add this to the feSpec.image.command or use the dedicated restore fields if your Operator version supports them (check your specific Operator version docs as this is a newer feature).
Summary: Why you need to "Delete"
* PVCs: Must be deleted/recreated because storageClassName cannot be changed.
* Cluster metadata: The restore process only works if the FE's /meta directory is empty.
* CN storage: The CN's local cache storage must also be clean to avoid consistency issues with the restored metadata.
Crucial Note: Since your data is already in S3 (shared-data), the "restore" is actually very fast—it only involves downloading the metadata (the FE "brain") from S3. The large data files remain in S3 and are simply re-mapped to the new cluster.
References
• administration/cluster_snapshot.md
• deployment/shared_data/minio.md
• deployment/shared_data/s3.mdRumit Jain
06/08/2026, 2:05 PMshow compute nodes\G;
*************************** 1. row ***************************
ComputeNodeId: 10033
IP: kube-starrocks-cn-0.kube-starrocks-cn-search.plattest04.svc.cluster.local
HeartbeatPort: 9050
BePort: 9060
HttpPort: 8040
BrpcPort: 8060
LastStartTime: 2026-06-08 11:56:56
LastHeartbeat: 2026-06-08 14:04:11
Alive: true
SystemDecommissioned: false
ClusterDecommissioned: false
ErrMsg:
Version: 4.0.1-cd9df36
CpuCores: 8
MemLimit: 12.960GB
NumRunningQueries: 0
MemUsedPct: 1.95 %
CpuUsedPct: 0.0 %
DataCacheMetrics: Status: Normal, DiskUsage: 61.2MB/159.8GB, MemUsage: 88.2KB/2.5GB
HasStoragePath: true
StatusCode: OK
StarletPort: 9070
WorkerId: 1
WarehouseName: default_warehouse
TabletNum: 58
*************************** 2. row ***************************
ComputeNodeId: 10032
IP: kube-starrocks-cn-1.kube-starrocks-cn-search.plattest04.svc.cluster.local
HeartbeatPort: 9050
BePort: 9060
HttpPort: 8040
BrpcPort: 8060
LastStartTime: 2026-06-08 10:48:01
LastHeartbeat: 2026-06-08 14:04:11
Alive: true
SystemDecommissioned: false
ClusterDecommissioned: false
ErrMsg:
Version: 4.0.1-cd9df36
CpuCores: 8
MemLimit: 12.960GB
NumRunningQueries: 0
MemUsedPct: 2.19 %
CpuUsedPct: 0.0 %
DataCacheMetrics: Status: Normal, DiskUsage: 60MB/159.8GB, MemUsage: 13.6MB/2.5GB
HasStoragePath: true
StatusCode: OK
StarletPort: 9070
WorkerId: 2
WarehouseName: default_warehouse
TabletNum: 58
2 rows in set (0.01 sec)Rocky
06/08/2026, 2:10 PMdefault_warehouse is that Storage Volumes and Warehouses are two completely different logical concepts in StarRocks. Changing a storage property does not affect compute organization.
1. Storage Volume vs. Warehouse
* Storage Volume (what you changed): When you enabled enable_partitioned_prefix (which I assume is what you mean by "partione enable"), you modified a property of the Storage Volume. This tells StarRocks how to organize files in S3 to avoid AWS request throttling. It has nothing to do with which nodes perform the computation.
* Warehouse (what you see in the output): A Warehouse is a logical grouping of Compute Nodes. By default, every CN added to a StarRocks cluster is assigned to the default_warehouse.
2. How to change the Warehouse Name
If your goal is to have nodes belong to a different warehouse (e.g., for resource isolation), you must explicitly create a warehouse and move the nodes into it.
Using SQL:
1. Create a new warehouse:
sql
CREATE WAREHOUSE analytics_warehouse;
2. Move a CN into it:
sql
-- Use the IP/Port from your SHOW COMPUTE NODES output
ALTER SYSTEM ADD COMPUTE NODE "kube-starrocks-cn-0...:9050" INTO WAREHOUSE analytics_warehouse;
Using the StarRocks Operator (Recommended for K8s):
If you are using the StarRocks Operator, you shouldn't use SQL to move nodes. Instead, you define multiple CN groups in your StarRocksCluster YAML. Each group can represent a different warehouse.
yaml
spec:
starRocksCnSpec:
# This remains the default group
replicas: 2
# You can add additional CN groups (Warehouses) here
# depending on your Operator version support for Multi-Warehouse
3. Why the "Partition Enable" didn't change it
The property "aws.s3.enable_partitioned_prefix" = "true" is a setting for the builtin_storage_volume (the "Storage Class" of your data in S3).
* It improves performance by using multiple prefixes in your S3 bucket.
* It does not change the name of the compute cluster (Warehouse) that accesses that data.
Summary:
Your CNs are correctly showing default_warehouse because they have not been assigned to a custom Warehouse. Your "partition enable" setting is working in the background on the storage layer (S3), but it won't reflect in the WarehouseName column of your CN metadata.
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• introduction/Architecture.md
• administration/Scale_up_down.md
• administration/Scale_up_down.md
• administration/Scale_up_down.md
• administration/Scale_up_down.md
• administration/Scale_up_down.md
• administration/Scale_up_down.md
• administration/Scale_up_down.md
• administration/Scale_up_down.md
• administration/Scale_up_down.md
• administration/Scale_up_down.md
• administration/Scale_up_down.mdRocky
06/08/2026, 2:10 PMRocky
06/08/2026, 2:10 PMRocky
06/08/2026, 2:10 PMRocky
06/08/2026, 2:10 PMRocky
06/08/2026, 2:10 PMRocky
06/08/2026, 2:10 PMRocky
06/08/2026, 2:10 PMRocky
06/08/2026, 2:10 PMRocky
06/08/2026, 2:10 PMRumit Jain
06/08/2026, 2:40 PMSHOW PROC '/dbs/test_sharding';
+---------+------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+--------------------------------------------------------------------------------------------+
| TableId | TableName | IndexNum | PartitionColumnName | PartitionNum | State | Type | LastConsistencyCheckTime | ReplicaCount | PartitionType | StoragePath |
+---------+------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+--------------------------------------------------------------------------------------------+
| 10193 | test_table | 1 | | 1 | NORMAL | CLOUD_NATIVE | NULL | 16 | UNPARTITIONED | <s3://starrocks-data/6b3b436b-7279-42f6-ad9c-0d3a07cc39b7/db10191/10193> |
| 15238 | crashdata | 1 | | 1 | NORMAL | CLOUD_NATIVE | NULL | 3 | UNPARTITIONED | <s3://starrocks-data/6b3b436b-7279-42f6-ad9c-0d3a07cc39b7/db10191/15238> |
+---------+------------+----------+---------------------+--------------+--------+--------------+--------------------------+--------------+---------------+--------------------------------------------------------------------------------------------+
2 rows in set (0.01 sec)Rocky
06/08/2026, 2:41 PMUNPARTITIONED status you see in the SHOW PROC output refers to the logical schema of the table, not the physical storage layout or the Storage Volume settings.
Here is the breakdown of why it shows that:
1. Logical vs. Physical Partitioning
* Logical (PartitionType column): This indicates whether you used the PARTITION BY clause (e.g., PARTITION BY RANGE(date_col)) when you created the table.
* If you didn't define partitions in your CREATE TABLE statement, StarRocks creates one single internal partition to hold all data.
* The PartitionType for such a table is always UNPARTITIONED.
* Physical (enable_partitioned_prefix): This is a Storage Volume property. It tells StarRocks how to write files into S3 (using hashed prefixes like `s3://bucket/hash/path/...`) to avoid AWS S3 request rate limits.
2. How to verify your "Partitioned" Storage
The change you made to the Storage Class (Storage Volume) is working in the background. It will not change the PartitionType of your tables because that column is reserved for SQL-level data partitioning.
To verify that your storage volume actually has the partitioned prefix enabled, you should use:
sql
SHOW STORAGE VOLUMES;
Look for the Properties column of your volume. You should see "aws.s3.enable_partitioned_prefix": "true".
Summary
* PartitionType = UNPARTITIONED: This is normal if you haven't used PARTITION BY in your DDL. It doesn't mean your storage isn't optimized.
* PartitionNum = 1: This confirms the table is a single logical unit.
* StoragePath: Notice the S3 path in your output. Even with partitioned prefixes enabled, the "logical" root path of the table remains the same in this view. The actual file-level partitioning happens inside the sub-directories in S3 (e.g., inside the tablet folders).
If you want to see a table show something other than UNPARTITIONED, you would need to recreate the table with a partition strategy:
sql
CREATE TABLE test_table_partitioned (
id INT,
event_date DATE
)
PARTITION BY RANGE(event_date) (
PARTITION p1 VALUES LESS THAN ("2024-01-01")
)
...
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROC.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• table_design/Data_distribution.md
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROC.mdRumit Jain
06/09/2026, 2:14 AMRocky
06/09/2026, 2:15 AMsql
SELECT * FROM information_schema.cluster_snapshots;
Take note of the storage_path (e.g., `s3://my-bucket/snapshots/...`).
2. Backup your current StarRocksCluster YAML: Ensure you have your current configuration saved.
3. Delete the existing cluster and PVCs:
* Delete the StarRocksCluster CR.
* Delete the FE PVCs: kubectl delete pvc -l "<http://starrockscluster.starrocks.com/component=fe|starrockscluster.starrocks.com/component=fe>".
4. Prepare the Restore Config:
* Create a ConfigMap containing a cluster_snapshot.yaml that points to the storage_path from Step 1.
5. Deploy with New StorageClass:
* Update your StarRocksCluster YAML (or Helm values) with the new storageClassName.
* Mount the ConfigMap into the FE pods at /opt/starrocks/fe/conf/.
* Add the --cluster_snapshot flag to the FE startup command.
6. Verify: Once the FE starts, it will download the metadata from S3 into the new EBS volumes automatically.
──────────
Option 2: Rolling Migration (No Downtime)
If you have a 3-node FE cluster and want to avoid downtime, you can do a rolling replacement. However, the StarRocks Operator currently applies one StorageClass to the entire FE group, so you cannot simply "update" the YAML.
Steps:
1. Add a new FE group (if supported): Some Operator versions allow adding "Observer" nodes or a second FE group. You could add new FEs with the new StorageClass.
2. Sync: The new FEs will join the cluster and sync the metadata from the Leader automatically over the network.
3. Decommission: Once the new FEs are Alive and synced, you decommission the old FEs one by one.
4. Promote: Ensure the new FEs are promoted to Followers/Leader.
Note: This is more complex to orchestrate via the Operator than Option 1.
──────────
Option 3: Manual EBS Copy (Not Recommended)
If you prefer not to use the Snapshot feature, you would have to manually move the metadata.
Steps:
1. Scale FE to 0.
2. Create new PVCs using the new StorageClass manually.
3. Spin up a "Migration Pod" (e.g., an Ubuntu image) that mounts both the old EBS PVC and the new EBS PVC.
4. Copy the data: cp -a /old-meta/* /new-meta/.
5. Update the StarRocksCluster CR to use the new StorageClass.
6. Scale FE back up.
Conclusion
Do you need to copy all metadata from the existing EBS volumes?
* If using Option 1 (Snapshot): No. StarRocks handles the "copy" via S3.
* If using Option 3 (Manual): Yes, you must copy the entire meta/ directory exactly (preserving permissions).
Best Solution: Use Option 1. It is the native way StarRocks manages state migration in the cloud and ensures that the metadata in your new EBS volumes is perfectly consistent with the data already in S3.
References
• administration/cluster_snapshot.md
• faq/operation_maintenance_faq.md
• administration/Meta_recovery.md
References
• administration/cluster_snapshot.mdRocky
06/09/2026, 2:15 AMRumit Jain
06/09/2026, 2:18 AMaws_s3_enable_partitioned_prefix=true
aws_s3_num_partitioned_prefix=64
in fe config only. BUt as you suggested, I need to create a new storage volume make it default with these settings. I already was using default storage volume. Now want to switch to this noew storage volume having partioned actually enabled. What are the steps. How to make sure I do not loose any data?Rocky
06/09/2026, 2:18 AMenable_partitioned_prefix property is immutable (cannot be changed on an existing volume), you cannot simply "fix" your current builtin_storage_volume.
1. The Safety Rule: Don't Drop the Old Volume
In StarRocks shared-data mode, each table is permanently linked to the storage volume that was active (default) when the table was created.
* Existing tables will continue to use the builtin_storage_volume.
* If you drop or disable the old volume, you will lose access to those tables.
* Changing the "Default" volume only affects newly created tables.
2. Step-by-Step Migration Process
Step A: Create the New Storage Volume
Create a new volume (e.g., partitioned_s3_volume) with your desired settings.
Note: The LOCATIONS must be a bucket root (e.g., <s3://my-bucket>) without a sub-path if you want the partitioned prefix to work correctly.
sql
CREATE STORAGE VOLUME partitioned_s3_volume
TYPE = S3
LOCATIONS = ("<s3://your-bucket-name>") -- Use your existing or a new bucket
PROPERTIES
(
"enabled" = "true",
"aws.s3.region" = "us-east-1", -- Change to your region
"aws.s3.endpoint" = "<https://s3.us-east-1.amazonaws.com>",
"aws.s3.use_instance_profile" = "true", -- Or provide access/secret keys
"aws.s3.enable_partitioned_prefix" = "true",
"aws.s3.num_partitioned_prefix" = "64"
);
Step B: Set the New Volume as Default
This command tells StarRocks that all future CREATE TABLE or CREATE DATABASE commands should use this volume by default.
sql
SET partitioned_s3_volume AS DEFAULT STORAGE VOLUME;
Step C: Handle Existing Data
Your existing tables (like test_table and crashdata) are still using the old builtin_storage_volume. To move them to the new partitioned storage:
1. Create a new table: Create a new table with the same schema. Since the new volume is default, it will automatically use the partitioned prefix.
2. Migrate data:
sql
INSERT INTO new_table SELECT * FROM old_table;
3. Verify and Swap: After verification, you can drop the old table and rename the new one.
Summary of what happens:
* Existing data: Stays in the old builtin_storage_volume path. It is safe and accessible.
* System Metadata: New system statistics and metadata will begin to be stored in the new default volume.
* No Data Loss: As long as you do not DROP STORAGE VOLUME builtin_storage_volume, all your old data remains fully functional.
Verification
To confirm which volume a table is using, run:
sql
SHOW CREATE TABLE <table_name>\G
Look for "storage_volume" = "..." in the properties. If it's missing, it's using whatever was default at the time of creation.
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/SET_DEFAULT_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.md
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.mdRocky
06/09/2026, 2:18 AMaws_s3_enable_partitioned_prefix and aws_s3_num_partitioned_prefix in fe.conf do not apply to the built-in storage volume automatically created by StarRocks. Furthermore, these properties are immutable and cannot be enabled on an existing volume via ALTER.
Here are the steps to switch to a new storage volume with partitioned prefixes enabled without losing data.
Step 1: Create the New Storage Volume
Run this SQL to create a volume where the partitioned prefix is actually active. You can point this to the same S3 bucket you are currently using; StarRocks will use a different path structure for this volume.
sql
CREATE STORAGE VOLUME partitioned_s3_volume
TYPE = S3
LOCATIONS = ("<s3://your-bucket-name>") -- Use your actual bucket name
PROPERTIES
(
"enabled" = "true",
"aws.s3.region" = "us-east-1", -- Use your region
"aws.s3.endpoint" = "<https://s3.us-east-1.amazonaws.com>",
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.enable_partitioned_prefix" = "true",
"aws.s3.num_partitioned_prefix" = "64"
);
Step 2: Set as Default
Setting the new volume as default ensures that all newly created databases and tables will use the partitioned prefix.
sql
SET partitioned_s3_volume AS DEFAULT STORAGE VOLUME;
Step 3: Migrate Existing Data (Preventing Data Loss)
Crucial Note: Existing tables will not automatically move to the new volume. They are "pinned" to the volume they were created on. If you want your existing data to benefit from the partitioned prefix, you must migrate it manually.
1. Check your existing tables:
They still point to the old volume (likely named builtin_storage_volume).
2. Create a new table:
Since you set the new volume as default, a simple CREATE TABLE will now use the partitioned volume.
sql
CREATE TABLE new_test_table LIKE old_test_table;
3. Migrate the data:
sql
INSERT INTO new_test_table SELECT * FROM old_test_table;
4. Swap the tables:
sql
ALTER TABLE old_test_table RENAME backup_old_table;
ALTER TABLE new_test_table RENAME old_test_table;
How to ensure no data loss?
1. Do not drop the old volume: As long as your old storage volume exists and is enabled, your existing tables will continue to work perfectly. They just won't use the "partitioned prefix" optimization.
2. Verify before dropping: Only after you have successfully migrated all data to the new tables and verified the counts/data should you drop the old tables.
3. Inheritance: Remember that the storage_volume property is inherited. If you created a Database while the old volume was default, existing tables in that DB are tied to the old volume. New tables in that same DB will now use the new default volume.
Summary of Status
* New Tables: Will show the new volume and use the partitioned prefix in S3.
* Old Tables: Will stay on the old volume. SHOW PROC '/dbs/...' will still show the old S3 path for them.
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• deployment/shared_data/feature-support-shared-data.md
References
• deployment/shared_data/s3.md
• quick_start/shared-data.mdRumit Jain
06/09/2026, 2:23 AMRocky
06/09/2026, 2:23 AMSELECT, INSERT, UPDATE, and DELETE data in those old tables.
* Metadata: StarRocks keeps the connection to the old S3 path active as long as the old storage volume is still ENABLED.
2. No Automatic Migration
Setting a new volume as DEFAULT only affects newly created databases and tables. It does not trigger any background movement of data for existing tables.
3. Performance Difference
This is the only "downside" of not migrating:
* Old Tables: Will continue to use the standard S3 path structure. They will not benefit from the aws_s3_enable_partitioned_prefix optimization, even if that feature is enabled on the new default volume.
* New Tables: Will be created on the new volume and will use the partitioned prefix optimization.
4. What you MUST NOT do
To ensure you don't lose access, do not drop or disable the old storage volume.
* If you run DROP STORAGE VOLUME <old_volume>, you will lose access to the data for all tables still associated with it.
* The system will generally prevent you from dropping a volume that still has tables depending on it, but you should keep it ENABLED.
Summary
If you are okay with your existing tables not having the "Partitioned Prefix" optimization, you don't need to do anything. You can just leave them as they are and only use the new volume for your new data.
If you eventually want the old tables to be optimized, you can migrate them one by one using INSERT INTO new_table SELECT * FROM old_table at your convenience.
References
• deployment/shared_data/feature-support-shared-data.md
• sql-reference/sql-statements/cluster-management/storage_volume/SET_DEFAULT_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
References
• sql-reference/sql-statements/cluster-management/storage_volume/SET_DEFAULT_STORAGE_VOLUME.md
• quick_start/shared-data.md
• deployment/shared_data/azure.md
• deployment/shared_data/s3.md
• deployment/shared_data/hdfs.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.mdRumit Jain
06/09/2026, 2:30 AMRocky
06/09/2026, 2:30 AMADMIN SET AUTOMATED CLUSTER SNAPSHOT ON.
* Data Consistency: StarRocks does not copy the actual data files (the .parquet or segment files) into a separate "snapshot folder." Instead, because S3 data in shared-data mode is immutable, the metadata snapshot simply records exactly which S3 objects represent your tables at that specific moment.
* Coverage: The snapshot automatically covers all tables in the cluster, regardless of which storage volume they reside on.
2. How to Recover the Cluster
If you need to recover a cluster where data is split across two volumes (Old and New), you must use the cluster_snapshot.yaml file.
The Key Rule: Your cluster_snapshot.yaml must define both storage volumes so that the restored FE knows where to find the data for every table.
Recovery Steps:
1. Identify the Snapshot Path: Find the path from information_schema.cluster_snapshots.
2. Configure `cluster_snapshot.yaml`: You must list both volumes in the storage_volumes section.
yaml
cluster_snapshot:
cluster_snapshot_path: <s3://your-bucket/path-to-snapshot/>
storage_volume_name: partitioned_s3_volume # The volume where metadata is stored
storage_volumes:
• name: builtin_storage_volume # YOUR OLD VOLUME
type: S3
location: <s3://your-bucket/old-path/>
properties:
• key: aws.s3.region
value: us-east-1
# ... other old creds ...
• name: partitioned_s3_volume # YOUR NEW VOLUME
type: S3
location: <s3://your-bucket/new-path/>
properties:
• key: aws.s3.region
value: us-east-1
• key: aws.s3.enable_partitioned_prefix
value: "true"
• key: aws.s3.num_partitioned_prefix
value: "64"
# ... other new creds ...
3. Start FE with Snapshot Flag:
bash
./fe/bin/start_fe.sh --cluster_snapshot --daemon
The FE will read the YAML, recreate both storage volumes with the correct configurations, and restore the metadata. Once the metadata is loaded, your tables will point to the correct files in their respective S3 paths.
Best Practice Tip
To make recovery easier, ensure that your cluster_snapshot.yaml is always kept up to date whenever you add a new storage volume. If you forget to include the "Old" volume in the recovery YAML, the restored cluster will not know how to access the S3 data for those older tables, and they will appear as "Inaccessible" or throw errors when queried.
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.mdRumit Jain
06/09/2026, 2:47 AMRocky
06/09/2026, 2:48 AMm6i.4xlarge or c6i.4xlarge). While 8 cores is the minimum, 16 cores provides better planning performance for complex queries.
* RAM: 64 GB. StarRocks FEs keep metadata in memory; 64 GB is a safe production baseline.
* EBS Storage: GP3 (100 GB - 200 GB).
* FE metadata is relatively small, but disk latency affects the speed of metadata journaling (BDBJE).
* Recommendation: Use GP3 with at least 3,000 IOPS and 125 MB/s throughput. IO2 is typically overkill for FE metadata unless you have an extremely high rate of schema changes or table creations.
* AZ Distribution: Spread across 3 Availability Zones (1 FE per AZ).
2. CN (Compute) Nodes
CN nodes are stateless for data but stateful for Data Cache. The performance of your cluster depends heavily on the speed and size of the local EBS volumes used for caching.
* Count: At least 2-3 nodes. You can scale this horizontally based on query volume.
* CPU: 16 to 32 vCPU. (e.g., c6i.4xlarge or c6i.8xlarge).
* RAM: 64 GB to 128 GB. Memory is used for query intermediate results and the LRU metadata cache.
* EBS Storage (The Data Cache): GP3.
* Sizing: The cache should be sized to hold your "hot" data. A common rule of thumb is 20-30% of your total data size (depending on how much data you access frequently).
* Configuration: For the best performance, use GP3. Ensure you provision enough throughput (at least 500 MB/s to 1000 MB/s depending on the instance size) to match the compute speed.
* Why GP3? GP3 offers a better price-to-performance ratio than IO2 for the bursty read/write patterns of a data cache.
* AZ Distribution: Evenly distributed across the same 3 AZs used by the FEs to minimize cross-AZ data transfer costs.
3. Summary Sizing Table (Production Baseline)
Component | Instance Type (AWS) | CPU | RAM | EBS Type | EBS Size
FE | m6i.4xlarge | 16 | 64GB | GP3 | 200 GB
CN | c6i.8xlarge | 32 | 64GB | GP3 | 1 TB+ (Cache)
Key Recommendations for Production:
1. Local Cache is King: In shared-data mode, if your query misses the local cache, it must go to S3, which can be 10x slower. Always provision enough GP3 disk space on CNs to act as a substantial cache (storage_root_path in cn.conf).
2. Network Bandwidth: Choose instance types with "Up to 10 Gbps" or higher network performance. Shared-data architecture relies heavily on moving data from S3 to CNs.
3. Use a Load Balancer: Put your FEs behind an AWS Network Load Balancer (NLB) so your application has a single endpoint to connect to.
4. Monitoring: Monitor the capacity vs used_capacity of the CN cache disks and the FE metadata disk latency.
References
• deployment/plan_cluster.md
• introduction/Architecture.md
• deployment/shared_data/s3.md
• administration/management/FE_configuration.md
References
• deployment/shared_data/azure.md
• deployment/shared_data/s3.md
• introduction/Architecture.md
• deployment/shared_data/hdfs.mdRumit Jain
06/09/2026, 2:50 AMRocky
06/09/2026, 2:51 AMRocky
06/09/2026, 2:52 AMm6i or c6i stands for Intel (specifically Intel Xeon Scalable processors, such as Ice Lake or Sapphire Rapids).
In a StarRocks production environment, Intel-based instances are frequently recommended for several technical reasons:
1. Vectorized Execution & SIMD (AVX-512)
StarRocks is a fully vectorized engine, meaning it processes data in columnar batches rather than row-by-row. To do this efficiently, it relies on SIMD (Single Instruction, Multiple Data) instructions.
* AVX-512: Intel’s "i" series instances (starting from the 6th generation) support the AVX-512 instruction set. This allows the CPU to process much larger chunks of data in a single clock cycle compared to older standards like AVX2.
* Performance Impact: The docs note that making full use of SIMD can enhance operator performance by 3 to 10 times. Intel’s implementation of AVX-512 is mature and deeply integrated with StarRocks' execution logic.
2. High Clock Speeds and Memory Bandwidth
"Compute-optimized" Intel instances (the C series, like c6i) are designed for high-performance computing (HPC). They typically offer high sustained clock speeds, which is critical for the "Compute Node" (CN) during complex join operations or heavy aggregations where raw CPU frequency matters.
3. Predictability and Stability
Intel-based instances have been the standard for high-performance databases for years. Many of the low-level libraries used by StarRocks (such as those for compression, SIMD, and string processing) were originally optimized for Intel architecture. While AMD and ARM (Graviton) are now excellent options, Intel is often chosen for "mission-critical" production environments where compatibility and predictable performance are the top priorities.
──────────
Comparison with Other Suffixes:
* "a" (AMD - e.g., m6a): These use AMD EPYC processors. They are usually 10% cheaper than Intel and offer more cores per dollar. While StarRocks runs great on AMD (using AVX2), Intel's AVX-512 can sometimes edge them out in specialized analytical workloads.
* "g" (Graviton/ARM - e.g., c7g): These are AWS-built ARM processors. StarRocks recently added deep support for Graviton3, which can offer a 50% price-performance boost. If you are looking to optimize for cost, Graviton is now a top-tier recommendation, but "i" series remains the "safe" standard for maximum raw performance per core.
Recommendation:
* Use i series (m6i, c6i) if you want the most mature support for StarRocks’ vectorized optimizations (AVX-512).
* Use g series (m7g, c7g) if you want the best price-to-performance and are comfortable using ARM-running on ARM architecture.
References
• faq/Deploy_faq.md
• introduction/Features.md
• faq/Others.md
• table_design/indexes/vector_index.md
• unloading/arrow_flight.md
• using_starrocks/jit.mdRumit Jain
06/09/2026, 7:10 AMkube-starrocks-fe-1.kube-starrocks-fe-search.devtest03.svc.cluster.local_9010_1774494218293 | 50332130 | sr_dml_user | 10.218.120.25:38062 | | Sleep | 2026-06-09 05:39:49 | 5207 | EOF | SELECT model_name, model_meta_json FROM lakehouse_meta.model_meta WHERE model_name = 'opus-metrics:tlqeOpusMetricsTimerCounterTest'; | false | default_warehouse | | NULL | NULL |
| kube-starrocks-fe-1.kube-starrocks-fe-search.devtest03.svc.cluster.local_9010_1774494218293 | 50332133 | sr_dml_user | 10.218.43.90:38738 | | Sleep | 2026-06-09 05:40:25 | 5172 | EOF | SELECT model_name, model_meta_json FROM lakehouse_meta.model_meta WHERE model_name = 'tlqe-tldbtestapp:testTldbLakehouseObject'; | false | default_warehouse | | NULL | NULL |
| kube-starrocks-fe-1.kube-starrocks-fe-search.devtest03.svc.cluster.local_9010_1774494218293 | 50332141 | sr_admin_user | 10.218.116.140:52838 | | Sleep | 2026-06-09 05:41:07 | 5130 | OK | CREATE DATABASE IF NOT EXISTS opus_metrics | | default_warehouse | | NULL | NULL |
| kube-starrocks-fe-1.kube-starrocks-fe-search.devtest03.svc.cluster.local_9010_1774494218293 | 50332142 | sr_admin_user | 10.218.81.235:47996 | | Sleep | 2026-06-09 05:41:26 | 5109 | OK | CREATE DATABASE IF NOT EXISTS sampledb | | default_warehouse | | NULL | NULL |Rocky
06/09/2026, 7:10 AMsearch service) use connection pools.
Here is a breakdown of what those columns mean in your output:
1. Command: Sleep
This means the connection is Idle. The client (your application) has finished its last query but has not closed the connection. It is keeping the connection open so it can reuse it for the next request without the overhead of a new handshake.
2. Time: 5100 - 5200
This is the number of seconds the connection has been in the "Sleep" state.
* In your case, these connections have been idle for about 1.4 to 1.5 hours.
* StarRocks has a default wait_timeout of 28,800 seconds (8 hours). It will automatically close these connections if they remain idle for longer than that.
3. State: EOF / OK
This refers to the result of the last command executed on that connection before it went to sleep:
* EOF: The last command was a SELECT (like your lakehouse_meta.model_meta queries), and the result set was fully sent to the client.
* OK: The last command was a DDL/DML statement (like CREATE DATABASE IF NOT EXISTS), which completed successfully.
4. Info: SELECT ... / CREATE DATABASE ...
This column shows the last query that was run on that specific connection. It does not mean the query is currently running. If the query were still running, the Command would be Query instead of Sleep.
──────────
Why are there so many?
In Kubernetes, services often use libraries like HikariCP (Java) or database/sql (Go) that maintain a "minimum idle" number of connections. These connections stay "warm" to ensure fast response times for your application.
When should you worry?
These are only a problem if:
1. Connection Limit: You reach the maximum allowed connections (default is often 1024). You can check this with SHOW PROPERTY FOR 'root' LIKE 'max_user_connections'.
2. Resource Exhaustion: You have thousands of idle connections consuming FE memory.
How to clean them up (Optional)
If you want StarRocks to close idle connections sooner, you can reduce the wait_timeout (global or session):
sql
-- Set idle timeout to 1 hour (3600 seconds)
SET GLOBAL wait_timeout = 3600;
Conclusion: Your cluster is healthy. These entries simply show that your application is efficiently reusing connections.
References
• sql-reference/System_variable.md
• faq/operation_maintenance_faq.md
• faq/Sql_faq.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.md
• administration/management/resource_management/Query_management.mdRumit Jain
06/09/2026, 8:14 AMRocky
06/09/2026, 8:14 AMsql
CREATE STORAGE VOLUME snapshot_s3_volume
TYPE = S3
LOCATIONS = ("<s3://your-snapshot-bucket-name/snapshots/>")
PROPERTIES (
"aws.s3.region" = "us-east-1",
"aws.s3.access_key" = "YOUR_ACCESS_KEY",
"aws.s3.secret_key" = "YOUR_SECRET_KEY"
);
Step 2: Enable Automated Snapshots using the Volume
Run the following command to enable the automated snapshot feature and point it to the volume you just created:
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME snapshot_s3_volume;
Important Technical Details:
* Metadata vs. Data: When you specify a separate volume for snapshots, StarRocks stores the FE metadata (catalogs, permissions, table structures, and pointers to data files) in the snapshot bucket.
* Data Persistence: In shared-data mode, the actual data files (segment files) are stored in your primary S3 bucket and are immutable. The "snapshot" in the snapshot bucket contains the manifest/metadata that points to these specific files.
* Storage Location:
* Metadata snapshots will be in: <s3://your-snapshot-bucket-name/snapshots/{cluster_id}/meta/>...
* Data snapshots (references): Because shared-data mode uses immutable files, the snapshot "data" is effectively the state of the metadata pointing to those files. The physical data files do not get copied to the new bucket; they remain in the original bucket to save costs and time.
* Interval: You can control how often snapshots are taken (default is every 10 minutes) by modifying the FE configuration:
sql
ADMIN SET FRONTEND CONFIG ("automated_cluster_snapshot_interval_seconds" = "3600"); -- Every 1 hour
To verify the setup:
You can check the status of your automated snapshots and the volume being used:
sql
SHOW STORAGE VOLUMES;
-- You can also check FE logs (fe.log) for "AutomatedClusterSnapshot" tasks
Note: If your goal is to have a full physical copy of the data in a separate bucket for "cold" backup/air-gapping, the Cluster Snapshot feature is designed for Disaster Recovery (DR) and relies on the original data files. For a full physical data copy, you would typically use S3-level replication (Cross-Region Replication) between the two buckets.
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
• deployment/shared_data/s3.md
References
• administration/cluster_snapshot.md
• deployment/shared_data/feature-support-shared-data.md
• introduction/Architecture.md
• deployment/shared_data/s3.mdRumit Jain
06/09/2026, 8:35 AMRocky
06/09/2026, 8:35 AMaws.s3.enable_partitioned_prefix to the storage volume used for automated snapshots.
While it is technically supported, it is generally not recommended for a dedicated snapshot bucket for the following reasons:
1. Low Request Volume
The purpose of aws.s3.enable_partitioned_prefix is to avoid AWS S3 rate limits (3,500–5,500 requests per second) by spreading files across many sub-folders.
* Data Bucket: Needs this because it handles thousands of small segment files and high-concurrency reads/writes.
* Snapshot Bucket: Only stores FE metadata images (checkpoints). By default, this happens once every 10 minutes. Since the number of files and request frequency are extremely low, you will never hit S3 rate limits on this bucket.
2. Path Restrictions
If you enable aws.s3.enable_partitioned_prefix, StarRocks imposes a strict rule: the LOCATIONS property must only contain the bucket name (e.g., <s3://my-snapshot-bucket>). You cannot specify a sub-folder like /snapshots/.
* If you want to keep your snapshots organized in a specific prefix, it is easier to not enable this feature so you can define the exact path in the LOCATIONS parameter.
Summary of Recommendation
* Main Data Bucket: Yes, enable aws.s3.enable_partitioned_prefix for performance and scalability.
* Snapshot Bucket: No, leave it as false (default) to keep your snapshot directory structure simple and predictable.
Corrected Example for Snapshot Volume
If you want to keep your snapshots in a specific folder, use this configuration:
sql
CREATE STORAGE VOLUME snapshot_s3_volume
TYPE = S3
-- Specify the sub-path here. Do NOT use partitioned prefix.
LOCATIONS = ("<s3://your-snapshot-bucket-name/starrocks_backups/>")
PROPERTIES (
"enabled" = "true",
"aws.s3.region" = "us-east-1",
"aws.s3.access_key" = "...",
"aws.s3.secret_key" = "...",
"aws.s3.enable_partitioned_prefix" = "false" -- Default is false
);
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/cluster_snapshot.md
• deployment/shared_data/s3.md
• administration/management/FE_configuration.md
• administration/Backup_and_restore.md
• sql-reference/sql-statements/cluster-management/storage_volume/DESC_STORAGE_VOLUME.md
References
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/cluster_snapshot.mdRumit Jain
06/09/2026, 9:51 AMRocky
06/09/2026, 9:51 AMDEFAULT STORAGE VOLUME, existing databases keep their original configuration.
* New Tables: If you create a new table in an existing database:
* If you do not specify a storage_volume in the table properties, it inherits the volume assigned to the database.
* If the database was created using the "old" volume, the new table will also use the "old" volume.
* If you want the new table to use the "new" volume (with the partitioned prefix), you must either specify it during CREATE TABLE or ALTER the database's default volume first.
2. Can one database have tables in different storage volumes?
Yes. This is fully supported.
StarRocks follows an inheritance model for storage volumes:
Default Catalog (Global Default) → Database → Table.
You can have:
* Table A: Residing in old_volume (without partitioned prefix).
* Table B: Residing in new_volume (with enable_partitioned_prefix = true).
* Both tables belonging to the same database (e.g., sales_db).
3. How to implement this
To have two tables in the same database using different volumes, you specify the volume in the PROPERTIES section:
sql
-- This table uses the database default (likely the old volume)
CREATE TABLE table_old (
id INT,
data STRING
) DISTRIBUTED BY HASH(id);
-- This table explicitly uses the new volume with the partitioned prefix
CREATE TABLE table_new (
id INT,
data STRING
)
DISTRIBUTED BY HASH(id)
PROPERTIES (
"storage_volume" = "new_partitioned_s3_volume"
);
Summary of Behavior
Action | Result
Create new volume | No effect on existing data.
Set new volume as DEFAULT | Only affects newly created databases (if they don't specify a volume).
Create table in old DB | Uses the volume assigned to that DB (usually the old one).
Mixing tables | Allowed. Each table's data is stored according to its own storage_volume settings.
Important Note on `partitioned_prefix`:
Because enable_partitioned_prefix changes the physical directory structure on S3 (adding hash-based subfolders), you cannot simply ALTER an existing table to switch from a non-partitioned volume to a partitioned one. You would typically need to create a new table with the new volume and use INSERT INTO ... SELECT to migrate the data.
References
• deployment/shared_data/feature-support-shared-data.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• faq/shared_data_faq.md
References
• deployment/shared_data/feature-support-shared-data.md
• quick_start/shared-data.md
• deployment/shared_data/s3.mdRumit Jain
06/09/2026, 9:55 AMRocky
06/09/2026, 9:55 AMALTER command.
While you can change the default storage volume for a database, this only affects future tables. It does not physically move or re-organize the existing data files for tables already in that database.
1. What happens when you ALTER DATABASE?
If you run:
sql
ALTER DATABASE my_db SET ("storage_volume" = "new_partitioned_volume");
* Existing Tables: Their data remains in the old bucket in the old format. They will continue to read from and write new data to the old volume because the volume property is fixed at the table level once it is created.
* New Tables: Any table created in my_db after this command (without specifying its own volume) will use the new volume and the partitioned prefix.
2. Why can't you just "switch" the volume for existing data?
The enable_partitioned_prefix property changes the physical directory structure on S3.
* Non-partitioned: <s3://bucket/cluster_id/db_id/table_id/>...
* Partitioned: <s3://bucket/<hash_prefix>/cluster_id/db_id/table_id/>...
Because StarRocks shared-data tables rely on these specific paths to find their data files, simply changing a metadata flag in the database wouldn't work—the data files are physically in the "wrong" place for the partitioned logic to find them.
3. How to actually "Move" the data
To move your data to a new volume with the partitioned prefix enabled, you must re-write the data so StarRocks can organize it into the new S3 directory structure:
1. Create the new Storage Volume with aws.s3.enable_partitioned_prefix = true.
2. Create a new table (e.g., table_v2) and specify the new storage volume in the properties.
3. Migrate the data using an INSERT INTO ... SELECT statement:
sql
INSERT INTO table_v2 SELECT * FROM table_v1;
4. Swap the tables once the migration is complete:
sql
ALTER TABLE table_v1 RENAME table_v1_old;
ALTER TABLE table_v2 RENAME table_v1;
Summary
* Logical Move (Defaults): Use ALTER DATABASE (affects new tables only).
* Physical Move (Existing Data): Requires INSERT INTO ... SELECT into a new table tied to the new volume.
References
• sql-reference/sql-statements/Database/ALTER_DATABASE.md
• deployment/shared_data/feature-support-shared-data.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• faq/shared_data_faq.md
References
• quick_start/shared-data.md
• faq/shared_data_faq.md
• deployment/shared_data/feature-support-shared-data.md
• deployment/shared_data/s3.mdRumit Jain
06/09/2026, 11:45 AMALTER DATABASE test_sharding SET ("storage_volume" = "sharded_v1");
ERROR 1064 (HY000): Getting syntax error at line 1, column 33. Detail message: No viable statement for input 'ALTER DATABASE test_sharding SET ('.Rocky
06/09/2026, 11:45 AMPROPERTIES keyword, or that the property-style SET is not being recognized by the parser in your current context.
Try using the following syntax instead:
sql
ALTER DATABASE test_sharding SET PROPERTIES ("storage_volume" = "sharded_v1");
Why the error might be happening:
1. Missing PROPERTIES Keyword: While some documentation shows SET ("key" = "value"), many versions of StarRocks strictly require SET PROPERTIES ("key" = "value") when modifying database-level attributes.
2. Shared-Nothing Cluster: Storage volumes are a feature exclusive to Shared-Data (compute-storage decoupled) clusters. if you are running a standard Shared-Nothing cluster (using local BE storage), the storage_volume property is not supported and may result in a syntax error because the parser doesn't recognize the storage volume grammar.
3. Catalog Restriction: You can only set or alter storage volumes for databases within the default_catalog. If you are trying to perform this on a database in an external catalog (like Hive or Iceberg), it will fail.
4. Version Compatibility: The ability to ALTER a database's storage volume was refined in later v3.x releases. If you are on an earlier version (e.g., v3.1.0), it's possible the syntax was slightly different or only supported during CREATE DATABASE.
Recommendation
1. Check Cluster Type: Run SHOW FRONTENDS; and check the IsSharedData column to ensure you are in a shared-data environment.
2. Check Volume Existence: Ensure the volume sharded_v1 exists by running SHOW STORAGE VOLUMES;.
3. Try the alternative syntax: Use the SET PROPERTIES version mentioned above.
References
• sql-reference/sql-statements/Database/ALTER_DATABASE.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/feature-support-shared-data.md
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.md
References
• sql-reference/sql-statements/Database/ALTER_DATABASE.md
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.md
• release_notes/release-3.2.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.mdRumit Jain
06/10/2026, 2:41 AMALTER DATABASE test_sharding SET PROPERTIES ("storage_volume" = "sharded_v1");
ERROR 1064 (HY000): Getting syntax error at line 1, column 33. Detail message: No viable statement for input 'ALTER DATABASE test_sharding SET PROPERTIES'.
ADMIN SHOW FRONTEND CONFIG LIKE 'run_mode';
+----------+------------+-------------+--------+-----------+---------+
| Key | AliasNames | Value | Type | IsMutable | Comment |
+----------+------------+-------------+--------+-----------+---------+
| run_mode | [] | shared_data | String | false | |
+----------+------------+-------------+--------+-----------+---------+
1 row in set (0.01 sec)Rocky
06/10/2026, 2:41 AMNo viable statement for input 'ALTER DATABASE ... SET (' usually indicates one of two things:
1. Cluster Mode: You are likely running a Shared-Nothing cluster. The storage_volume property is exclusive to Shared-Data (compute-storage decoupled) clusters. In Shared-Nothing mode, the ALTER DATABASE command only supports RENAME, DATA QUOTA, and REPLICA QUOTA. It does not recognize the SET ("key" = "value") syntax used for storage volumes.
2. Version: You might be on a version of StarRocks earlier than v3.1. Storage volumes and the ability to assign them to databases were introduced in StarRocks 3.1.
How to Verify
Run the following command to check your cluster's run mode:
sql
ADMIN SHOW FRONTEND CONFIG LIKE 'run_mode';
* If the result is shared_nothing, you cannot use storage volumes or the partitioned_prefix feature.
* If the result is shared_data, ensure you are on at least version v3.1.
Correct Syntax (for Shared-Data clusters)
The official syntax for changing a database's storage volume in a Shared-Data cluster is:
sql
ALTER DATABASE test_sharding SET ("storage_volume" = "sharded_v1");
*Note: Do not use the keyword PROPERTIES. The parentheses immediately follow SET.*
If you are in Shared-Nothing mode
In a Shared-Nothing cluster (where data is stored on local disks of BE nodes), the concept of "partitioned prefix" and "storage volumes" does not exist. These are features designed to optimize object storage (S3/GCS/Azure Blob) performance by spreading files across different S3 shards to avoid request throttling.
If you are in Shared-Data mode but still get the error
If you have confirmed you are in shared_data mode and the syntax still fails:
1. Check Catalog: Ensure you are in the default_catalog. Storage volumes cannot be set for databases in external catalogs (e.g., Hive, Iceberg).
2. Permissions: Verify you have the ALTER privilege on the database and the USAGE privilege on the storage volume sharded_v1.
3. Upgrade: If you are on an early v3.1.x release, consider upgrading to a more stable v3.2 or v3.3 release, as the storage volume management SQLs were refined in later versions.
References
• sql-reference/sql-statements/Database/ALTER_DATABASE.md
• deployment/shared_data/feature-support-shared-data.md
• faq/shared_data_faq.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
References
• sql-reference/sql-statements/Database/ALTER_DATABASE.md
• sql-reference/sql-statements/table_bucket_part_index/ALTER_TABLE.md
• sql-reference/sql-statements/cluster-management/nodes_processes/ALTER_SYSTEM.md
• sql-reference/sql-statements/account-management/ALTER_USER.md
• sql-reference/sql-statements/loading_unloading/pipe/ALTER_PIPE.mdRocky
06/10/2026, 2:43 AMshared_data mode, it is highly likely that your StarRocks version is either v3.0 (where storage volumes didn't exist) or an early version of v3.1 where the ALTER DATABASE syntax for storage volumes was not yet available or was implemented differently.
The error No viable statement for input ... SET ( means your SQL parser does not recognize the property-setting syntax for databases. In older versions, ALTER DATABASE only allowed RENAME, SET DATA QUOTA, and SET REPLICA QUOTA.
1. Check your version
Please run the following command and check the result:
sql
SELECT current_version();
* If you are on v3.0.x: This version does not support storage volumes or the partitioned_prefix feature.
* If you are on v3.1.x: While storage volumes were introduced in 3.1, the ability to ALTER a database's volume was finalized in later patches.
2. Required Syntax
For StarRocks v3.1 and above, the official syntax (without the keyword PROPERTIES) is:
sql
ALTER DATABASE test_sharding SET ("storage_volume" = "sharded_v1");
Do not use SET PROPERTIES as that is specifically for tables and will cause a syntax error on databases.
3. Troubleshooting & Workarounds
If the correct syntax above still fails with a syntax error at the `(`:
* Upgrade: If you are on an early v3.1 release, upgrading to v3.2 or v3.3 will resolve this, as the storage volume management SQLs are fully matured in these versions.
* Create a new Database: If you cannot upgrade, you can create a new database with the desired volume from the start:
sql
CREATE DATABASE test_sharding_v2 PROPERTIES ("storage_volume" = "sharded_v1");
Then migrate your tables into it using ALTER TABLE ... SET ("storage_volume" = "sharded_v1") or by re-creating them.
Important Note on enable_partitioned_prefix
Even if you successfully change the database's storage volume:
1. Existing tables will NOT automatically move or use the new prefix.
2. The change only applies to new tables created in that database thereafter.
3. To move existing data to the new sharded structure, you must re-create the tables or use INSERT INTO ... SELECT as mentioned previously.
References
• sql-reference/sql-statements/Database/ALTER_DATABASE.md
• sql-reference/sql-statements/Database/CREATE_DATABASE.md
• deployment/shared_data/feature-support-shared-data.md
• faq/shared_data_faq.md
References
• sql-reference/sql-statements/Database/ALTER_DATABASE.md
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• sql-reference/sql-statements/account-management/GRANT.mdRocky
06/10/2026, 2:43 AMALTER DATABASE statement in StarRocks does not use the PROPERTIES keyword when setting a storage volume. While CREATE DATABASE uses PROPERTIES, the ALTER variant follows a different structure.
On version 4.0.1, please use the following exact syntax:
sql
ALTER DATABASE test_sharding SET ("storage_volume" = "sharded_v1");
Why your previous attempt failed:
1. Keyword `PROPERTIES`: Your SQL included SET PROPERTIES (...). The parser for ALTER DATABASE specifically expects the parentheses (...) immediately after SET for storage volume changes.
2. Parser Strictness: Even in the latest versions (like 4.0.1), the SQL parser is very strict about the placement of keywords. Including PROPERTIES makes the parser look for table-level property logic which doesn't exist for databases in this context.
Additional Requirements:
* Privileges: Ensure you have the ALTER privilege on the database and the USAGE privilege on the storage volume sharded_v1.
* Catalog: This command only works for databases in the default_catalog.
* Effect on Existing Data: Note that changing the database's storage volume only affects new tables created after the change. Existing tables will remain on their original storage volume/prefix unless they are individually altered or re-created.
References
• sql-reference/sql-statements/Database/ALTER_DATABASE.md
• sql-reference/sql-statements/Database/CREATE_DATABASE.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
References
• sql-reference/sql-statements/table_bucket_part_index/ALTER_TABLE.md
• sql-reference/System_variable.md
• sql-reference/sql-statements/Database/ALTER_DATABASE.md
• sql-reference/sql-statements/cluster-management/config_vars/SET.md
• sql-reference/sql-statements/account-management/ALTER_USER.mdRumit Jain
06/10/2026, 2:47 AMALTER DATABASE test_sharding SET ("storage_volume" = "sharded_v1");
ERROR 1064 (HY000): Getting syntax error at line 1, column 33. Detail message: No viable statement for input 'ALTER DATABASE test_sharding SET ('.
Starrocks >
I am running this command from user 'root' and also sharded_v1 exists:
desc storage volume sharded_v1\G;
*************************** 1. row ***************************
Name: sharded_v1
Type: S3
IsDefault: true
Location: <s3://starrocks-data>
Params: {"aws.s3.region":"us-east-1","aws.s3.num_partitioned_prefix":"64","aws.s3.enable_partitioned_prefix":"true","aws.s3.use_aws_sdk_default_behavior":"true","aws.s3.endpoint":""}
Enabled: true
Comment:
1 row in set (0.01 sec)
ERROR:
No query specified
And also database existsRocky
06/10/2026, 2:48 AMshared_data mode, the error No viable statement for input 'ALTER DATABASE ... SET (' usually occurs because the SQL parser is not recognizing the property-setting branch of the ALTER DATABASE command.
Given your setup, here is the breakdown of why this is happening and how to fix it:
1. Check your Catalog
The storage_volume property can only be set for databases within the default_catalog. If you have switched to an external catalog (like a Hive or Iceberg catalog) using the SET CATALOG or USE command, the ALTER DATABASE command follows the rules of that external system, which likely doesn't support StarRocks storage volumes.
Verify with:
sql
SELECT current_catalog();
If it is not default_catalog, switch back:
sql
SET CATALOG default_catalog;
2. Verify the Database Type
In a shared_data cluster, all databases in the default_catalog are "Lake" databases. However, if this database was somehow created differently or if there is a metadata inconsistency, the ALTER command might fail.
Try creating a new test database with the volume to see if the property name is accepted there:
sql
CREATE DATABASE test_syntax_check PROPERTIES ("storage_volume" = "sharded_v1");
* If this fails, there might be an issue with the property name or the storage volume's state.
* If this works, then the problem is specifically with the ALTER syntax in your current version/context.
3. Alternative Syntax
Although the documentation for 4.0.x specifies SET ("key" = "value"), some early builds or specific client environments may prefer the assignment syntax. Try:
sql
ALTER DATABASE test_sharding SET "storage_volume" = "sharded_v1";
(Removing the parentheses)
4. Why you might not even need this command
Looking at your DESC STORAGE VOLUME sharded_v1 output:
* IsDefault: true
Since sharded_v1 is already the Default Storage Volume for your entire cluster, all new tables created in the test_sharding database (and any other database) will automatically use sharded_v1 and its enable_partitioned_prefix setting by default. You do not strictly need to set it at the database level if it's already the cluster default.
5. Moving Existing Tables
Changing a database's storage volume does not move existing data. It only acts as a default for new tables. To move existing tables to the sharded prefix, you must alter them individually:
sql
ALTER TABLE <table_name> SET ("storage_volume" = "sharded_v1");
This will trigger a background task to move the data/metadata to the new volume/prefix configuration.
Summary / Recommendation
1. Ensure you are in the default_catalog.
2. Since sharded_v1 is the cluster default, simply create your new tables; they will use the sharding prefix automatically.
3. If you must alter an existing table to use the new sharding logic, use ALTER TABLE ... SET ("storage_volume" = "sharded_v1").
4. If the ALTER DATABASE syntax continues to fail and you are in the default_catalog, it is likely a minor parser bug in the early 4.0.1 release. Consider upgrading to the latest stable patch (e.g., 4.0.10+) where DDL consistency is improved.
References
• sql-reference/sql-statements/Database/ALTER_DATABASE.md
• sql-reference/sql-statements/cluster-management/storage_volume/SET_DEFAULT_STORAGE_VOLUME.md
• sql-reference/sql-statements/table_bucket_part_index/ALTER_TABLE.md
• sql-reference/sql-statements/Database/CREATE_DATABASE.mdRocky
06/10/2026, 2:48 AMRumit Jain
06/10/2026, 2:57 AMRocky
06/10/2026, 3:02 AMFile Not Found errors, and your tables may become corrupted.
* Tip: You can use lifecycle rules to transition data to cheaper tiers like S3 Intelligent-Tiering, but avoid any policy that permanently deletes files.
* Snapshot Bucket: Recommended.
* Since StarRocks does not automatically delete old backups in a REPOSITORY, you should use an S3 Lifecycle policy on the snapshot bucket to automatically delete objects older than your retention period (e.g., 30 days) to manage costs.
Summary Checklist for Shared-Data
Feature | Data Bucket | Snapshot Bucket
Separate Bucket | Yes | Yes
Versioning | Disabled | Optional
Lifecycle Expiration | Disabled | Enabled (for aging out old backups)
Storage Class | S3 Standard or Express One Zone | S3 Standard / Standard-IA
Important Note: Ensure your Vacuum parameters are configured in your cluster (e.g., vacuum_expire_seconds) so StarRocks can clean up its own orphaned files from S3 correctly.
References
• faq/shared_data_faq.md
• administration/cluster_snapshot.md
• deployment/shared_data/s3.md
• administration/Backup_and_restore.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/Vacuum.md
• administration/Management.md
• administration/Monitor_and_Alert.md
• administration/maintenance_management.md
• administration/query_profile.md
• best_practices/bucketing.md
• faq/loading_faq.md
• quick_start/shared_data.mdRocky
06/10/2026, 3:02 AMRocky
06/10/2026, 3:02 AMRumit Jain
06/10/2026, 3:33 AMRocky
06/10/2026, 3:34 AMsql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME new_backup_volume;
What happens next:
1. Configuration Update: The system immediately updates the target location for future automated snapshots to new_backup_volume.
2. Snapshot Creation: The next time a snapshot is triggered (based on your automated_cluster_snapshot_interval_seconds, default 600s), it will be written to the new bucket.
3. Cleanup: Once the new snapshot is successfully created in the new volume, the system will automatically purge the old snapshot from the previous volume/bucket.
Key Considerations:
* Metadata vs. Data: Note that in shared-data mode, the STORAGE VOLUME parameter specifically controls where the FE metadata image is stored. The data itself remains in the object storage location where your tables reside; the snapshot simply creates "pinned" references to those files to prevent them from being deleted by the Vacuum process.
* Permissions: Ensure the StarRocks cluster (FE/CN nodes) has the necessary IAM/S3 permissions to write to the new bucket associated with new_backup_volume.
* Manual Cleanup (Optional): If you want to ensure the old volume is cleared immediately before the next interval, you can run ADMIN SET AUTOMATED CLUSTER SNAPSHOT OFF first (which triggers a purge of the existing snapshot), and then run the ON command with the new volume. However, this leaves you without a snapshot for a few minutes until the next one completes.
Verification:
After running the command, wait for the next interval and verify the location of the latest snapshot:
sql
SELECT * FROM information_schema.cluster_snapshots;
Check the storage_volume and storage_path columns to confirm it is now pointing to your new backup bucket.
References
• administration/cluster_snapshot.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/Vacuum.md
• administration/Backup_and_restore.md
References
• administration/cluster_snapshot.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.mdRumit Jain
06/10/2026, 3:44 AMRocky
06/10/2026, 3:45 AMaws.s3.enable_partitioned_prefix = true.
* Why: AWS S3 has request rate limits per prefix (e.g., 3,500 PUT/DELETE and 5,500 GET requests per second). When this feature is enabled, StarRocks automatically spreads data across multiple sub-paths (prefixes) based on the number you specify (e.g., 64 or 128).
* Performance: This prevents S3 "throttling" during high-concurrency ingestion or heavy query loads, effectively multiplying your S3 throughput.
* Built-in Limitation: You cannot enable the partitioned prefix on the "built-in" volume created automatically via fe.conf. You must create a custom storage volume to use this feature.
2. Disadvantages of NOT using the "Default" volume?
The only "disadvantage" of using a custom volume is administrative: if it is not set as the Default Storage Volume, you have to manually specify PROPERTIES("storage_volume" = "your_volume") every time you create a database or table.
The Solution:
Set your custom volume as the cluster-wide default so you don't have to change your DDL:
sql
SET your_custom_volume_name AS DEFAULT STORAGE VOLUME;
Once this is set, any new CREATE DATABASE or CREATE TABLE command will use your custom volume (and its sharding logic) automatically.
3. Extra Configs to Consider
If you move to a custom volume, check these two areas:
* Compaction Cache (Multi-Warehouse only): In some enterprise/cloud environments, the term default_warehouse refers to the compute resource. If you have multiple compute warehouses, ensure they all have access to the same storage volume. If a "Background Warehouse" handles compaction but your "Query Warehouse" handles the data, the cache needs to be managed correctly.
* Cleanup (Vacuum): Ensure your StarRocks user/role has s3:DeleteObject permissions on the new bucket. StarRocks uses a background process called Vacuum to clean up old data. Since you are using a partitioned prefix, the file paths in S3 will look different (e.g., <s3://bucket/1a/>... instead of `s3://bucket/starrocks/...`), but StarRocks handles this automatically as long as the permissions are correct.
Summary / Comparison
Feature | Built-in (from fe.conf) | Custom (with Partitioned Prefix)
Performance | Standard S3 (Limited by single prefix) | High (Distributed across 64+ prefixes)
Flexibility | Fixed | Can update credentials/params
Ease of Use | Automatic | Requires SET ... AS DEFAULT once
Recommendation | Only for testing/small loads | Recommended for Production
Final Recommendation: Keep using your custom sharded_v1 volume. It is superior for performance. Just ensure you run SET sharded_v1 AS DEFAULT STORAGE VOLUME; so that all your future tables inherit the sharding benefits without extra effort.
References
• deployment/shared_data/feature-support-shared-data.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• sql-reference/sql-statements/cluster-management/storage_volume/SET_DEFAULT_STORAGE_VOLUME.md
• administration/Vacuum.mdRocky
06/10/2026, 3:45 AMRumit Jain
06/10/2026, 10:31 AMRocky
06/10/2026, 10:31 AMcluster_snapshot_jobs view. It will show you if a job failed and provide an error message.
sql
SELECT * FROM information_schema.cluster_snapshot_jobs
ORDER BY created_time DESC;
* Look for ERROR state: If you see an error, check the error_message and detail_info columns.
* Common Error: Permissions. Ensure your StarRocks cluster (specifically the FE nodes) has s3:PutObject and s3:DeleteObject permissions on the new S3 bucket.
2. Verify Snapshot Dependency (Metadata Checkpoints)
In StarRocks, an automated snapshot is not triggered exactly every $X$ seconds. Instead:
1. A snapshot is triggered only after a metadata checkpoint (when the FE writes a new image file).
2. If your cluster is idle (no DDLs, no metadata changes), the FE might not perform a checkpoint frequently.
3. The system checks if it should run a snapshot based on the automated_cluster_snapshot_interval_seconds (default 600s/10 mins), but it still waits for that checkpoint.
To test if this is the issue:
Try creating a dummy table or a dummy database to force a metadata change, wait 10–15 minutes, and then check again.
3. Check Current Snapshots
Confirm if there is any snapshot present. StarRocks only keeps one automated snapshot at a time. When a new one is successfully created, the old one is immediately deleted.
sql
SELECT * FROM information_schema.cluster_snapshots;
Verify the storage_volume column. If it still shows the old volume, the new job has likely not successfully completed yet.
4. Verify Configuration Settings
Ensure the interval isn't set to an unexpectedly high value:
sql
ADMIN SHOW CONFIG LIKE '%automated_cluster_snapshot_interval_seconds%';
If you want to speed up testing, you can temporarily lower this value (e.g., to 60 seconds) using:
sql
ADMIN SET FRONTEND CONFIG ("automated_cluster_snapshot_interval_seconds" = "60");
5. Review FE Logs
If the SQL views don't show enough detail, check the Leader FE's fe.log. Search for "snapshot" or "automated_cluster_snapshot" to see background thread activity.
* Log file: log/fe.log
* Keywords: ClusterSnapshotMgr, failed to create snapshot, storage volume access denied.
Summary Checklist:
* [ ] Version: Are you on StarRocks v3.4.2 or higher? (This feature was introduced then).
* [ ] Permissions: Does the IAM role have access to the new bucket?
* [ ] Storage Volume: Is the volume name spelled correctly in the ADMIN SET command?
* [ ] State: Is the cluster in a healthy state (all FEs and CNs alive)?
References
• administration/cluster_snapshot.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
References
• administration/cluster_snapshot.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
ReferencesRocky
06/10/2026, 10:31 AMRumit Jain
06/10/2026, 10:35 AMSELECT * FROM information_schema.cluster_snapshot_jobs ORDER BY created_time DESC limit 1;
+------------------------------------------+--------+---------------------+---------------+-------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SNAPSHOT_NAME | JOB_ID | CREATED_TIME | FINISHED_TIME | STATE | DETAIL_INFO | ERROR_MESSAGE |
+------------------------------------------+--------+---------------------+---------------+-------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| automated_cluster_snapshot_1781086051761 | 535118 | 2026-06-10 10:07:31 | NULL | ERROR | | upload image failed, err msg: Failed to copy local /opt/starrocks/fe/meta/image to <s3://starrocks-backup/60a01b4a-deee-45d7-9d66-e09884d43fb2/meta/image/automated_cluster_snapshot_1781086051761> |
Checked IAM as well, and it has the permission to this bucket.
Earlier the bucket name was wrong, so I deleted the Strage volume and re crearted by updating the bucket:
desc storage volume snapshot_s3_volume\G;
*************************** 1. row ***************************
Name: snapshot_s3_volume
Type: S3
IsDefault: false
Location: <s3://starrocks-snapshot>
Params: {"aws.s3.region":"us-east-1","aws.s3.use_aws_sdk_default_behavior":"true","aws.s3.endpoint":"<https://s3.us-east-1.amazonaws.com>"}
Enabled: true
Comment:
1 row in set (0.01 sec)
But after updating the Storgae volume to the new bucket, snapshot are not taking place .Rocky
06/10/2026, 10:37 AM<s3://starrocks-snapshot>).
Even though you recreated the storage volume with the same name, the automated snapshot background task often caches the target path and connection details from the moment the feature was first enabled. Recreating the volume doesn't always trigger an automatic update of the background task's internal state.
Recommended Fix: Refresh the Snapshot Binding
You need to explicitly tell the cluster to re-bind the automated snapshot task to the updated volume definition. Run the following commands in order:
1. Re-enable the snapshot on the volume:
Running this again forces StarRocks to re-read the location and parameters from the snapshot_s3_volume definition.
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME snapshot_s3_volume;
2. If the error persists (Force Refresh):
If the step above doesn't clear the old bucket path from the next job, toggle the feature off and back on. This clears the internal state and the previous (failing) job record.
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT OFF;
-- Wait a few seconds
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME snapshot_s3_volume;
How to Verify the Fix
After running the commands, check the next job that gets created (it may take up to 10 minutes depending on your interval):
sql
SELECT * FROM information_schema.cluster_snapshot_jobs
ORDER BY created_time DESC LIMIT 1;
* Check the Error Message: Look at the bucket path in the ERROR_MESSAGE (if it fails) or the success details. It should now reflect <s3://starrocks-snapshot>.
* Check the Location: You can also check information_schema.cluster_snapshots to see if a new record appears with the correct storage_volume and storage_path.
Why did this happen?
When you first ran ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON..., StarRocks resolved the snapshot_s3_volume to its then-current location (<s3://starrocks-backup>). When you deleted and recreated the volume, the background manager didn't automatically "watch" for that change. Manually re-issuing the ADMIN SET command forces the Metadata Manager to update the target URI for the next checkpoint uploads.
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/management/FE_configuration.mdRocky
06/10/2026, 10:40 AMFailed to copy local /opt/starrocks/fe/meta/image to <s3://...> indicates that the Front End (FE) leader node is unable to write the metadata checkpoint file to your new S3 bucket.
Even if you have verified the IAM policy, there are several configuration and network reasons why this specific "copy" operation fails from the FE. Please check the following:
1. Verify Region and Endpoint in Storage Volume
The FE's snapshot thread is sensitive to the Region. If your new bucket is in a different region than the default (usually us-east-1), and you did not explicitly set it in the Storage Volume, the upload will fail.
Check your volume definition:
sql
DESC STORAGE VOLUME new_backup_volume;
Ensure it has:
* `aws.s3.region`: Matches your bucket's region (e.g., us-west-2).
* `aws.s3.endpoint`: If you are using a VPC Endpoint or a non-AWS S3 provider, ensure the FE can resolve this URL.
2. Check for "Path-Style Access" (Common with MinIO/Private Clouds)
There is a known issue in some versions where the FE does not automatically inherit the aws.s3.enable_path_style_access property from the Storage Volume for snapshots.
* The Symptom: The FE tries to connect to <http://bucket-name.s3.amazonaws.com|bucket-name.s3.amazonaws.com> (Virtual Hosted-style) instead of <http://s3.amazonaws.com/bucket-name|s3.amazonaws.com/bucket-name> (Path-style).
* The Fix: If your storage requires path-style access, you may need to add the following to fe/conf/core-site.xml on all FE nodes and restart them:
xml
<property>
<name>fs.s3a.path.style.access</name>
<value>true</value>
</property>
3. Network/DNS Connectivity from the FE Node
The upload is performed by the FE Leader node. Log into the FE leader shell and test connectivity directly to that bucket using the same credentials/role:
bash
# Test if the node can resolve and reach S3
curl -v <https://starrocks-backup.s3>.<your-region>.<http://amazonaws.com|amazonaws.com>
# If you have aws-cli installed, test the upload manually from the FE
aws s3 cp /opt/starrocks/fe/meta/image <s3://starrocks-backup/test_connection>
If these fail, the issue is likely a VPC routing, Security Group, or DNS resolution problem on the FE host itself.
4. Inspect the Full Stack Trace in fe.warn.log
The information_schema view often truncates the error. To see the root cause (e.g., UnknownHostException, Access Denied, or Connection Refused), search the FE leader's log:
bash
grep -A 20 "upload image failed" /opt/starrocks/fe/log/fe.warn.log
Look for the Caused by: line in the Java stack trace.
5. IAM "Resource" Scope
Double-check that your IAM policy specifically allows access to the new bucket. Sometimes policies are scoped to a specific ARN:
* Wrong: arn:aws:s3:::old-bucket/*
* Right: arn:aws:s3:::new-backup-bucket/* AND arn:aws:s3:::new-backup-bucket (the bucket itself is needed for certain metadata calls).
Quick Workaround for Testing
To confirm if the issue is with the new volume's configuration, you can try switching the automated snapshot back to the default volume temporarily:
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME builtin_storage_volume;
If it starts working again, the issue is 100% within the definition of your new Storage Volume or the permissions/networking specific to that new bucket.
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
• integrations/authenticate_to_aws_resources.md
ReferencesRocky
06/10/2026, 10:40 AMRocky
06/10/2026, 10:40 AMRocky
06/10/2026, 10:40 AMRocky
06/10/2026, 10:40 AMRocky
06/10/2026, 10:40 AMRocky
06/10/2026, 10:40 AMRocky
06/10/2026, 10:40 AMRocky
06/10/2026, 10:40 AMRocky
06/10/2026, 10:40 AMRumit Jain
06/11/2026, 3:51 AMRocky
06/11/2026, 3:51 AMSHOW CREATE TABLE
The most direct way to see the storage volume assigned to a specific table is to view its creation statement.
sql
SHOW CREATE TABLE your_table_name;
Look for the storage_volume property in the PROPERTIES section at the bottom of the output.
* If you see "storage_volume" = "your_volume_name", that is the volume being used.
* If you do not see this property, it means the table was created using the cluster-wide default storage volume at the time of its creation.
──────────
2. Querying Metadata: information_schema.tables_config
If you want to check multiple tables at once or search programmatically, use the tables_config view. This view contains a PROPERTIES column that stores table properties as a JSON-like string.
sql
SELECT
TABLE_SCHEMA,
TABLE_NAME,
PROPERTIES
FROM information_schema.tables_config
WHERE TABLE_NAME = 'your_table_name';
──────────
3. Verify Physical Path: information_schema.partitions_meta
For shared-data clusters, every partition has a physical path in your object storage (S3, GCS, etc.). You can see the actual URI where the data is stored:
sql
SELECT
DB_NAME,
TABLE_NAME,
PARTITION_NAME,
STORAGE_PATH
FROM information_schema.partitions_meta
WHERE TABLE_NAME = 'your_table_name';
The STORAGE_PATH will start with the location defined in your storage volume (e.g., `s3://my-bucket/starrocks/`). You can compare this prefix to the locations in your storage volumes.
──────────
4. How to identify the "Default" volume
If your table doesn't specify a volume, it uses the default one. You can identify which volume is the current default by running:
sql
-- List all volumes; look for the one set as default
SHOW STORAGE VOLUMES;
-- Or describe a specific volume to see if IsDefault is true
DESC STORAGE VOLUME my_s3_volume;
Summary Recommendation
* Use SHOW CREATE TABLE for a quick manual check.
* Use information_schema.partitions_meta if you need to see exactly which bucket and path the data is physically landing in.
References
• sql-reference/information_schema/tables.md
• sql-reference/information_schema/partitions_meta.md
• sql-reference/information_schema/be_tablets.md
• sql-reference/information_schema/columns.mdRumit Jain
06/11/2026, 4:03 AMRocky
06/11/2026, 4:03 AMbash
kubectl describe pod <fe-pod-name> | grep AWS_ROLE_ARN
* Test S3 Connectivity from Pod: Exec into a pod and try to list the bucket using the AWS CLI or curl to ensure VPC endpoints/gateways are routing correctly.
* Check Storage Volume Status:
sql
DESC STORAGE VOLUME <volume_name>; -- Ensure 'aws.s3.region' is correct.
SHOW STORAGE VOLUMES; -- Ensure the intended volume is 'IsDefault' = true.
2. FE Leader & Metadata Health
The FE Leader handles all metadata changes and cluster snapshots.
* Check FE Status:
sql
SHOW FRONTENDS; -- Ensure 'IsLeader' is true for one node and 'Join' is true for others.
* Monitor Metadata Checkpoints: If snapshots or metadata updates are failing, check the FE Leader's disk space (specifically the /meta directory) and JVM heap usage.
* Identify FE Errors: Use kubectl logs specifically on the Leader FE:
bash
kubectl logs <fe-leader-pod> | grep -iE "warn|error|exception"
3. CN (Compute Node) Registration & Resources
CNs are stateless and must register themselves with the FE.
* Verify Registration:
sql
SHOW COMPUTE NODES; -- Check 'Alive' status.
* Check for CrashLoopBackOff: If CN pods are restarting, check for OOMKilled events. StarRocks CNs require significant memory for the Data Cache and query execution.
bash
kubectl get pods -n <namespace> --watch
kubectl describe pod <cn-pod-name> --section=Events
* Data Cache Disk Space: Shared-data relies on local disk cache. If the local disk (EBS) fills up, CN performance will drop or the process may hang. Check storage_root_path in cn.conf.
4. Networking & Service Discovery
EKS networking (CoreDNS/VPC CNI) must allow FE and CN pods to communicate on specific ports (9010, 9020, 9030).
* Internal DNS: Ensure CNs are connecting to the FE using the internal K8s Service name (e.g., starrocks-fe-service).
* Port Checks: Ensure the Security Group associated with the EKS nodes allows traffic on:
* `9010`: Edit Log Port (FE)
* `9020`: RPC Port (FE/CN)
* `9030`: MySQL Query Port (FE)
5. Snapshot & Backup Failures
(Specific to your previous error)
* FE to S3 VPC Endpoint: If snapshots fail with "upload image failed" while IAM is correct, ensure your FE pods can reach the S3 S3 regional endpoint. In private EKS clusters, you often need an S3 Gateway Endpoint or Interface Endpoint.
* Log Location: Check /opt/starrocks/fe/log/fe.warn.log inside the FE Leader for the full Java stack trace of the upload failure.
6. Key Configuration Files to Inspect
If you need to change settings, these are located in the pods at:
* FE: /opt/starrocks/fe/conf/fe.conf
* CN: /opt/starrocks/cn/conf/cn.conf
* Hadoop/S3 Settings: /opt/starrocks/fe/conf/core-site.xml (important for custom S3 endpoints or path-style access).
References
• deployment/helm.md
• deployment/k8s_operator.md
• administration/cluster_snapshot.md
• deployment/shared_data/s3.md
• integrations/authenticate_to_aws_resources.mdRumit Jain
06/11/2026, 7:11 AMRocky
06/11/2026, 7:12 AMEXCHANGE nodes with high NetworkBytes.
* Optimization:
* Consolidate CNs: If your HA requirements allow, place all CNs in the same AZ. This eliminates shuffle costs entirely.
* Join Optimization: Use COLOCATE joins (if tables share the same distribution) or BUCKET_SHUFFLE joins to minimize the amount of data moved.
2. S3 Retrieval (CN-to-S3)
The Reason: In a shared-data architecture, CNs pull data from S3. If you do not have an S3 Gateway VPC Endpoint configured, this traffic may go through a NAT Gateway (very expensive) or be treated as cross-AZ traffic.
* How to verify: Check your AWS Cost Explorer for "NAT Gateway - Data Processed" or "S3 Data Transfer."
* Optimization:
* S3 Gateway Endpoint: Ensure you have a "Gateway" type VPC Endpoint for S3 in your VPC. This is free and keeps S3 traffic within the AWS internal network, typically avoiding cross-AZ charges for S3 access.
3. Metadata Replication (FE-to-FE)
The Reason: With 3 FEs in 3 different AZs, every metadata change (table creation, schema change, data load) is replicated across the AZs to maintain a quorum (via BDBJE). While metadata is smaller than data, high-frequency loading can lead to noticeable costs.
* Optimization: This is the cost of High Availability. To reduce it, you could move FEs to a single AZ, but you would lose FE-level AZ redundancy. Usually, this is a small fraction of the cost compared to CN shuffle.
4. Cross-AZ Data Cache Misses
The Reason: If CNs have insufficient local disk space (EBS/NVMe) for their Data Cache, they must repeatedly pull data from S3. If your S3 configuration isn't optimized (as per point 2), every cache miss becomes a billable transfer.
* Optimization: Increase the local disk size for CNs and tune datacache_capacity to ensure "hot" data stays local to the node.
Summary Checklist for Optimization:
1. VPC Endpoints: Create an S3 Gateway Endpoint in your VPC and ensure your route tables include it.
2. Pod Affinity: Use K8s Node Affinity or topologySpreadConstraints to either force CNs into the same AZ (to save cost) or strictly control their spread.
3. Query Locality: If you use a Load Balancer to connect to FEs, ensure Cross-Zone Load Balancing is disabled or use a "Topology-Aware" service to keep client traffic within the same AZ as the FE it connects to.
4. CN Cache: Ensure your CNs have enough storage_root_path capacity to hold your working dataset. Use the following to check:
sql
-- Check if queries are hitting S3 (remote) or Cache (local)
-- Look for 'CompressedBytesReadRemote' in the profile
SET enable_profile = true;
References
• deployment/shared_data/s3.md
• faq/shared_data_faq.md
• administration/management/BE_configuration.md
• best_practices/query_tuning/query_planning.md
• integrations/authenticate_to_aws_resources.md
ReferencesRocky
06/11/2026, 7:12 AMRumit Jain
06/11/2026, 7:23 AMRocky
06/11/2026, 7:24 AMproperties
# Increase from 1000ms to 5000ms or 10000ms
report_resource_usage_interval_ms = 5000
2. FE Metadata Replication (BDBJE)
StarRocks FEs use BDBJE to keep metadata in sync. Since you have 3 FEs in 3 different AZs:
* The Cost: The Leader FE constantly sends "heartbeats" and log offsets to the 2 Follower FEs to maintain the Raft-based quorum. Even if no data is moving, the "Keep-Alive" traffic between 3 AZs is constant.
* Optimization: This is the cost of FE high availability. If this is a dev/test cluster, reducing to 1 FE in a single AZ will eliminate this cost entirely. For production, keep it but ensure FEs are in the same VPC and using private IPs.
3. Metadata Snapshots to S3
In Shared-Data mode, the FE Leader periodically "checkpoints" the metadata (saving the current state of your dummy tables) and uploads this image to S3.
* The Cost: If you do not have an S3 Gateway VPC Endpoint, this traffic may be routed through a NAT Gateway, which is one of the most expensive ways to move data in AWS ($0.045 per GB processed + hourly fee).
* Optimization: Confirm you have a "Gateway" type VPC Endpoint for S3 in your VPC. This makes the transfer to S3 free and keeps it off the public internet/NAT.
4. Background Statistics Collection
Even for dummy tables, StarRocks automatically starts a background thread to collect data statistics (cardinality, min/max) for the query optimizer.
* The Cost: This involves the CNs reading the "dummy" data from S3 and sending the statistics back to the FE.
* Optimization: You can increase the interval or disable auto-collection for dummy/test tables:
sql
-- In fe.conf
statistic_collect_interval_sec = 3600 -- Increase to 1 hour
5. Prometheus/Metrics Scraping
If you have an O11y stack (like Prometheus) scraping the /metrics endpoint of your 5 pods (3 FE + 2 CN):
* The Cost: StarRocks exports a very large number of metrics. If your Prometheus server is in AZ-1 and it is scraping pods in AZ-2 and AZ-3 every 15 seconds, this data transfer can be surprisingly high.
* Optimization: Ensure your Prometheus scraper is "AZ-aware" or increase the scrape interval to 60 seconds.
Summary Checklist for "Idle" Cost Reduction:
1. Check NAT Gateway: In AWS Cost Explorer, look for "NAT Gateway - Data Processed." If this is high, your S3 traffic is misrouted. Add an S3 Gateway Endpoint.
2. Align CNs with FE Leader: If you only have 2 CNs, try to schedule them in the same AZ as the FE Leader using K8s Pod Affinity. This makes the 1-second heartbeats "local" and free.
3. Adjust `report_resource_usage_interval_ms`: Slow down the CN-to-FE chatter as shown above.
References
• administration/management/FE_configuration.md
• administration/management/BE_configuration.mdRumit Jain
06/11/2026, 7:43 AMRocky
06/11/2026, 7:43 AMStarRocksCluster CRD) or Helm chart.
Option 1: Pin to a Specific Zone (Recommended for Cost)
The most reliable way to stop cross-AZ costs is to pick one specific zone (e.g., us-east-1a) and force all CNs onto nodes in that zone using a nodeSelector.
In your StarRocksCluster YAML:
yaml
apiVersion: <http://starrocks.com/v1alpha1|starrocks.com/v1alpha1>
kind: StarRocksCluster
metadata:
name: starrockscluster-sample
spec:
starRocksCnSpec:
replicas: 2
# This ensures CNs only land on nodes with this AWS zone label
nodeSelector:
<http://topology.kubernetes.io/zone|topology.kubernetes.io/zone>: us-east-1a
Option 2: Keep CNs Together (Dynamic Zone)
If you don't want to hardcode a zone but want to ensure all CNs "stick together" in whichever zone the first one lands in, use Pod Affinity.
In your StarRocksCluster YAML:
yaml
spec:
starRocksCnSpec:
replicas: 2
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "<http://app.kubernetes.io/component|app.kubernetes.io/component>"
operator: In
values:
- cn
# This topology key tells K8s to keep pods with the same label
# in the same 'zone'
topologyKey: "<http://topology.kubernetes.io/zone|topology.kubernetes.io/zone>"
Option 3: Colocate CNs with FEs
To avoid the cross-AZ "heartbeat" and metadata costs entirely, you can force the CNs to stay in the same zone as your FE pods.
yaml
spec:
starRocksCnSpec:
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: "<http://app.kubernetes.io/component|app.kubernetes.io/component>"
operator: In
values:
- fe
topologyKey: "<http://topology.kubernetes.io/zone|topology.kubernetes.io/zone>"
Important Notes:
1. HA Trade-off: By putting all CNs in one zone, you lose zone-level redundancy for your compute layer. If that AZ goes down, your queries will fail until EKS brings the CNs up in another zone.
2. EBS Volumes: If you are using local NVMe or specific EBS volumes for Data Cache, ensure those volumes are also available in the zone you select.
3. Applying the Change: After updating the YAML, apply it with kubectl apply -f <file>.yaml. The StarRocks Operator will perform a rolling restart of the CN pods to move them to the correct zone.
References
• deployment/sr_operator.md
• deployment/helm.md
• administration/management/BE_configuration.md
References
• deployment/sr_operator.md
• quick_start/helm.md
• deployment/deploy_manually.mdRumit Jain
06/11/2026, 7:52 AMRocky
06/11/2026, 7:52 AMreport_resource_usage_interval_ms | 1000 (1s) | 10000 - 30000 (10-30s) | 5000 - 10000 (5-10s)
statistic_collect_interval_sec | 300 (5m) | 3600 (1hr) | 600 - 1800 (10-30m)
* Lower Envs: You can afford less frequent updates to save significantly on "idle" network traffic. Setting the CN heartbeat to 10-30s and stats collection to hourly or daily is usually fine.
* Production: You want a balance. If the interval is too high (e.g., >30s), the FE might try to send a large query to a CN that is actually overloaded because the resource usage data is stale.
──────────
How to apply changes to a running cluster
1. FE Config (statistic_collect_interval_sec)
This can be changed dynamically via SQL.
sql
-- Change it immediately
ADMIN SET FRONTEND CONFIG ("statistic_collect_interval_sec" = "3600");
-- Verify the change
ADMIN SHOW FRONTEND CONFIG LIKE 'statistic_collect_interval_sec';
2. CN Config (report_resource_usage_interval_ms)
This is a BE/CN parameter. It can be changed via an HTTP API call to each CN pod.
bash
# Repeat for each CN Pod IP
curl -XPOST -u admin:<password> \
"http://<CN_POD_IP>:8040/api/update_config?report_resource_usage_interval_ms=10000"
──────────
How to make them permanent in EKS
If you only use the commands above, the settings will be lost when the pods restart. To make them permanent in your StarRocksCluster CRD or Helm Chart:
If using StarRocks Operator:
yaml
spec:
starRocksFeSpec:
config:
statistic_collect_interval_sec: "3600"
starRocksCnSpec:
config:
report_resource_usage_interval_ms: "10000"
If using Helm:
Update your `values.yaml`:
yaml
starrocksFeSpec:
config:
statistic_collect_interval_sec: "3600"
starrocksCnSpec:
config:
report_resource_usage_interval_ms: "10000"
Pro-Tip: Disable Auto-Statistics in Lower Envs
If you aren't running complex queries in your dev environment yet, you can disable the auto-collection of statistics entirely to stop the CNs from reading data from S3 just to update metadata:
sql
ADMIN SET FRONTEND CONFIG ("enable_statistic_collect" = "false");
References
• administration/management/FE_configuration.md
• administration/management/BE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SET_CONFIG.md
References
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SET_CONFIG.md
• faq/Deploy_faq.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/SET.md
• administration/management/BE_configuration.md
• sql-reference/System_variable.mdRumit Jain
06/11/2026, 8:02 AMRocky
06/11/2026, 8:02 AMreport_resource_usage_interval_ms
This parameter controls how often Compute Nodes (CNs) tell the FE Leader "Here is how busy I am."
* Stale Load Balancing: If you increase this to 10–30 seconds, the FE might believe a CN is idle when it actually just started a heavy query 5 seconds ago. The FE might then "pile on" more queries to that same CN, leading to a temporary performance bottleneck or "hot spot."
* Query Queuing Delays: If you use Query Queues (concurrency limits), the FE uses these reports to decide if it can let a new query run. With a high interval, the FE might keep queries in the queue for a few extra seconds even after a CN has finished its work, because it hasn't received the "I'm free" update yet.
* Inaccurate Monitoring: Your Grafana dashboards or SHOW USAGE RESOURCE GROUPS results will look "steppy" or lagged, as the metrics are updated less frequently.
2. Side Effects of increasing statistic_collect_interval_sec
This parameter controls how often the cluster checks if your tables have changed enough to warrant a new "Analyze" (statistics update) for the Cost-Based Optimizer (CBO).
* Sub-optimal Query Plans: The CBO uses statistics (row counts, data distribution) to decide the fastest way to run a query (e.g., whether to use a Broadcast Join or a Shuffle Join). If you load 10 million rows but the stats haven't updated yet, the CBO might think the table is still empty and choose a "Broadcast Join," which could cause the query to fail or run very slowly.
* "Plan Instability": You might find that a query runs fast one minute and slow the next because the optimizer is working with "near-stale" data.
* Manual Intervention Required: In lower environments, this is rarely an issue. However, in Production, if you increase this interval significantly, you should get into the habit of running ANALYZE TABLE <name> manually after a large data load to ensure the optimizer is up to date.
3. Side Effects of disabling enable_statistic_collect
* CBO "Blindness": Without any statistics, the StarRocks optimizer has to "guess" the size of your tables. For simple queries on single tables, you won't notice a difference. For complex joins across 3+ tables, the performance will likely degrade significantly because the join order will be essentially random.
Summary Recommendation
* In Dev/Test: The side effects are minimal. Since you aren't running high-concurrency production workloads, the 10-30 second delay in reporting and the hourly stats check are perfect for keeping your AWS bill low.
* In Production: Keep report_resource_usage_interval_ms around 5000 (5s). This is frequent enough to prevent major load-balancing issues while still reducing 80% of the default "chatter" cost. For statistics, keep the interval shorter (10-20m) unless you have a very predictable batch-loading schedule.
References
• administration/management/BE_configuration.md
• administration/management/FE_configuration.md
• using_starrocks/Cost_based_optimizer.md
• administration/management/resource_management/query_queues.mdRumit Jain
06/11/2026, 11:55 AMtopologySpreadConstraints: []
- maxSkew: 1
topologyKey: <http://topology.kubernetes.io/zone|topology.kubernetes.io/zone>
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
<http://app.kubernetes.io/component|app.kubernetes.io/component>: fe
still fe pods are coming in different AZ's.Rocky
06/11/2026, 11:55 AMtopologySpreadConstraints only removes the requirement to spread pods; it doesn't force Kubernetes to keep them together. By default, the Kubernetes scheduler will still try to spread pods across different nodes and zones to ensure High Availability (HA).
To force all FE pods into the same zone, you must use Affinity or a Node Selector.
Option 1: Hard-pin to a specific zone (Simplest)
Use a nodeSelector to tell Kubernetes exactly which zone the FE pods are allowed to run in.
yaml
starrocks:
starrocksFESpec:
nodeSelector:
<http://topology.kubernetes.io/zone|topology.kubernetes.io/zone>: "us-east-1a" # Replace with your actual zone name
Option 2: Use Pod Affinity (Dynamic)
If you don't want to hardcode a zone but want all FE pods to "stick together" in whichever zone the first one lands in, use podAffinity.
yaml
starrocks:
starrocksFESpec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
<http://app.kubernetes.io/component|app.kubernetes.io/component>: fe
topologyKey: "<http://topology.kubernetes.io/zone|topology.kubernetes.io/zone>"
Why your change didn't work:
1. Default Scheduler Behavior: Even without a spread constraint, K8s prefers spreading pods across zones if multiple zones are available in your EKS node groups.
2. Existing Pods: Kubernetes usually won't move existing pods just because you removed a constraint. You often need to delete the pods to trigger a reschedule.
3. Storage (Crucial): FE pods use Persistent Volumes (PVs) for metadata. In AWS, EBS volumes are locked to a single zone.
* If your FE PVs were already created in different zones (e.g., FE-0 in us-east-1a and FE-1 in us-east-1b), Kubernetes cannot move them to the same zone because the disk cannot follow the pod.
* Check your PVs: Run kubectl get pv -L <http://topology.kubernetes.io/zone|topology.kubernetes.io/zone>. If they are in different zones, you would need to recreate the volumes in a single zone to successfully move the pods.
Recommendation
If you are doing this to save cross-AZ costs, Option 1 (nodeSelector) is the most reliable. Combine it with the same nodeSelector for your CNs/BEs so the entire cluster lives in one zone.
References
• quick_start/helm.md
• deployment/sr_operator.md
• faq/Deploy_faq.md
References
• quick_start/helm.md
• faq/Deploy_faq.md
• deployment/sr_operator.md
• administration/management/FE_configuration.md
• deployment/helm.md
• administration/management/BE_configuration.md
• deployment/deploy_manually.md
-zone "deploying-starrocks")
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SET_CONFIG.md
• sql-reference/sql-statements/cluster-management/config_vars/SET.md
• sql-reference/System_variable.md
• using_starrocks/Cost_based_optimizer.md
• administration/management/resource_management/query_queues.mdRocky
06/11/2026, 11:55 AMRumit Jain
06/11/2026, 1:14 PMStarrocks > CREATE TABLE test_table_new (
-> id INT,
-> name VARCHAR(20)
-> )
-> DISTRIBUTED BY HASH(id);
ERROR 1064 (HY000): fail to create tablet: 10023: [Internal error: starlet err [RequestID=X3H8QMDYAY5QJP0B][StatusCode=301]Put object <s3://starrocks-data/52/c5e19b33-3685-493e-946c-101056134c48/db10209/10211/10213/SCHEMA_00000000000027E4> error: Unable to parse ExceptionName: PermanentRedirect Message: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.]Rocky
06/11/2026, 1:14 PMPermanentRedirect (StatusCode 301) is a standard AWS S3 response. It occurs because the S3 endpoint or region configured in your StarRocks cluster does not match the actual physical region where your S3 bucket resides.
In StarRocks shared-data mode (v3.x+), the cluster tries to write metadata and data (tablets) to S3. If it sends a request to the wrong regional endpoint (e.g., trying to reach a bucket in us-east-1 using a us-west-2 endpoint), AWS rejects it with this redirect error.
How to Fix
You need to update your storage configuration to use the correct region and endpoint for the bucket starrocks-data.
1. Identify the Correct Region
First, verify which AWS region your bucket starrocks-data is located in (e.g., via the AWS Console or aws s3api get-bucket-location --bucket starrocks-data).
2. Update the Storage Volume (Recommended)
If you created a STORAGE VOLUME manually, you can update its properties with the correct endpoint. Replace your_region and the endpoint URL below with the actual values:
sql
ALTER STORAGE VOLUME builtin_storage_volume -- or your custom volume name
SET (
"aws.s3.region" = "us-east-1",
"aws.s3.endpoint" = "<https://s3.us-east-1.amazonaws.com>"
);
Note: If you are using an EKS cluster with VPC endpoints, ensure the endpoint URL is correct for your internal network.
3. Update fe.conf (If using built-in volume)
If your cluster was initialized using S3 settings in the fe.conf file (common in Helm/Operator deployments), check the following parameters in your FE configuration:
* aws_s3_region
* aws_s3_endpoint
If these are wrong, update them in your Helm values.yaml or StarRocksCluster CRD and restart the FE.
Why this happens
AWS S3 is globally unique but regionally constrained. While some tools automatically handle redirects, the StarRocks "starlet" (the storage engine component) requires the explicit regional endpoint to ensure high performance and avoid the latency/costs associated with cross-region requests.
References
• deployment/shared_data/s3.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.md
References
• administration/management/FE_configuration.md
• quick_start/shared-data.md
• deployment/shared_data/s3.mdRumit Jain
06/11/2026, 1:22 PMaws.s3.endpoint" = "<https://s3.us-east-1.amazonaws.com>"
in storage volume. Is this mandatory? Can it contribute in data transfer cost?Rocky
06/11/2026, 1:22 PM"aws.s3.endpoint" = "<https://s3.us-east-1.amazonaws.com>" in a storage volume is highly important for both functionality and cost management. Here is the breakdown:
1. Is it mandatory?
Technically, the AWS SDK can sometimes infer the default regional endpoint if only aws.s3.region is provided. However, for StarRocks:
* Practically Mandatory: As you saw with your 301 Permanent Redirect error, StarRocks' internal storage engine often requires an explicit, correct regional endpoint to avoid redirection issues. AWS S3 buckets created in certain regions (or newer buckets) are very strict about being addressed via their specific regional endpoint.
* Mandatory for Non-S3 Storage: If you use S3-compatible storage (like MinIO or Ceph), this field is mandatory to point StarRocks to your custom server.
* Mandatory for VPC Endpoints: If you want to use a private connection (see below), you must specify the endpoint.
2. Importance for Data Transfer Cost
This is where the endpoint choice has the biggest financial impact.
* Avoiding NAT Gateway Costs: If your StarRocks cluster is in a private subnet and you use the public S3 endpoint, all data traffic (which can be terabytes in a shared-data cluster) may go through an AWS NAT Gateway. AWS charges significant fees per GB for NAT Gateway data processing ($0.045 per GB in most regions).
* VPC Gateway Endpoints (Free): You can create an S3 Gateway Endpoint in your VPC (this is a free AWS service). When you do this, traffic to the standard <http://s3.us-east-1.amazonaws.com|s3.us-east-1.amazonaws.com> endpoint is automatically routed over the AWS internal network instead of the internet/NAT. This eliminates the data processing charge.
* S3 PrivateLink (Interface Endpoints): If you use an S3 Interface Endpoint, AWS provides a specific DNS name (e.g., <http://vpce-xxxx.s3.us-east-1.vpce.amazonaws.com|vpce-xxxx.s3.us-east-1.vpce.amazonaws.com>). You would put this specific URL into the aws.s3.endpoint field. Note that Interface Endpoints have their own hourly and per-GB costs, so Gateway Endpoints are usually preferred for S3 to save money.
3. Importance for Performance
* Latency: Using the correct regional endpoint ensures your requests don't suffer from "hop" delays caused by AWS redirecting your request from a global endpoint to a regional one.
* Throughput: Keeping traffic inside the AWS private network (via VPC endpoints) generally provides higher and more consistent throughput compared to traversing a NAT gateway or the public internet.
Summary Recommendation
Always specify the aws.s3.endpoint.
* To save costs: Ensure you have an S3 Gateway Endpoint configured in your AWS VPC Route Table for the subnets where StarRocks is running. This makes the transfer to the regional S3 endpoint free and private.
* To fix your error: Ensure the region in the URL matches the aws.s3.region property and the actual physical location of your bucket.
References
• deployment/shared_data/s3.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
References
• administration/management/FE_configuration.md
• faq/shared_data_faq.md
• deployment/shared_data/s3.md
• loading/s3.mdRumit Jain
06/11/2026, 1:28 PMaws.s3.endpoint" = "<https://s3.us-east-1.amazonaws.com>"
was missing from my storage volume. Can this be the reason i was getting huge data transfer cost?Rocky
06/11/2026, 1:29 PMaws.s3.endpoint blank, the StarRocks storage engine often defaults to the S3 Global Endpoint (<https://s3.amazonaws.com>).
AWS S3 Gateway Endpoints work by modifying your VPC Route Table to intercept traffic. However, they are region-specific. They only intercept traffic destined for the specific IP ranges of that region's S3 service (e.g., <http://s3.us-east-1.amazonaws.com|s3.us-east-1.amazonaws.com>).
* With Regional Endpoint: Traffic matches the Gateway Endpoint route → Traffic stays inside AWS network → Cost: $0.
* Without Regional Endpoint: Traffic hits the Global Endpoint → Does NOT match the Gateway route → Traffic goes through your NAT Gateway to the internet → Cost: ~$0.045 per GB.
2. Shared-Data Mode I/O Volume
In StarRocks shared-data mode (v3.x), every single query and every background compaction involves reading from or writing to S3.
* If you have a cluster moving 10TB of data a month, a NAT Gateway would charge you roughly $450/month just for "Data Processing," even if the data never leaves the AWS region.
* By explicitly setting the endpoint to <https://s3.us-east-1.amazonaws.com>, you ensure the traffic matches the Gateway Endpoint route, making that 10TB of transfer free.
3. The "301 Redirect" Link
The error you received earlier (301 Permanent Redirect) was AWS telling StarRocks: "You are trying to talk to me via the global/wrong endpoint, but this bucket is in us-east-1." Because the request was pointing to the wrong place, it was leaving your "free" internal path and trying to find the bucket via the public/NAT path.
Summary of Fix
To stop the costs and the errors, ensure your Storage Volume (or fe.conf) includes:
1. "aws.s3.region" = "us-east-1"
2. "aws.s3.endpoint" = "<https://s3.us-east-1.amazonaws.com>"
Once updated, you can verify it's working by checking your NAT Gateway CloudWatch metrics (BytesOutToDestination or ProcessedBytes); you should see the traffic drop to near zero while StarRocks is active.
References
• deployment/shared_data/s3.md
• administration/management/FE_configuration.md
• faq/shared_data_faq.md
References
• administration/management/FE_configuration.md
• deployment/shared_data/s3.md
• faq/shared_data_faq.md
• loading/s3.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• using_starrocks/Cost_based_optimizer.md
• deployment/helm.md
• quick_start/shared-data.md
• administration/management/BE_configuration.md
• administration/management/resource_management/query_queues.md
• sql-reference/System_variable.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SET_CONFIG.mdRocky
06/11/2026, 1:29 PMRumit Jain
06/11/2026, 1:31 PMRocky
06/11/2026, 1:33 PMALTER STORAGE VOLUME statement.
The SQL Command
Run the following command in your StarRocks MySQL client:
sql
ALTER STORAGE VOLUME your_volume_name -- usually 'builtin_storage_volume' if you didn't name it
SET (
"aws.s3.region" = "us-east-1",
"aws.s3.endpoint" = "<https://s3.us-east-1.amazonaws.com>"
);
Important Details:
* No Downtime: This change is applied to the cluster's metadata. Once executed, subsequent read/write requests from the FE and BE nodes will use the new regional endpoint.
* Validation: You can verify the change was applied by running:
sql
DESC STORAGE VOLUME your_volume_name;
* Path Safety: The documentation notes that you cannot change the LOCATIONS (e.g., the bucket name/path itself) without making the data read-only. However, changing the endpoint and region is considered a connection/credential update and is perfectly safe as long as the bucket physically resides in that region.
* Cost Impact: As soon as this is executed, your traffic should start routing through the S3 Gateway Endpoint in your VPC, which will immediately stop the NAT Gateway "Data Processing" charges for StarRocks-to-S3 traffic.
If you are using a "Built-in" Volume
If you did not manually create a storage volume and are relying on the one configured during cluster initialization (via fe.conf), you can still use the ALTER STORAGE VOLUME command on the volume named builtin_storage_volume.
(Note: In older versions or specific deployments where the volume is strictly tied to fe.conf, you might also need to update the fe.conf file to ensure the setting persists if the FE metadata were ever lost/reconstructed, but the SQL command is the primary way to update a running cluster.)
References
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/DESC_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
References
• administration/management/FE_configuration.md
• deployment/shared_data/s3.md
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/DESC_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• quick_start/shared-data.md
• administration/management/BE_configuration.md
• loading/s3.md
• administration/management/resource_management/query_queues.md
• sql-reference/System_variable.mdRocky
06/11/2026, 1:33 PMRocky
06/11/2026, 1:33 PMRocky
06/11/2026, 1:34 PMaws.s3.endpoint without deleting the cluster or your tables. You do not need to restart the FE or BE processes either; the change takes effect for subsequent requests.
How you update it depends on how your storage is configured:
1. If you are using Storage Volumes (v3.1+)
If you manually created a storage volume or are using the default one in v3.1+, you can use the ALTER STORAGE VOLUME command. In StarRocks, properties like the region and endpoint are considered "access/credential" properties rather than "path" properties, so they are mutable.
sql
-- Replace 'builtin_storage_volume' with your volume name if it's different
ALTER STORAGE VOLUME builtin_storage_volume
SET (
"aws.s3.endpoint" = "<https://s3.us-east-1.amazonaws.com>",
"aws.s3.region" = "us-east-1"
);
2. If you are using the "Built-in" volume via fe.conf
In some shared-data deployments (like early v3.0 or specific Helm configurations), the S3 settings are pulled from the fe.conf file or the environment.
* Helm/Operator: If you are using the StarRocks Operator, you should update the values.yaml (for Helm) or the StarRocksCluster YAML spec. The operator will perform a rolling restart of the FE and BE nodes to apply the new configuration.
* Manual Deployment: If you are managing fe.conf manually, you can update the aws_s3_endpoint and aws_s3_region parameters. Note that these specific parameters in fe.conf are marked as not mutable via SQL (ADMIN SET CONFIG), so you must update the file and restart the FE nodes.
Important Note on "Path-related" Properties
While you can change the endpoint (how you get to the data), you cannot change the locations (where the data is, i.e., the bucket name or sub-path). Changing the endpoint from a global one to a regional VPC-specific one is safe because the underlying data in the bucket remains the same.
How to verify
After applying the change, run a simple DESC STORAGE VOLUME builtin_storage_volume; to confirm the properties are updated. Then, try creating your table again. The 301 error should disappear, and your NAT Gateway costs should drop.
References
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
• deployment/shared_data/s3.md
References
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.md
• deployment/shared_data/s3.md
• sql-reference/sql-statements/cluster-management/storage_volume/CREATE_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/DESC_STORAGE_VOLUME.md
• sql-reference/sql-statements/cluster-management/storage_volume/SHOW_STORAGE_VOLUMES.md
• deployment/helm.md
• quick_start/shared-data.md
• administration/management/BE_configuration.mdRocky
06/11/2026, 1:34 PMRocky
06/11/2026, 1:34 PMRocky
06/11/2026, 1:34 PMRocky
06/11/2026, 1:34 PMRocky
06/11/2026, 1:34 PMRocky
06/11/2026, 1:34 PMRocky
06/11/2026, 1:34 PMRocky
06/11/2026, 1:34 PMRocky
06/11/2026, 1:34 PMRumit Jain
06/11/2026, 5:06 PMRocky
06/11/2026, 5:06 PMscaleDown behavior to prevent rapid thrashing.
* Shared-Data Mode: HPA for CN is primary intended for shared-data clusters (v3.x). While CNs can technically be added to shared-nothing clusters for computation, the benefits are most pronounced in shared-data architectures.
How to Implement
The recommended way is to use the StarRocks Kubernetes Operator. You define the autoScalingPolicy directly in your StarRocksCluster YAML. The Operator will then automatically create and manage the Kubernetes HPA resource for you.
Example Configuration:
yaml
starRocksCnSpec:
autoScalingPolicy:
maxReplicas: 10
minReplicas: 2
hpaPolicy:
metrics:
- type: Resource
resource:
name: cpu
target:
averageUtilization: 60
type: Utilization
behavior:
scaleDown:
policies:
- type: Percent
value: 10
periodSeconds: 60
Official Documentation
You can find the detailed configuration guide and templates in the StarRocks Operator documentation:
* *StarRocks Operator - Automatic scaling for CN cluster*
References
• deployment/sr_operator.md
• deployment/shared_data/feature-support-shared-data.md
• administration/management/Scale_up_down.md
References
• deployment/sr_operator.md
• administration/management/Scale_up_down.md
• deployment/deploy_manually.mdRumit Jain
06/11/2026, 5:09 PMRocky
06/11/2026, 5:09 PMCLOUD_NATIVE persistent index. The index is stored on S3. When you scale CN nodes, the new node simply pulls the index from S3 into its local cache. There is no index rebuilding or data redistribution required.
* Colocation Groups:
* In Shared-Nothing (BEs): Scaling is "fragile." If you add/remove a node, the Colocation Group becomes "unstable" until the tablet scheduler manually moves all related shards to the same new nodes.
* In Shared-Data (CNs): Colocation is less critical. Because all nodes can access all data on S3, StarRocks uses Cache Affinity rather than physical data placement to keep joins fast. Scaling a CN node doesn't "break" a group; it just means the new node has a "cold cache" for a few minutes.
Summary Table: Scaling Impact
Feature | Shared-Nothing (BE Scaling) | Shared-Data (CN Scaling)
Primary Key | Heavy (Index rebuild/migration) | Smooth (Cache-only warm up)
Colocation | Fragile (Requires rebalance) | Elastic (Managed by cache affinity)
Scaling Speed | Slow (Moving data) | Fast (Stateless start)
Recommendation: If you are using Shared-Data mode (v3.x), you should feel confident scaling CN nodes automatically. The architecture was specifically designed to make features like Primary Key tables "cloud-native" and elastic.
References
• introduction/Architecture.md
• deployment/sr_operator.md
• best_practices/primarykey_table.md
• using_starrocks/Colocate_join.md
References
• using_starrocks/Colocate_join.mdRocky
06/11/2026, 5:09 PMRumit Jain
06/11/2026, 6:23 PMRocky
06/11/2026, 6:24 PM1/N where N is the new node count) will be re-mapped to the new node. The FE scheduler immediately begins routing query fragments for those tablets to the new CN to balance the CPU load. It does not "ignore" new nodes; it forces them to take over their share of the work.
* Initial Latency: The very first queries on the new node will indeed be slower (cache misses and index loading), but this is a temporary "warm-up" phase.
2. How significant is the impact in practice?
For most production workloads, the impact is minor compared to the benefits of increased compute capacity.
* Warm-up Duration: Depending on your index size and network bandwidth to S3, a new node typically reaches "warm" status within a few minutes of receiving active queries.
* Utilization: Because the FE is aggressive about compute balancing, you will see the CPU utilization on new nodes rise almost immediately, even while they are still fetching data into their local caches.
* Scale-Down: The "rebalancing overhead" is virtually zero. Since the data is on S3, a node can be terminated immediately. The FE simply re-maps its tablets back to the remaining nodes, which then fetch the required data from S3.
3. Recommendation for HPA
Yes, StarRocks still highly recommends HPA-based autoscaling for CN nodes, even with Primary Key tables and Colocation groups. The ability to double or triple your query throughput in response to a spike far outweighs the 1-2 minute latency penalty of a cold cache.
Best Practices for HPA with CNs:
1. Use Persistent Index: Ensure you are on StarRocks v3.2 or later and have enabled datacache.enable to take advantage of S3-backed index loading.
2. Conservative Scale-Down: Configure your HPA behavior to be slow on scale-down. This prevents "thrashing" where nodes are deleted and immediately re-added, which would cause constant cache misses.
yaml
behavior:
scaleDown:
stabilizationWindowSeconds: 300 # Wait 5 mins before scaling down
policies:
• type: Percent
value: 10
periodSeconds: 60
3. Data Cache Warmup (v3.3+): Use the CACHE SELECT or automated Data Cache Warmup feature to proactively fetch hot data for important tables if you know a load spike is coming.
4. Set a Minimum Baseline: Never scale to zero. Maintain a minReplicas count that can handle your "baseline" traffic with a warm cache.
SummaryRocky
06/11/2026, 6:24 PMRumit Jain
06/11/2026, 6:34 PMRocky
06/11/2026, 6:34 PMpersistent_index_type = CLOUD_NATIVE.
* No Rebuilding: When a new CN is added, it does not rebuild the index by scanning data. It simply loads the already-built index from S3 into its local cache. This is a metadata/IO operation that is orders of magnitude faster than a rebuild.
* Scale-down: When a node is removed, there is no "re-homing" of the index. The index already lives on S3. The FE simply reassigns the tablet to another CN, which then loads that index from S3.
2. Does StarRocks "prefer" existing nodes?
Your understanding of the scheduler is partially correct, but the conclusion (limited utilization) is not.
* Consistent Hashing (Cache Affinity): StarRocks uses consistent hashing to map tablets to CNs. When you add a new CN, the "hash ring" is updated.
* Immediate Utilization: The FE scheduler will immediately re-map a fair portion (roughly $1/N$) of the tablets to the new CN. It does not "prefer" the old node for those specific tablets; it forces the new node to handle them.
* Localized Impact: Only the queries touching those specific $1/N$ tablets will experience a "cold cache" or "index loading" delay. The other $N-1/N$ of the workload continues unaffected on the warm nodes.
* Result: The new CN typically reaches high utilization within minutes of joining the cluster as it fills its cache.
3. Impact of Colocation Groups
In shared-data mode, the concept of "physical" colocation is less rigid. StarRocks primarily uses Cache Affinity to ensure that data involved in a join is processed on the same CN to hit the local cache.
* Scaling a CN triggers a re-mapping of some tablets in the colocation group to the new node.
* While this causes a temporary cache-miss for those specific joins, the system remains balanced. StarRocks does not "avoid" the new node; it prioritizes long-term balance over short-term "warmth."
Summary of Practical Impact
Aspect | Accuracy of your advice | Modern Behavior (v3.3+)
Index Cost | Accurate for local-disk index | Minimal with Cloud-Native index (Load vs. Rebuild).
Utilization | Inaccurate | High. FE aggressively routes traffic to new nodes via hash ring updates.
Re-balancing | Inaccurate | Automatic. No manual "re-homing" required; handled by metadata updates.
HPA Recommendation | Recommended | The throughput gain of adding CPUs far outweighs the minor warm-up latency.
Recommendations
To ensure HPA works effectively with PK tables:
1. Use Cloud-Native Index: Set PROPERTIES ("enable_persistent_index" = "true", "persistent_index_type" = "CLOUD_NATIVE") on your PK tables.
2. Enable Data Cache: Ensure datacache.enable = true so CNs can reuse S3 data locally.
3. Conservative Scale-Down: Set a stabilizationWindowSeconds (e.g., 300s) in your HPA policy to prevent "thrashing" (rapidly adding and removing nodes), which is the only scenario where cache-miss costs become significant.
References
• best_practices/primarykey_table.md
• deployment/shared_data/feature-support-shared-data.mdRocky
06/11/2026, 6:34 PMRumit Jain
06/12/2026, 2:03 AMRocky
06/12/2026, 2:04 AMpipeline_dop (Degree of Parallelism) is set to half the number of cores. On a 4-core node, a query only gets 2 threads, significantly increasing execution time for heavy scans.
* Background Tasks: Even "Compute Nodes" perform background tasks like local data cache management and metadata heartbeats. On low-CPU nodes, these background tasks can compete with query execution, leading to "jitter" or high tail latencies (P99).
3. Methodology for Determining Node Count
The decision between 2, 4, 8, or more CN nodes is driven by Parallelism vs. Concurrency tradeoffs:
* Decision Factor 1: Data Volume & Storage Throughput
* In shared-data mode, each CN node has a limit on how much data it can pull from object storage (S3/GCS) and cache locally. If your "hot" dataset is 1 TB and your CNs have 200 GB of local disk cache each, you need at least 5-6 CNs to ensure the hot data stays "warm" and avoids S3 latency.
* Decision Factor 2: Query Complexity (The "Vertical" limit)
* If a single query is too slow even on an idle cluster, you should scale up (add vCPUs/RAM to existing nodes).
* Decision Factor 3: QPS (The "Horizontal" limit)
* If query latency is acceptable but it spikes when multiple users log in, you should scale out (add more CN nodes).
4. Capacity Planning Guidance
While there is no "universal formula," the following benchmarks from production deployments serve as a guide:
Metric | Planning Rule of Thumb
Simple Point Queries | ~2,000–5,000 QPS per 16-core CN node (standard table).
Complex Analytics | ~5–20 concurrent complex queries (multi-table joins) per 16-core CN node.
Ingestion | ~50MB–100MB/s per CN node (depending on format and table type).
Tablet Count | Maintain roughly 1 tablet per vCPU per disk for optimal parallelism.
How to decide on the number of nodes:
1. Baseline: Start with 3 CN nodes (16c/64g). This provides high availability and enough compute to handle background compaction/caching.
2. Test for Saturation: Run your expected peak QPS. If CPU utilization stays above 70%, add nodes.Rocky
06/12/2026, 2:04 AMRumit Jain
06/12/2026, 2:50 AMRocky
06/12/2026, 2:50 AM/metrics endpoints (default ports: FE 8030, BE/CN 8040).
1. Validating QPS (Query Per Second)
QPS is measured at the FE (Frontend) layer. The following metrics are the most critical:
* Metric Name: starrocks_fe_query_total
* Description: A cumulative counter of all queries received by the FE.
* PromQL to get QPS:
promql
sum(irate(starrocks_fe_query_total[1m]))
* Metric Name: starrocks_fe_query_err
* Description: Total number of failed queries. Use irate to see the error rate.
* Metric Name: starrocks_fe_query_latency_ms (Summary/Histogram)
* Description: Use this to validate P99 or P95 latencies for the current load.
2. Validating Ingestion Throughput
Ingestion load is primarily tracked at the BE/CN (Backend/Compute Node) layer for data volume and the FE layer for transaction status.
A. Global Throughput (All Load Types)
These metrics are the standard way to see how much data is actually being written to the cluster:
* Bytes/sec (Throughput): starrocks_be_load_bytes_total
* PromQL: sum(irate(starrocks_be_load_bytes_total[1m]))
* Rows/sec: starrocks_be_load_rows_total
* PromQL: sum(irate(starrocks_be_load_rows_total[1m]))
B. Specific Load Type Monitoring
If you need to break down the load by method:
* Stream Load: starrocks_be_stream_load_put_request_total (Request count) and starrocks_fe_txn_total_latency_ms{type="stream_load"} (Latency).
* Routine Load (Kafka):
* starrocks_fe_routine_load_receive_bytes (Total bytes consumed).
* starrocks_fe_routine_load_rows (Total rows consumed).
* Merge Commit (v3.2+): merge_commit_request_bytes and merge_commit_request_total (Useful if using the new high-frequency Stream Load API).
3. Validating System Load Bottlenecks
To confirm if your current QPS/Ingestion is hitting a wall, monitor these "saturation" metrics:
* CPU Usage: (1 - avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100 (Should ideally be below 70-80% for stable latency).
* Memory Usage: starrocks_be_memory_usage_bytes (Compare against mem_limit).
* Load Channel Status: starrocks_be_load_channel_count (Indicates how many concurrent load sessions are active).
Summary Table for Quick Validation
Metric Target | Prometheus Metric Name | Unit | Endpoint
QPS | starrocks_fe_query_total | Count | FE
Query Latency | starrocks_fe_query_latency_ms | ms | FE
Ingestion (Bytes) | starrocks_be_load_bytes_total | Bytes | BE/CN
Ingestion (Rows) | starrocks_be_load_rows_total | Count | BE/CN
Load Latency | starrocks_fe_txn_total_latency_ms | ms | FE
Tip: If you are using Grafana, it is highly recommended to import the StarRocks Official Dashboard, which pre-calculates these QPS and Ingestion rates for you. You can find the JSON templates in the StarRocks GitHub repository.
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• loading/loading_introduction/troubleshooting_loading.md
• faq/operation_maintenance_faq.md
References
• administration/management/monitoring/metrics.md
• loading/loading_introduction/troubleshooting_loading.mdRumit Jain
06/12/2026, 3:11 AMsum(irate(starrocks_fe_query_total[1m]))Rocky
06/12/2026, 3:11 AMstarrocks_fe_query_total is a Counter.
* Cumulative Total: These numbers represent the total number of queries processed by that specific FE node since it was last started.
* Per-Node Basis: Since you see different numbers for different nodes (e.g., 288 on FE-1, 488 on FE-2), it indicates how queries are being distributed by your load balancer.
* Example: If node A shows 288, it has handled exactly 288 queries since its process began. If you refresh the page and run a query, that number will increment to 289.
2. Why does sum(irate(...)) return no data?
If sum(irate(starrocks_fe_query_total[1m])) returns "no data," it is usually due to one of three reasons:
Reason A: Scrape Interval vs. Range Window (Most Common)
irate (and rate) requires at least two data points within the time window to calculate a slope.
* If your Prometheus scrape interval is 1 minute and your query window is [1m], Prometheus often only finds one data point in that window.
* Solution: Increase the window to at least 4x your scrape interval. For a 1-minute scrape interval, use [5m].
promql
sum(rate(starrocks_fe_query_total[5m]))
Reason B: Low Query Volume
irate looks at the last two points. If you are not running any queries, the counter doesn't change. While Prometheus usually returns 0, some visualization tools or specific Prometheus configurations might hide series that have had no change.
Reason C: irate vs. rate
* irate is highly volatile; it only looks at the last two points in the window. It is good for "zooming in" on spikes but can be jumpy.
* rate calculates the average per-second increase over the entire window (e.g., 5 minutes). It is much more stable and is the recommended way to calculate QPS for dashboards.
Recommended Query for QPS
To see the total cluster QPS reliably, use this:
promql
sum(rate(starrocks_fe_query_total[5m]))
* rate(...[5m]): Calculates the average increase per second over a 5-minute window.
* sum(...): Adds the rates from all FE nodes together to give you the total cluster-wide QPS.
How to verify your data is "real"
If you want to verify the counter is working, run this simple query:
promql
increase(starrocks_fe_query_total[5m])
This will show you exactly how many queries were executed in the last 5 minutes. If this returns 0 or data, then your Prometheus is working correctly, Prometheus is working correctly, and you simply have a low-traffic environment.Rumit Jain
06/12/2026, 3:17 AMRocky
06/12/2026, 3:17 AMincrease query (which totaled approximately 11.5 queries across the three FE nodes).
2. Why are there decimals in the increase count?
You might expect increase to show whole numbers (like 1, 7, and 3), but Prometheus uses extrapolation.
* If your Prometheus scrapes every 30 seconds, the 5-minute window might not perfectly align with the exact moment a query happened.
* Prometheus looks at the slope between the data points it has and "guesses" what the value would be at the exact start and end of your 5-minute window.
* Takeaway: You can treat 1.05 as "1 query" and 7.36 as "7 queries."
3. Where are these queries coming from if you aren't running any?
Since you aren't actively running queries, these ~12 queries in 5 minutes are likely "background noise" from your infrastructure:
* Load Balancer Health Checks: If you have a Load Balancer (like F5, HAProxy, or a Kubernetes Ingress) checking the FE's MySQL port (9030) using a SELECT 1 or just a login check, each check increments this counter.
* Monitoring Tools: If you have a monitoring agent or a Grafana dashboard open, it might be running metadata queries (like SHOW FRONTENDS or SELECT 1) in the background to verify the cluster status.
* Internal Metadata Sync: While most internal StarRocks communication doesn't count as a "query," certain client-driven heartbeat mechanisms do.
Summary
* Your QPS is effectively zero for any real production workload.
* FE node distribution: Your queries are slightly unbalanced (one node handled ~7, another ~3, another ~1). This is normal for low-traffic scenarios where a load balancer might stick to one "active" node for health checks.
* Validation: To see the numbers jump, try running a script that executes 100 simple queries. You will see the rate jump to ~0.33 (100 queries / 300 seconds) and the increase show close to 100.
References
• administration/management/monitoring/metrics.mdRumit Jain
06/12/2026, 3:23 AMRocky
06/12/2026, 3:23 AMpromql
sum(increase(starrocks_fe_query_total{namespace="plattest03"}[24h]))
Result: Total number of queries handled by the cluster today.
* Average QPS for the Day:
promql
sum(rate(starrocks_fe_query_total{namespace="plattest03"}[24h]))
Note: This takes the total queries and divides by 86,400 seconds. If you have "quiet" nights, this number will be misleadingly low.
* Peak QPS (The "Real" Load):
promql
max_over_time(sum(rate(starrocks_fe_query_total{namespace="plattest03"}[1m]))[24h:1m])
Result: This is the highest QPS your cluster hit at any point in the last 24 hours. This is the metric you should use for capacity planning.
──────────
2. Daily Ingestion (Data Load)
For ingestion, you should track both Rows (processing effort) and Bytes (network/disk effort).
* Total Data Ingested (GB):
promql
sum(increase(starrocks_be_load_bytes_total{namespace="plattest03"}[24h])) / 1024 / 1024 / 1024
* Total Rows Ingested:
promql
sum(increase(starrocks_be_load_rows_total{namespace="plattest03"}[24h]))
* Peak Ingestion Rate (MB/s):
promql
max_over_time(sum(rate(starrocks_be_load_bytes_total{namespace="plattest03"}[1m]))[24h:1m]) / 1024 / 1024
──────────
3. How to conclude the "Load"
Once you have these numbers, compare them against your cluster's hardware resources:
1. Utilization Check: If your Peak QPS occurs at the same time your BE CPU Usage (metric: starrocks_be_cpu_usage) hits >70%, you are reaching your current capacity.
2. Concurrency Check: Check the metric starrocks_fe_query_latency_ms. If the latency (P99) increases significantly during your Peak QPS, it means the current load is causing queuing or resource contention.
3. Ingestion Health: If your Total Data Ingested is high but you see starrocks_be_disks_data_used_capacity growing faster than expected, check if your compaction is keeping up (metric: starrocks_be_compaction_deltas_total).
Recommendation:
If your average QPS is very low (like the 0.045 you saw earlier) but your "Peak QPS" is much higher (e.g., 50.0), you should optimize your cluster for that peak burst rather than the daily average.
References
• administration/management/monitoring/metrics.md
• faq/operation_maintenance_faq.mdRumit Jain
06/12/2026, 3:40 AMRocky
06/12/2026, 3:41 AMRaw Data Size * 3 (Replicas) / 3 (Compression Ratio)
* If you plan to have 1 TB of raw data, you will likely need ~1 TB of actual disk space across your 3 BEs.
3. CPU Sizing (FE/BE):
* If your production Peak QPS is expected to be > 100 or you have many complex joins, increase BE CPU to 32 or 64 cores per pod.
3. How to "Test" for Production Sizing
Since your current metrics don't show much, I recommend a Load Test before finalizing prod sizing:
1. Identify your expected production query (e.g., a specific Dashboard SQL).
2. Run a tool (like jmeter or a simple script) to hit your lower env with 20-50 concurrent users.
3. Monitor the starrocks_be_cpu_usage and starrocks_be_mem_usage during that test.
4. Scale Prod based on that ratio. (e.g., If 20 users hit 50% CPU on your dev pod, and you expect 100 users in prod, you will need 5x the CPU).
Summary Recommendation
If you are moving to production soon and don't have a high-traffic forecast yet:
* Start with 3 FE (8C/16G) and 3 BE (16C/64G).
* Use SSD storage for BEs to ensure low latency.
* If your cloud provider allows it, use Compute Nodes (CN) for easy auto-scaling if your query volume spikes unexpectedly spikes.
References
• deployment/plan_cluster.md
• faq/Deploy_faq.md
• faq/Others.mdRumit Jain
06/12/2026, 3:42 AMRocky
06/12/2026, 3:42 AMstarrocks_cache_dir.
* Metric to watch: starrocks_be_data_cache_hit_ratio. If this is low, your CNs are constantly fetching from slow object storage, and you need more local disk cache.
──────────
4. How to Determine Your Final Production Count
Since your lower env isn't under load, use this "Reverse Sizing" approach:
1. Define your Goal: "I want my P99 query latency to be < 500ms at 20 concurrent users."
2. Load Test: Use a tool (like Apache Benchmark or JMeter) to hit your current CN with 20 concurrent users.
3. Monitor CPU: If your 16-core CN hits 60% CPU during that test, you know that 1 CN can handle 20 users.
4. Final Calc: If your production requirement is 100 concurrent users, you will need (100 / 20) = 5 CNs.
Summary Checklist for Prod:
1. HA: At least 3 FEs and 2 CNs.
2. Resources: 16C / 64G for CNs is the recommended starting point.
3. Disk: Use SSD for the CN cache directory; otherwise, query speed will be bottlenecked by object storage latency.
References
• deployment/plan_cluster.md
• introduction/Architecture.md
• deployment/deploy_manually.md
References
• deployment/plan_cluster.md
• faq/Others.md
• faq/Deploy_faq.md
• introduction/Architecture.mdRumit Jain
06/12/2026, 3:50 AMstarrocks_be_data_cache_hit_ratio
Also, the MAX_POOL_SIZE is 20 and MAX_WAIT_QUEUE_SIZE is 100 is what we are currenlty configured.Rocky
06/12/2026, 3:51 AMstarrocks_be_data_cache_hit_ratio
In newer versions (v3.3+ and v4.0), StarRocks moved to more granular Data Cache metrics. Instead of a single "ratio" gauge, it provides counters for hits and misses so you can calculate a more accurate rate over time.
To get the Hit Ratio in Prometheus/Grafana, use this PromQL:
promql
sum(rate(block_cache_hit_bytes[5m])) /
(sum(rate(block_cache_hit_bytes[5m])) + sum(rate(block_cache_miss_bytes[5m])))
* What this tells you: If this ratio is low (e.g., < 0.5), your CN pods are constantly going to S3/Object Storage because the local SSD cache is too small or the data is "cold."
Alternatively, you can see a real-time JSON breakdown by hitting the CN (BE) API directly:
http://<CN_IP>:8040/api/datacache/app_stat
──────────
2. Understanding your MAX_POOL_SIZE (20) and MAX_WAIT_QUEUE_SIZE (100)
These parameters are not standard StarRocks fe.conf or be.conf settings. They are almost certainly configured in your Application/Client side (e.g., a Java JDBC/HikariCP pool or a proxy like ProxySQL).
What this means for your data:
* Throttling: Your application is hard-limited to 20 concurrent queries. Even if StarRocks could handle 500 QPS, your app will only send 20 at a time.
* Latency: If more than 20 queries are triggered, 100 will sit in your application's "Wait Queue." This adds "Application Latency" that StarRocks won't show in its own internal metrics.
* False Baseline: Your current QPS (1.4 peak) is well below this limit, so these pools are currently "empty."
──────────
3. How to decide Production Sizing with these limits
Since your application is configured to only send 20 concurrent queries, your StarRocks cluster sizing should be built to handle that specific concurrency with low latency.
Step 1: Calculate "Real" Production QPS
If your lower env has a peak of 1.4 QPS with 20 pool size, and you expect production to be 50x busier:
* Expected Prod QPS: ~70 QPS.
* Required Prod Pool Size: You will likely need to increase MAX_POOL_SIZE to 100 or 200 in production to avoid application-side bottlenecks.
Step 2: CN Sizing for 20-100 Concurrency
* CPU: In StarRocks, one query fragment typically consumes 1 CPU core during its execution. To handle a concurrency of 20 without queuing, a single CN with 16–32 Cores is a safe starting point.
* Memory: With a pool size of 20, you should expect 20 queries to run in parallel. If each query uses 2GB RAM (typical for OLAP), you need at least 40GB of "free" RAM for queries. A 64GB RAM pod is the recommended minimum for production.
* Scale Out: In the FE+CN architecture, if you see starrocks_be_cpu_usage exceed 60% in production, simply add another CN pod. Because it's shared-data, the new pod will be ready instantly.
Summary for Production:
1. Metric: Use the PromQL formula above to monitor cache health.
2. App Config: Increase your MAX_POOL_SIZE in production (start with 50-100) so the app doesn't bottleneck the database.
3. Pods: Use 3 FE (8C/16G) for HA and start with 2-3 CN (16C/64G). Ensure CNs have High-Performance SSDs for the cache to keep the hit ratio high.
References
• data_source/data_cache_observe.md
• administration/management/monitoring/metrics.md
• using_starrocks/caching/block_cache.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.md
ReferencesRocky
06/12/2026, 3:51 AMRumit Jain
06/12/2026, 3:55 AMsum(rate(block_cache_hit_bytes[5m])) /
(sum(rate(block_cache_hit_bytes[5m])) + sum(rate(block_cache_miss_bytes[5m])))Rocky
06/12/2026, 3:56 AMblock_cache_hit_bytes is likely due to the Prometheus prefix or the transition to the new StarCache metrics. In a standard Prometheus setup for StarRocks, you should look for:
* starrocks_be_block_cache_hit_bytes
* starrocks_be_block_cache_miss_bytes
If those are still not appearing, StarRocks v4.0.x sometimes exposes hit/miss metrics under the datacache namespace. Check for:
* starrocks_be_datacache_read_block_count (with a label type="hit" or "miss")
* starrocks_be_datacache_read_block_bytes
How to verify instantly:
Run this command from inside your network to see exactly what your CN is exporting:
bash
curl http://<CN_POD_IP>:8040/metrics | grep -E "cache|block|hit"
_Note: In v4.0, the system-level Data Cache configurations were simplified (deprecated block_cache_disk_size in favor of datacache_disk_size). Ensure your CNs have the cache enabled in their configuration._
──────────
2. Sizing Production based on your Pool Settings
Your MAX_POOL_SIZE = 20 and MAX_WAIT_QUEUE_SIZE = 100 are likely application-level settings (e.g., HikariCP or a Proxy). These are bottlenecks, not limits of StarRocks.
Inference for Sizing:
1. Concurrency Limit: Your application will never send more than 20 queries simultaneously to StarRocks. Even if your production traffic spikes, StarRocks will only see 20 "active" queries while the other 100 wait in your application queue.
2. Sizing for Throughput: To prevent that MAX_WAIT_QUEUE from filling up in production, your CN pods must be fast enough to finish queries quickly so the "slots" in the pool of 20 open up.
3. The "Safety" Ratio:
* A typical 16-core CN pod can comfortably handle 10–20 complex concurrent queries or ~100–200 simple concurrent queries.
* Since your app limits you to 20, 2 CN pods (16C/64G each) are sufficient to handle your entire application pool's capacity with overhead for background tasks.
Decision Matrix for Production:
Production Goal | Recommended Pod Sizing
Maintain Low Latency | 2x CN (16C / 64G). This provides 32 cores total, ensuring your 20 concurrent queries (from the pool) almost always have a dedicated core available.
Handle Higher Traffic | If you plan to increase MAX_POOL_SIZE to 100+ in production, you should scale to 4x CN pods or upgrade to 32C / 128G pods.
Cache Health | Ensure each CN has at least 300GB–500GB of Local NVMe/SSD. Since you are on v4.0.1 (FE+CN), your performance depends entirely on the "Data Cache" being large enough to avoid fetching from S3.
Summary Recommendation
1. Metrics: Use starrocks_be_block_cache_hit_bytes in your PromQL. If it returns nothing, check the raw /metrics endpoint on the CN for the exact string.
2. CN Sizing: Don't size based on your current 0.09 QPS (which is idle). Size based on your MAX_POOL_SIZE. To handle 20 concurrent connections without queuing, two CN pods with 16 Cores and 64GB RAM is the professional production baseline.
3. FE Sizing: Keep 3 FEs (8C/16G) to ensure the cluster remains operational if one pod fails.
References
• using_starrocks/caching/block_cache.md
• release_notes/release-4.0.md
• administration/management/monitoring/metrics.md
• data_source/data_cache_observe.md
References
• using_starrocks/caching/block_cache.mdRocky
06/12/2026, 3:56 AMRumit Jain
06/12/2026, 4:01 AMRocky
06/12/2026, 4:01 AMfslib_ belong to the File System Library, which is a core part of the "Starlet" component. Starlet is the internal storage engine layer that manages the communication between your CN nodes and the remote object storage (S3/GCS/Azure).
Since you are using the FE+CN architecture, these are actually the most important metrics for monitoring your performance, as they track how often your CNs have to wait for remote storage.
Key fslib_ Metrics to Watch
1. Cache Performance (The metrics you were looking for)
In version 4.0.1, the cache hit ratio is often exposed directly under the fslib namespace:
* fslib_cache_hit_ratio: A real-time value of your data cache efficiency.
* fslib_cache_hits / fslib_cache_misses: Cumulative counts of cache operations.
2. Remote I/O (S3/Object Storage)
If your queries are slow, check these to see if you are bottlenecked by the network/S3:
* fslib_read_io_latency: How long it takes to fetch data from your object store.
* fslib_read_throughput: The speed (bytes/sec) at which data is being pulled from remote storage.
* fslib_s3_single_upload_latency: Used during data loading to track write performance to S3.
3. File System Health
* fslib_open_files: Number of active file handles. If this is extremely high, it might indicate a need to tune ulimit.
* fslib_alive_fs_instances_count: Confirms that the connection to your object store is active.
How to use them for Sizing
When planning your production cluster:
1. Monitor `fslib_cache_hit_ratio`: If this is consistently below 80–90% during your peak hours, your CN pods need more local SSD disk space for the cache.
2. Monitor `fslib_read_io_latency`: If this value spikes, it means your object store (S3/MinIO) is struggling, and even adding more CNs might not help until the storage layer is optimized.
Summary: You are seeing these because in the FE+CN (Shared-Data) world, StarRocks replaces the traditional local disk management with fslib to handle the abstraction of remote storage.
remote-to-local storage.
References
• administration/management/monitoring/metrics-shared-data.md
• administration/management/monitoring/metrics.mdRumit Jain
06/12/2026, 4:05 AMRocky
06/12/2026, 4:06 AMfstype). This allows you to differentiate between hits (data coming from local SSD cache) and misses (data coming from S3/remote storage).
1. Which metrics to choose for Hit Ratio?
To calculate your Cache Hit Ratio, you need to compare the I/O performed on the cachefs (local cache) versus the I/O performed on your storage backend (usually s3, oss, or hdfs).
Use these PromQL formulas:
Hit Ratio (by Request Count)
This tells you what percentage of read requests were satisfied by the local cache.
promql
sum(rate(fslib_read_io_size_count{fstype="cachefs"}[5m])) /
(sum(rate(fslib_read_io_size_count{fstype="cachefs"}[5m])) + sum(rate(fslib_read_io_size_count{fstype="s3"}[5m])))
(Note: Replace {fstype="s3"} with your actual backend type, like oss, ks3, or hdfs, if different.)
Hit Ratio (by Data Volume / Bytes)
This is often more accurate for performance monitoring, as it tracks the actual volume of data cached.
promql
sum(rate(fslib_read_io_size_sum{fstype="cachefs"}[5m])) /
(sum(rate(fslib_read_io_size_sum{fstype="cachefs"}[5m])) + sum(rate(fslib_read_io_size_sum{fstype="s3"}[5m])))
──────────
2. What do the other metrics mean?
The metrics you listed are histograms that tell you about the performance of your SSDs:
* fslib_read_io_latency_...: Tracks how fast your local cache disk is.
* Average Latency (on cache): fslib_read_io_latency_sum{fstype="cachefs"} / fslib_read_io_latency_count{fstype="cachefs"}.
* If this value is high (> 1-2ms), your CN pod's local SSD is likely bottlenecked or slow.
* fslib_read_io_size_bucket: Tells you the "size" of the data blocks being read from the cache. Most of your reads (121k out of 124k) are small (under 8KB), which is typical for index and metadata lookups.
──────────
3. Summary for your Production Sizing
Since you are configuring for production and see these fslib metrics:
1. Cache Size: Monitor the fstype="s3" (or backend) read rate. If it remains high after the "warm-up" phase, you need to increase the local disk size on your CN pods to hold more data.
2. Disk Type: Since StarRocks 4.0.1 relies heavily on cachefs for performance, ensure your CN pods use local NVMe/SSD. Do not use network-attached storage (EBS/PVC) for the cache disk if you want sub-second query performance.
3. Metrics Tip: If you want a simpler view, you can also search for fslib_cache_hits and fslib_cache_misses in your /metrics output, which some sub-versions of v4.0.x expose as simpler cumulative counters.
References
• administration/management/monitoring/metrics-shared-data.md
• using_starrocks/caching/block_cache.md
• administration/management/monitoring/metrics.md
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/metrics-shared-data.md
• data_source/data_cache_observe.mdRumit Jain
06/12/2026, 4:34 AMRocky
06/12/2026, 4:34 AMstarlet_star_cache_disk_size_percent in cn.conf.
2. Throughput Matters: For the Data Cache, Disk Throughput is often the bottleneck. If your queries are slow, check if your EBS volume is hitting its throughput limit (e.g., 125 MiB/s on a base GP3). You may need to provision higher throughput (e.g., 500+ MiB/s).
3. Instance Store (Best Performance): If your AWS EC2 instance type supports it (e.g., i3en, r6id), use the Local NVMe Instance Store for the Data Cache instead of EBS. It provides significantly lower latency and higher throughput at no extra cost.
Summary Table
Node Type | Recommended Size | Recommended EBS Type | Key Focus
FE | 100 GB - 200 GB | gp3 | Metadata Journal Latency
CN | 500 GB - 2 TB+ | gp3 (with high IOPS) | Throughput for "Hot Data"
Monitoring Tip: Use the fslib_read_io_size_sum{fstype="s3"} metric we discussed earlier. If you see high traffic to S3 during repeated queries, it means your CN EBS size is too small and data is being evicted from the cache too quickly.
References
• deployment/plan_cluster.md
• using_starrocks/caching/block_cache.md
• administration/management/BE_configuration.md
• deployment/shared_data/feature-support-shared-data.md
References
• using_starrocks/caching/block_cache.md
• deployment/shared_data/feature-support-shared-data.md
• data_source/data_cache_troubleshooting.mdRumit Jain
06/12/2026, 5:10 AMRocky
06/12/2026, 5:10 AMr7g Series (Memory Optimized)
* Recommended Size: r7g.4xlarge (16 vCPU, 128 GiB RAM) or larger.
* Why: StarRocks is an in-memory-first engine. The 8:1 RAM-to-vCPU ratio of the r7g series is ideal for handling the large memory overhead of complex OLAP queries.
* Alternative: c7g Series (Compute Optimized)
* Recommended Size: c7g.4xlarge (16 vCPU, 32 GiB RAM).
* Why: Best for compute-heavy workloads with very small working sets or simple filters where CPU speed is the only bottleneck.
* For Data Cache (StarCache):
* Use r7gd (the 'd' suffix) if you want to use Local NVMe SSDs for your fslib cache. This is significantly faster and cheaper than using EBS for the cache.
──────────
2. Recommended FE (Frontend) Instances
FEs manage metadata and query planning. They are less resource-intensive but require high stability and low latency for the metadata journal.
* Primary Choice: m7g Series (General Purpose)
* Recommended Size: m7g.2xlarge (8 vCPU, 32 GiB RAM).
* Why: The 4:1 RAM-to-vCPU ratio is the perfect balance for FE nodes. It provides enough headroom for the JVM heap (crucial for query planning and metadata) without over-provisioning expensive compute.
* Minimum Production Size: Do not go below m7g.xlarge (4 vCPU, 16 GiB RAM) for production FEs, as a full metadata image reload can be memory-intensive.
──────────
Production Configuration Tips for Graviton:
1. JDK Version: Ensure you use JDK 17 (Amazon Corretto is recommended), as it includes specific optimizations for ARM/Graviton that improve StarRocks' performance.
2. Binary Compatibility: Since you are on Graviton (ARM64), ensure you are using the ARM64-specific StarRocks binaries. You cannot run the x86/AVX2 binaries on Graviton instances.
3. Graviton4 (r8g): If your region supports it, Graviton4 (r8g) provides an additional 30% performance jump over Graviton3. If you are starting a new cluster today, r8g.4xlarge is the current "top-tier" choice for CNs.
Summary Table
Node Type | Recommended Instance | vCPU : RAM | Best For
CN (Compute) | r7g.4xlarge | 1 : 8 | Standard Production (Memory intensive)
CN (with Cache) | r7gd.4xlarge | 1 : 8 | High-performance fslib cache (Local NVMe)
FE (Metadata) | m7g.2xlarge | 1 : 4 | Metadata & Query Planning
References
• deployment/plan_cluster.md
• administration/management/BE_configuration.md
• quick_start/shared-data.md
References
• faq/Deploy_faq.md
• administration/management/FE_configuration.md
• deployment/plan_cluster.md
• faq/Others.md
• developers/mac-compile-run-test.md
• deployment/deploy_manually.mdRumit Jain
06/12/2026, 6:24 AMRocky
06/12/2026, 6:24 AMm7g (General Purpose, 4:1 RAM-to-vCPU) is the standard "sweet spot," you can consider these alternatives based on your specific metadata workload:
* c7g (Compute Optimized - 2:1 RAM-to-vCPU):
* When to use: Use these if you have a small number of tablets (e.g., <500,000) but a very high query concurrency. The FE spends more time planning queries (CPU intensive) than holding metadata (Memory intensive).
* Risk: If your tablet count grows, the JVM heap will eventually run out of memory, causing the FE to crash or perform poorly during garbage collection.
* r7g (Memory Optimized - 8:1 RAM-to-vCPU):
* When to use: Use these for large-scale clusters with millions of tablets (e.g., >5 million). StarRocks FEs keep the entire metadata image in memory. If your fe.conf requires -Xmx64g or higher, the r series is safer and prevents you from over-paying for CPU cores you don't need just to get more RAM.
* t4g (Burstable - for Non-Prod only):
* Good for Dev/QA environments to save costs, but never use burstable instances for Production FE nodes. The credit exhaustion can cause the FE to lose its connection to the cluster "Raft" consensus, leading to cluster instability.
──────────
2. Why "m" type is generally not recommended for CN pods
In StarRocks, the CN (Compute Node) is the engine that does the "heavy lifting." While you can run CNs on m types, they are often avoided in production for three main reasons:
A. The "Memory First" Nature of OLAP
StarRocks is a massively parallel processing (MPP) engine. For complex queries (JOINs, large aggregations), it builds large hash tables in memory.
* The Problem: m types provide 4 GiB per vCPU. In high-concurrency scenarios, 4 GiB is often not enough to hold the intermediate query states, leading to "Memory Limit Exceeded" errors.
* The Solution: r types provide 8 GiB per vCPU, which gives the query engine significantly more "breathing room" to complete complex joins without failing.
B. Cost Efficiency (Price/Performance)
For a CN workload, you are usually limited by either CPU (for simple filters/scans) or Memory (for complex joins).
* An m type is a compromise. You end up paying for a balance of both, but you might only be maxing out one.
* If your workload is simple, c types are cheaper per vCPU.
* If your workload is complex, r types are cheaper per GiB of RAM.
C. Storage Throughput (The Data Cache Factor)
As we discussed with your fslib metrics, CN performance in v4.0.1 relies heavily on the Data Cache.
* m types have standard EBS throughput.
* rd or cd types (like r7gd) come with local NVMe SSDs. Because the "m" series is general-purpose, AWS often reserves the best local disk performance for the specialized r or c "disk" variants. Using a r7gd instance allows you to put your cachefs on local NVMe, which is 10x-50x faster than EBS.
Summary Recommendation
* FE: Use m7g.2xlarge (Balanced) or r7g.2xlarge (if you have many tables/tablets).
* CN: Use r7g (Memory optimized) for most production workloads, or r7gd if you want the best possible query performance via local disk caching.
References
• deployment/plan_cluster.md
• faq/Others.md
• administration/management/FE_configuration.md
• using_starrocks/caching/block_cache.md
References
• deployment/deploy_manually.mdRumit Jain
06/12/2026, 6:31 AMresources:
requests:
cpu: 8
memory: 16Gi
limits:
cpu: 8
memory: 16GiRocky
06/12/2026, 6:32 AMyaml
# Recommended for FE
resources:
requests:
cpu: 8
memory: 16Gi
limits:
cpu: 8
memory: 16Gi
──────────
2. For CN (Compute Node) Pods
For a production environment, your snippet (8/16Gi) is considered too small for a CN. StarRocks is a memory-intensive MPP engine; complex joins and aggregations will likely fail with "Memory Limit Exceeded" at 16 GiB.
* Minimum Production Recommendation: 16 vCPU / 64 GiB RAM.
* Graviton Optimization (r7g): Since we previously discussed the r7g series, the ideal ratio is 1:8 (1 vCPU to 8 GiB RAM).
yaml
# Recommended for CN
resources:
requests:
cpu: 16
memory: 64Gi # Or 128Gi if using r7g.4xlarge
limits:
cpu: 16
memory: 64Gi
──────────
Key Rules for StarRocks Kubernetes Resources:
A. Always use "Guaranteed" QoS (Requests = Limits)
In StarRocks, Requests and Limits must be identical.
* If limits are higher than requests, Kubernetes might throttle the CPU during a heavy query, causing unpredictable latencies.
* If the node runs out of memory, StarRocks pods are often the first to be "OOM Killed" because they are memory-intensive. Setting Requests = Limits protects the pod from being evicted under pressure.
B. The "90% Rule" for CN Memory
StarRocks CNs will try to use 90% of the available memory by default for its internal buffer pool.
* If you set the K8s limit to 64Gi, the CN will try to use ~57.6Gi.
* The remaining ~6.4Gi is for the OS, StarRocks process overhead, and other small services.
* Warning: If you set the K8s limit too tight (e.g., 16Gi), the overhead of the Java-based parts of the CN or the OS might push the pod over the 16Gi limit, causing the K8s OOM killer to restart the pod before StarRocks can even hit its internal 90% limit.
C. CPU Throttling
StarRocks is designed to use all available cores for a single query to minimize latency. If you don't set a CPU limit or set it too low, you may see high "CPU Throttling" metrics in your monitoring, which directly impacts query performance.
References
• deployment/sr_operator.md
• deployment/plan_cluster.md
• faq/resource_isolation_faq.md
• administration/management/BE_configuration.md
References
• deployment/plan_cluster.md
• deployment/sr_operator.md
• quick_start/helm.md
• faq/resource_isolation_faq.md
• administration/management/FE_configuration.md
• best_practices/audit_log_resource_group.md
• deployment/deploy_manually.md
References
• deployment/sr_operator.md
• quick_start/helm.md
• deployment/plan_cluster.mdRocky
06/12/2026, 6:32 AMRumit Jain
06/12/2026, 6:48 AMRocky
06/12/2026, 6:48 AM-Xmx6g is too conservative. You should increase it to better utilize your pod's resources while leaving enough "headroom" for the OS and JVM off-heap memory.
Recommended Xmx for 16Gi FE Pods:
You should set your -Xmx (and -Xms) to between 11Gi and 12Gi.
* Rule of Thumb: For nodes with less than 32Gi of total memory, the Max Heap Size (-Xmx) should be approximately 70-75% of the total available RAM.
* Calculations for 16Gi:
* 70% of 16Gi = 11.2Gi
* 75% of 16Gi = 12Gi
Updated JAVA_OPTS Recommendation:
bash
# Recommended for a 16Gi RAM Pod
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx11g -Xms11g -XX:+UseG1GC -Xlog:gc*:${LOG_DIR}/fe.gc.log.$DATE:time"
Why you shouldn't stay at 6Gi:
1. Metadata Overhead: StarRocks FEs store all metadata (tablet locations, schema, etc.) in the JVM heap. If your cluster grows (more tables/partitions), 6Gi will quickly become a bottleneck, leading to frequent Full GCs or "Metadata Load" failures.
2. Query Planning: Complex SQL queries with many joins require significant memory during the "planning" phase on the FE. A larger heap ensures the FE can plan these queries without hitting GC pauses.
Why you shouldn't go to 16Gi:
* JVM Overhead: The Java process needs additional memory outside the heap (Off-heap) for thread stacks, code cache, and internal buffers.
* Pod Eviction: If the total process memory (Heap + Off-heap) exceeds the Kubernetes 16Gi Limit, the Kubelet will kill the pod immediately (OOMKilled). Keeping the heap at ~11-12Gi provides a safe 4Gi buffer for this overhead.
Pro-Tips:
* Set -Xms equal to `-Xmx`: This prevents the JVM from constantly resizing the heap, which improves stability and performance.
* Monitor Metadata: If your tablet count exceeds 1 million, you should consider increasing the Pod RAM to 32Gi and the -Xmx to 24Gi.
References
• knowledge/trouble_shooting/fe_memory_problems.md
• faq/Others.md
• deployment/plan_cluster.md
• administration/Meta_recovery.md
References
• faq/Others.md
• knowledge/trouble_shooting/fe_memory_problems.md
• administration/management/FE_configuration.md
• faq/fe_mem_faq.md
• deployment/plan_cluster.md
• faq/operation_maintenance_faq.md
• administration/Meta_recovery.md
• sql-reference/sql-functions/JAVA_UDF.md
-D-F)
References
• faq/Others.md
• knowledge/trouble_shooting/fe_memory_problems.md
• administration/management/FE_configuration.md
• faq/fe_mem_faq.md
• deployment/plan_cluster.md
• faq/operation_maintenance_faq.md
• sql-reference/sql-functions/JAVA_UDF.md
• administration/Meta_recovery.mdRumit Jain
06/12/2026, 6:57 AMRocky
06/12/2026, 6:58 AM10Gi settings are likely too small for a production environment.
Here is the recommended storage specification based on your configuration:
1. For FE (Frontend) Pods
Even in shared_data mode, FEs maintain a local copy of metadata (BDBJE image and edit logs) to coordinate the cluster.
* storageSize (Recommended: 50Gi - 100Gi):
* Why: 10Gi is risky. As your cluster grows (more tables, partitions, and tablets), the metadata image and edit logs will grow. If the FE runs out of disk space, the BDBJE metadata store can become corrupted, requiring a complex recovery. StarRocks officially recommends 100GB for FE metadata in production.
* logStorageSize (Recommended: 50Gi - 100Gi):
* Why: You have enabled audit_log_modules = slow_query, query, connection in JSON format.
* Audit logs (especially connection and query) grow very fast in high-concurrency environments. JSON format further increases the size per entry. A 10Gi log volume will fill up quickly, causing the pod to crash or stop logging.
yaml
# FE StorageSpec Suggestion
storageSpec:
storageSize: 100Gi # For /opt/starrocks/fe/meta
logStorageSize: 50Gi # For /opt/starrocks/fe/log
──────────
2. For CN (Compute Node) Pods
In shared_data mode, the CN uses local storage for the Data Cache.
* storageSize (Recommended: 200Gi - 1Ti+):
* Why: In Cloud Native mode, your data lives on S3. To avoid the latency of fetching data from S3 for every query, StarRocks caches "hot" data on the CN's local disk.
* A 10Gi cache is extremely small; your "cache hit rate" will be very low, leading to slow query performance as the CN constantly fetches data from S3.
* Best Practice: The cache size should ideally be large enough to hold your most frequently queried data. For production, we typically see 200Gi to 2Ti depending on your dataset size.
* logStorageSize (Recommended: 20Gi):
* Why: CNs don't store audit logs (those are FE-only). They only store system logs (INFO/WARN/ERROR). 20Gi is usually sufficient here.
yaml
# CN StorageSpec Suggestion
storageSpec:
storageSize: 500Gi # For Data Cache (/opt/starrocks/be/storage)
logStorageSize: 20Gi # For /opt/starrocks/be/log
Summary of Risks with `10Gi/10Gi`:
1. Metadata Corruption (FE): If storageSize hits 100%, the FE process will crash and the Raft group may fail to recover.
2. Slow Queries (CN): A 10Gi cache means you are essentially running "cache-less," forcing every query to wait for S3 network I/O.
3. Log Disk Pressure: With full audit logging enabled, you will likely hit the 10Gi limit within days (or hours during high load), which can trigger Kubernetes pod evictions.
References
• deployment/plan_cluster.md
• administration/management/logs.md
• using_starrocks/caching/block_cache.md
• deployment/shared_data/s3.md
References
• deployment/plan_cluster.md
• administration/management/logs.md
• administration/management/FE_configuration.md
• using_starrocks/caching/block_cache.md
• deployment/shared_data/s3.md
• deployment/shared_data/minio.md
• quick_start/shared-data.mdRocky
06/12/2026, 6:58 AMRumit Jain
06/12/2026, 7:04 AMRocky
06/12/2026, 7:04 AMfe.conf, StarRocks officially recommends that -Xms (Initial Heap Size) and -Xmx (Maximum Heap Size) be consistent (equal).
Why you should set them equal:
1. Avoid Performance Hiccups (Resizing Pauses):
If -Xms is smaller than -Xmx, the JVM starts with a small amount of memory. As the FE metadata grows or a heavy query comes in, the JVM must pause to ask the Operating System for more memory. These "heap resizing" events add latency to your queries and can even trigger unnecessary Garbage Collection (GC) cycles.
2. Predictability in Kubernetes:
In a containerized environment, if you set -Xmx11g but -Xms1g, Kubernetes might think your pod is only using 1Gi and schedule other pods on the same physical node. Later, when StarRocks tries to expand to 11Gi, the node might be full, causing the OS to kill your FE process (OOMKilled) or causing the node to swap, which destroys performance.
3. G1GC Optimization:
StarRocks uses the G1 Garbage Collector (-XX:+UseG1GC). G1 works most efficiently when it has a stable, fixed amount of memory to manage. Constantly changing the heap size makes it harder for the collector to meet its "pause time" goals.
4. Guaranteed Metadata Safety:
The FE is the "brain" of StarRocks. All table schemas and tablet locations are kept in this memory. By setting -Xms equal to -Xmx, you ensure that the memory the FE needs to hold your metadata is reserved immediately when the process starts.
Recommended Change:
Update your JAVA_OPTS to include -Xms11g to match your `-Xmx11g`:
bash
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xms11g -Xmx11g -XX:+UseG1GC -Xlog:gc*:${LOG_DIR}/fe.gc.log.$DATE:time"
Summary
* Mandatory for JVM? No.
* Mandatory for Production? Yes. Setting them different is a common cause of "FE is slow" or "FE keeps restarting" issues in community support.
References
• faq/Others.md
• knowledge/trouble_shooting/fe_memory_problems.md
• faq/fe_mem_faq.md
• administration/management/FE_configuration.md
• deployment/plan_cluster.md
References
• faq/Others.md
• knowledge/trouble_shooting/fe_memory_problems.md
• deployment/plan_cluster.md
• administration/Meta_recovery.md
• administration/management/FE_configuration.md
• faq/fe_mem_faq.md
• administration/management/monitoring/Monitor_and_Alert.mdRumit Jain
06/12/2026, 7:34 AM2026-06-12 07:32:37.583Z WARN (starrocks-mysql-nio-pool-0|147) [StmtExecutor.execute():901] execute Exception, sql: {}, SELECT * FROM information_schema.loads WHERE LABEL IN ('opus_metrics__ordopusmetricsreportexecutionfrequency__messagebasedbundle__7f46cd8459__jphw9__1__1781249420744', 'opus_metrics__ordopusmetricsreportexecutionfrequency__messagebasedbundle__7f46cd8459__jphw9__1__1781249480792', 'opus_metrics__ordopusmetricsreportexecutionfrequency__messagebasedbundle__7f46cd8459__jphw9__1__1781249520744', 'opus_metrics__ordopusmetricsreportexecutionfrequency__messagebasedbundle__7f46cd8459__jphw9__1__1781249540744', 'sampledatameshdb__testdatameshlakehouseobject__messagebasedbundle__7f46cd8459__jphw9__1__1781249340743')
com.starrocks.common.ErrorReportException: Warehouse default_warehouse is not available.Rocky
06/12/2026, 7:34 AMcom.starrocks.common.ErrorReportException: Warehouse default_warehouse is not available occurs when the StarRocks FE attempts to execute a query (even a system metadata query like SELECT * FROM information_schema.loads) but cannot find a healthy, active compute cluster (Warehouse) to handle the task.
In Shared-Data (Cloud Native) mode, compute resources are managed via Warehouses. If the default_warehouse is "not available," it usually stems from one of the following three reasons:
1. No Active CN Nodes
The default_warehouse is not a physical entity; it is a logical grouping of Compute Nodes (CNs). If your CN pods are crashing, failing to start, or haven't joined the cluster, the warehouse is considered "unavailable."
* Check: Run SHOW COMPUTE NODES; in your MySQL client.
* Fix: Ensure your CN pods are Running in Kubernetes. Check the CN logs (<http://cn.INFO|cn.INFO> or <http://be.INFO|be.INFO>) for errors related to S3 connectivity or heartbeats to the FE.
2. Warehouse is Suspended
StarRocks shared-data mode supports suspending warehouses to save costs. If the default_warehouse has been suspended (either manually or via an idle timeout), it cannot process queries until it is resumed.
* Check: Run SHOW WAREHOUSES; and look at the State column.
* Fix: If the state is SUSPENDED, run:
sql
ALTER WAREHOUSE default_warehouse RESUME;
3. Resource & Storage Issues (Previous Context)
In your previous questions, you mentioned using 10Gi for storage. If your CN nodes ran out of disk space for their Data Cache or metadata, they may have gone offline or entered a "Disabled" state.
* Fix: As recommended previously, ensure your CN nodes have sufficient disk space (at least 100Gi+) and that they can reach your S3 endpoint (<https://s3.us-east-1.amazonaws.com>). If the CN cannot connect to S3, it cannot initialize the default_warehouse.
Summary Troubleshooting Steps:
1. Check Warehouse Status:
sql
SHOW WAREHOUSES;
2. Check Compute Node Health:
sql
SHOW COMPUTE NODES;
If Alive is false, the warehouse will be unavailable.
3. Check FE Logs for Heartbeat Errors:
Look for messages like failed to get heartbeat from... or is added to blacklist. This indicates network or stability issues between the FE and CN pods.
References
• faq/shared_data_faq.md
• sql-reference/sql-statements/cluster-management/warehouse/SHOW_WAREHOUSES.md
• deployment/shared_data/s3.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• faq/shared_data_faq.md
• sql-reference/sql-functions/utility-functions/current_warehouse.md
• quick_start/shared-data.md
• sql-reference/information_schema/warehouse_queries.md
• sql-reference/information_schema/warehouse_metrics.md
• administration/management/monitoring/alert.md
• loading/RoutineLoad.md
• faq/loading/Routine_load_faq.md
• sql-reference/sql-statements/loading_unloading/pipe/SUSPEND_or_RESUME_PIPE.mdRocky
06/12/2026, 7:34 AMRumit Jain
06/12/2026, 7:37 AMW20260612 07:33:22.599844 139697824790080 stack_util.cpp:437] 2026-06-12 07:33:22.599822, query_id=019ebabf-f224-7bd6-b1c2-da3a8bed31c1, fragment_instance_id=019ebabf-f224-7bd6-b1c2-da3a8bed31c2 throws exception: std::length_error, trace:
@ 0xdcd72cf __wrap___cxa_throw
@ 0x14d14a2d std::__throw_length_error(char const*)
@ 0x88cbf4f std::vector<unsigned char, starrocks::raw::RawAllocator<unsigned char, 16ul, starrocks::ColumnAllocator<unsigned char> > >::resize(unsigned long)
@ 0xc00f710 starrocks::ArrowConverter<(arrow::Type::type)13, (starrocks::LogicalType)17, true, false, int, int>::apply(arrow::Array const*, unsigned long, unsigned long, starrocks::Column*, unsigned long, unsigned char*, std::vector<unsigned char, starrocks::ColumnAll
@ 0xbfa1e34 starrocks::ParquetScanner::convert_array_to_column(starrocks::ConvertFuncTree*, unsigned long, arrow::Array const*, starrocks::Cow<starrocks::Column>::ImmutPtr<starrocks::Column>&, unsigned long, unsigned long, std::vector<unsigned char, starrocks::ColumnA
@ 0xbfdb442 starrocks::ArrowConverter<(arrow::Type::type)26, (starrocks::LogicalType)18, true, false, int, int>::apply(arrow::Array const*, unsigned long, unsigned long, starrocks::Column*, unsigned long, unsigned char*, std::vector<unsigned char, starrocks::ColumnAll
@ 0xbfa1e34 starrocks::ParquetScanner::convert_array_to_column(starrocks::ConvertFuncTree*, unsigned long, arrow::Array const*, starrocks::Cow<starrocks::Column>::ImmutPtr<starrocks::Column>&, unsigned long, unsigned long, std::vector<unsigned char, starrocks::ColumnA
@ 0xbfa2042 starrocks::ParquetScanner::append_batch_to_src_chunk(std::shared_ptr<starrocks::Chunk>*)
@ 0xbfa57b2 starrocks::ParquetScanner::get_next()
@ 0xbf6d0b9 starrocks::connector::FileDataSource::get_next(starrocks::RuntimeState*, std::shared_ptr<starrocks::Chunk>*)
@ 0xbcdd036 starrocks::pipeline::ConnectorChunkSource::_read_chunk(starrocks::RuntimeState*, std::shared_ptr<starrocks::Chunk>*)
@ 0xbce398f starrocks::pipeline::ChunkSource::buffer_next_batch_chunks_blocking(starrocks::RuntimeState*, unsigned long, starrocks::workgroup::WorkGroup const*)
@ 0xaa327ba auto starrocks::pipeline::ScanOperator::_trigger_next_scan(starrocks::RuntimeState*, int)::{lambda(auto:1&)#1}::operator()<starrocks::workgroup::YieldContext>(starrocks::workgroup::YieldContext&) const [clone .constprop.0]
@ 0xbc3548e starrocks::workgroup::ScanExecutor::worker_thread()
@ 0xdd2ad58 starrocks::ThreadPool::dispatch_thread()
@ 0xdd218f5 starrocks::Thread::supervise_thread(void*)
@ 0x7f0e93066ac3 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x94ac2)
@ 0x7f0e930f7a74 clone
terminate called after throwing an instance of 'std::length_error'
what(): vector::_M_default_append
4.0.1 RELEASE (build cd9df36 distro ubuntu arch x86_64)
query_id:019ebabf-f224-7bd6-b1c2-da3a8bed31c1, fragment_instance:019ebabf-f224-7bd6-b1c2-da3a8bed31c2
Load file path: <s3://devkubvir-plattest03-dnp-ephemeral/ephemeral/default/lakehouse-manager/ownerid=00000000-0000-0000-0000-000000000000/inprogress/sampledatameshdb__testdatameshlakehouseobject__messagebasedbundle__7f46cd8459__jphw9__1__1781249340743.parquet>
*** Aborted at 1781249602 (unix time) try "date -d @1781249602" if you are using GNU date ***
PC: @ 0x7f0e930689fc pthread_kill
*** SIGABRT (@0x3e80000001b) received by PID 27 (TID 0x7f0def38f640) LWP(600) from PID 27; stack trace: ***
@ 0x7f0e9306bee8 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x99ee7)
@ 0x11885a08 google::(anonymous namespace)::FailureSignalHandler(int, siginfo_t*, void*)
@ 0x7f0e93014520 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x4251f)
@ 0x7f0e930689fc pthread_kill
@ 0x7f0e93014476 raise
@ 0x7f0e92ffa7f3 abort
@ 0x14cbd845 __gnu_cxx::__verbose_terminate_handler() [clone .cold]
@ 0x14cbbdbc __cxxabiv1::__terminate(void (*)())
@ 0x14cbbe27 std::terminate()
I20260612 07:33:22.687552 139696938927680 storage_engine.cpp:725] 0 tablets checked. time elapse:31 seconds. compaction checker will be scheduled again in 1800 seconds
@ 0x14cbbf88 __cxa_throw
@ 0xdcd7197 __wrap___cxa_throw
@ 0x14d14a2d std::__throw_length_error(char const*)
@ 0x88cbf4f std::vector<unsigned char, starrocks::raw::RawAllocator<unsigned char, 16ul, starrocks::ColumnAllocator<unsigned char> > >::resize(unsigned long)
@ 0xc00f710 starrocks::ArrowConverter<(arrow::Type::type)13, (starrocks::LogicalType)17, true, false, int, int>::apply(arrow::Array const*, unsigned long, unsigned long, starrocks::Column*, unsigned long, unsigned char*, std::vector<unsigned char, starrocks::ColumnAll
@ 0xbfa1e34 starrocks::ParquetScanner::convert_array_to_column(starrocks::ConvertFuncTree*, unsigned long, arrow::Array const*, starrocks::Cow<starrocks::Column>::ImmutPtr<starrocks::Column>&, unsigned long, unsigned long, std::vector<unsigned char, starrocks::ColumnA
@ 0xbfdb442 starrocks::ArrowConverter<(arrow::Type::type)26, (starrocks::LogicalType)18, true, false, int, int>::apply(arrow::Array const*, unsigned long, unsigned long, starrocks::Column*, unsigned long, unsigned char*, std::vector<unsigned char, starrocks::ColumnAll
@ 0xbfa1e34 starrocks::ParquetScanner::convert_array_to_column(starrocks::ConvertFuncTree*, unsigned long, arrow::Array const*, starrocks::Cow<starrocks::Column>::ImmutPtr<starrocks::Column>&, unsigned long, unsigned long, std::vector<unsigned char, starrocks::ColumnA
@ 0xbfa2042 starrocks::ParquetScanner::append_batch_to_src_chunk(std::shared_ptr<starrocks::Chunk>*)
@ 0xbfa57b2 starrocks::ParquetScanner::get_next()
@ 0xbf6d0b9 starrocks::connector::FileDataSource::get_next(starrocks::RuntimeState*, std::shared_ptr<starrocks::Chunk>*)
@ 0xbcdd036 starrocks::pipeline::ConnectorChunkSource::_read_chunk(starrocks::RuntimeState*, std::shared_ptr<starrocks::Chunk>*)
@ 0xbce398f starrocks::pipeline::ChunkSource::buffer_next_batch_chunks_blocking(starrocks::RuntimeState*, unsigned long, starrocks::workgroup::WorkGroup const*)
@ 0xaa327ba auto starrocks::pipeline::ScanOperator::_trigger_next_scan(starrocks::RuntimeState*, int)::{lambda(auto:1&)#1}::operator()<starrocks::workgroup::YieldContext>(starrocks::workgroup::YieldContext&) const [clone .constprop.0]
@ 0xbc3548e starrocks::workgroup::ScanExecutor::worker_thread()
@ 0xdd2ad58 starrocks::ThreadPool::dispatch_thread()
@ 0xdd218f5 starrocks::Thread::supervise_thread(void*)
@ 0x7f0e93066ac3 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x94ac2)
@ 0x7f0e930f7a74 clone
[1781249602.953][thread: 139697824790080] je_mallctl execute purge success
[1781249602.953][thread: 139697824790080] je_mallctl execute dontdump success
/opt/starrocks/cn_entrypoint.sh: line 165: 27 Aborted (core dumped) $STARROCKS_HOME/bin/start_cn.sh $addition_argsRocky
06/12/2026, 7:38 AMRocky
06/12/2026, 7:39 AMstd::length_error at vector::_M_default_append) is a critical error occurring within the Parquet Scanner while it attempts to convert data from an Arrow format into StarRocks' internal column format.
Root Cause Analysis
Based on the stack trace:
1. Location: The error happens in starrocks::ArrowConverter::apply.
2. Data Types: The codes in your log ((arrow::Type::type)26 and (arrow::Type::type)13) indicate the scanner is processing a Map containing Binary/String data.
3. The Error: std::length_error is thrown when the system tries to resize a memory buffer (vector) to a size that is physically impossible (usually because it read a corrupted or "garbage" length value from the file metadata, or there is an integer overflow).
This often indicates a bug in how StarRocks 4.0.1 handles complex nested types (like Maps of Binaries) in Parquet files, or it points to a corrupted Parquet file in your S3 bucket.
Recommended Troubleshooting & Workarounds
1. Disable Parquet Page Index (Most Likely Fix)
There is a known stability issue in early 4.0.x versions related to the Parquet Page Index optimizer. Disabling it can often bypass "garbage" metadata reads that cause these crashes.
Run this command globally:
sql
SET GLOBAL enable_parquet_reader_page_index = false;
2. Check the Specific File
The log identifies the exact file causing the crash:
<s3://devkubvir-plattest03-dnp-ephemeral/ephemeral/default/lakehouse-manager/.../sampledatameshdb*testdatameshlakehouseobject*messagebasedbundle*7f46cd8459*jphw9*1*1781249340743.parquet>
* Is the file corrupted? Try reading this specific file using a local tool like parquet-tools or a Python script with pandas/pyarrow.
* Massive Fields: Check if any record in that file has an extremely large string or binary blob (e.g., several hundred MBs in a single field), which might be exceeding internal limits.
3. Disable Late Materialization
If the crash persists, try disabling late materialization, which changes the order in which columns are read:
sql
SET GLOBAL enable_late_materialization = false;
4. Upgrade to a Newer Patch
Version 4.0.1 is an early release in the 4.0 series. Many "scanner crash" bugs have been fixed in subsequent patches (e.g., 4.0.3+ or 4.0.5). If possible, upgrade your image to the latest stable 4.0.x release.
Summary
The std::length_error means the CN tried to allocate an "infinite" amount of memory because it misread the size of a binary field in a Map. Try disabling the Parquet Page Index first, as this is the most common workaround for metadata-driven crashes in the 4.0.x scanner.x series.
References
• unloading/arrow_flight.md
• sql-reference/data-types/semi_structured/VARIANT.mdRumit Jain
06/12/2026, 8:04 AMRocky
06/12/2026, 8:04 AMenable_parquet_reader_page_index.
Run the following command using a MySQL client connected to your StarRocks FE:
1. Set Globally (Recommended)
This affects all new connections and background tasks (like Routine Load or Pipes) started after the change:
sql
SET GLOBAL enable_parquet_reader_page_index = false;
2. Set for Current Session
If you want to test the fix immediately in your current terminal session:
sql
SET enable_parquet_reader_page_index = false;
Why use this specific name?
While you mentioned parquet_enable_page_index, the official StarRocks system variable introduced to control this behavior is enable_parquet_reader_page_index.
Important Note for Background Loads:
If the crash is happening in a Routine Load or a Pipe, setting the variable GLOBAL is usually enough for the next task execution. however, if the load is already "stuck" or crashing repeatedly, you might need to:
1. Set the global variable.
2. Pause and Resume the load to ensure it picks up the new global configuration:
sql
PAUSE ROUTINE LOAD FOR <job_name>;
RESUME ROUTINE LOAD FOR <job_name>;
Verification
You can verify the setting is applied by running:
sql
SHOW VARIABLES LIKE '%parquet_reader_page_index%';
References
• sql-reference/System_variable.md
• administration/management/BE_configuration.md
References
• sql-reference/System_variable.md
• administration/management/BE_configuration.md
• unloading/Spark_connector.mdRumit Jain
06/12/2026, 8:13 AMstd::length_error (vector::_M_default_append) inside ParquetScanner::convert_array_to_column while loading a Parquet file. The file is readable via PyArrow and contains a nested STRUCT column with DATE/DATETIME values stored as strings. The target StarRocks table also defines the column as a nested STRUCT. Are there any known issues in 4.0.1 involving Parquet nested STRUCT conversion or STRING→DATE/DATETIME conversion inside STRUCT fields that were fixed in later 4.0.x releases?Rocky
06/12/2026, 8:13 AMstd::length_error triggered during starrocks::ArrowConverter::apply.
* The Conversion: The stack trace highlights two specific converters:
* `ArrowConverter<13, 17>`: Converting Arrow Binary/String (13) to StarRocks DATE (17).
* `ArrowConverter<26, 18>`: Converting Arrow MAP/STRUCT (26) to StarRocks DATETIME (18).
* The Cause: In version 4.0.1, when a Parquet file contains nested STRUCT fields that require a type cast (e.g., a String field in Parquet being mapped to a Date/Datetime column in StarRocks), the ArrowConverter can occasionally pass an incorrect row count or offset to its child converters. This causes the child converter to attempt to resize() an internal data vector to an invalid size (often an extremely large value or negative-cast-to-unsigned), leading to the std::length_error and the subsequent CN crash.
Known Fixes in Later 4.0.x Versions
Version 4.0.1 was an early release in the 4.0 series. Several critical fixes were introduced in later patches (4.0.2 through 4.0.10) specifically addressing Parquet nested type conversion:
* PR #71855: Fixed a Parquet scanner failure involving dictionary-typed columns nested inside structs and maps.
* Nested Row Count Sync: Multiple patches fixed edge cases where the parent STRUCT and child fields would lose row-count synchronization during the conversion loop in ArrowConverter.
* NULL handling in Nested Casts: Improved stability when a nested field being cast (String -> Date) contains NULL values, which could previously lead to memory allocation errors.
Recommended Actions
1. Upgrade to a Stable Patch (Strongly Recommended)
Upgrade your CN and FE to at least StarRocks 4.0.6 (or the latest 4.0.10). The early 4.0.x releases had several "first-version" bugs in the rewritten scanner pipeline for shared-data mode that have since been resolved.
2. Short-term Workarounds
If you cannot upgrade immediately, try these session-level or global settings to bypass the specific code path causing the crash:
* Disable Parquet Page Index: Sometimes incorrect metadata offsets feed the converter bad lengths.
sql
SET GLOBAL enable_parquet_reader_page_index = false;
* Disable Late Materialization: This forces the scanner to read columns together, which can sometimes bypass synchronization bugs in the nested converter.
sql
SET GLOBAL enable_late_materialization = false;
* Manual Casting (If using FILES()): If you are loading data using INSERT INTO ... SELECT * FROM FILES(...), try defining the nested field as VARCHAR in a staging table or using an explicit CAST in the SELECT list to see if the explicit cast logic (which uses a different code path than the implicit scanner converter) avoids the crash.
3. Validate Data
While the file is readable in PyArrow, check if any records have extremely long strings or "broken" date strings (e.g., 0000-00-00 or non-standard formats) within the STRUCT. While the scanner should handle these by returning NULL, in 4.0.1, malformed nested data is a common trigger for these allocation errors.
References
• sql-reference/data-types/semi_structured/VARIANT.md
• sql-reference/data-types/semi_structured/STRUCT.md
• faq/Others.md
• release_notes/release-2.3.mdRumit Jain
06/12/2026, 10:20 AMRocky
06/12/2026, 10:20 AMlabel_keep_max_second defines the time-to-live for labels of completed load jobs (both FINISHED and CANCELLED).
* Default: 259200 seconds (3 days).
* Behavior: After this duration, labels are automatically deleted from the system metadata.
2. Label MAX Entry (How many are kept)
The parameter label_keep_max_num sets the limit on the total number of load job records retained.
* Default: 1000 entries.
* Behavior: If the number of finished/cancelled load jobs exceeds this value, the oldest historical job information will be deleted, even if it hasn't reached the TTL.
3. Cleanup Interval
The parameter label_clean_interval_second determines how often the background cleanup thread runs.
* Default: 14400 seconds (4 hours).
How to Check or Modify
You can check your current settings by running:
sql
SHOW FRONTEND CONFIG LIKE '%label%';
To modify these (they are mutable), use the ADMIN SET FRONTEND CONFIG command. For example, to increase the retention to 7 days:
sql
ADMIN SET FRONTEND CONFIG ("label_keep_max_second" = "604800");
ADMIN SET FRONTEND CONFIG ("label_keep_max_num" = "5000");
Note: Increasing these values significantly can increase the memory consumption of the FE, as labels are stored in the FE's catalog metadata.
References
• administration/management/FE_configuration.md
• administration/management/BE_configuration.mdRumit Jain
06/12/2026, 11:07 AMRocky
06/12/2026, 11:07 AMstarrocks_fe_query_latency_ms is a standard StarRocks monitoring metric used to track query performance from the perspective of the Frontend (FE).
What it means
* Definition: It represents the end-to-end response time (latency) for SQL queries, measured in milliseconds (ms).
* What it includes: This duration covers the entire query lifecycle: parsing the SQL, generating the execution plan, scheduling the fragments to Backends (BEs), waiting for BEs to execute the query, and returning the final result to the client.
* Labels:
* `quantile`: This is a histogram/summary metric. Common values are 0.75, 0.95, 0.98, and 0.99, representing percentiles (e.g., P95 latency).
* `namespace="ABC"`: This is an external infrastructure label (typically added by Kubernetes or Prometheus Operator). It identifies which cluster or environment (e.g., Prod vs. Dev) the data is coming from.
──────────
Suggested Alerts and Thresholds
For an OLAP system like StarRocks, alerting on P95 (95th percentile) is the industry standard to identify performance degradation without being "noisy" due to a single outlier.
1. Critical Alert: P95 Latency Spike
* Threshold: > 5000ms (5 seconds)
* PromQL:
promql
starrocks_fe_query_latency_ms{namespace="ABC", quantile="0.95"} > 5000
* Why: If 5% of your queries take longer than 5 seconds, it usually indicates either a sudden influx of "big queries" or resource saturation on the BE nodes (CPU/Memory).
2. Warning Alert: P75 Latency Trend
* Threshold: > 1000ms (1 second) for more than 5 minutes.
* PromQL:
promql
avg_over_time(starrocks_fe_query_latency_ms{namespace="ABC", quantile="0.75"}[5m]) > 1000
* Why: This helps detect "performance creep"—where queries are gradually getting slower due to data growth or increasing concurrency.
3. Tail Latency Alert (P99)
* Threshold: > 20000ms (20 seconds)
* Why: To catch "killer queries" that might be stuck or scanning massive amounts of data without proper filtering, which could eventually lead to cluster instability.
Troubleshooting when an alert fires:
1. Check for Big Queries: Use SHOW PROC '/current_queries'; to see what is running right now.
2. Audit Logs: Check the fe.audit.log for queries with high QueryTime and large ScanRows.
3. Resource Contention: Check BE CPU usage and starrocks_be_disks_io_util.
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert_with_Prometheus_and_Grafana.md
References
• administration/management/monitoring/metrics.mdRumit Jain
06/12/2026, 11:18 AMkube-starrocks-fe-0.kube-starrocks-fe-search.ABC.svc.cluster.local_9010_1773372562608
Id: 16777337
User: sr_dml_user
Host: 10.000.00.231:38628
Db:
Command: Sleep
ConnectionStartTime: 2026-06-12 07:45:28
Time: 9695
State: ERR
Info: SELECT * FROM information_schema.loads WHERE LABEL IN ('opus_metrics__b2bopusmetricstransactionlifecycle__messagebasedbundle__5699cdcddf__hstsm__1__1781252913907', 'opus_metrics__ordopusmetricsreportexecutionfrequency__messagebasedbundle__5699cdcddf__hhksc__1__1781253287267', 'sampledatameshdb__testdatameshlakehouseobject__messagebasedbundle__5699cdcddf__hhksc__1__1781252727267', 'sampledatameshdb__testdatameshlakehouseobject__messagebasedbundle__5699cdcddf__hhksc__1__1781252747266')
IsPending: false
Warehouse: default_warehouse
CNGroup:
Catalog: NULL
QueryId: NULLRocky
06/12/2026, 11:18 AMState: ERR in the processlist (or audit log) indicates that the last SQL command executed on that specific connection failed.
Here is the breakdown of the specific row you provided:
* State: ERR: The query shown in the Info field encountered an error during execution. This state persists in the processlist until a new command is issued on that same connection.
* Command: Sleep: This means the connection is currently idle. The query is no longer running, but the connection remains open (likely held by an application connection pool).
* Time: 9695: The connection has been idle in this state for 9,695 seconds (approx. 2.7 hours).
* Info: The specific query that failed was SELECT * FROM information_schema.loads WHERE LABEL IN (...).
Common Causes for State: ERR
Since the query in your example is targeting information_schema.loads, common reasons for failure include:
1. Query Timeout: The query may have exceeded the query_timeout limit (default is often 300s) while searching through a large volume of load metadata.
2. Memory Limit: If the information_schema query scanned a massive history of labels, it might have hit the mem_limit.
3. Syntax or Permission Error: Although less likely for a simple SELECT, any standard SQL error will trigger this state.
How to Find the Specific Error
To find out why it failed, you can look in the following places:
1. FE Audit Log: Search the fe.audit.log on the Frontend leader for the string State=ERR. It will show the full query and usually the error code/message.
bash
grep "State=ERR" fe.audit.log
2. Internal Audit Table: If you have the AuditLoader plugin enabled, you can query the failure directly:
sql
SELECT * FROM starrocks_audit_db*.starrocks_audit_tbl*
WHERE state = 'ERR'
ORDER BY timestamp DESC LIMIT 5;
3. FE Log: If the error was a "Kernel" or "Internal" error, check fe.log around the time 2026-06-12 07:45:28 (the ConnectionStartTime).
Recommendation
If you see many of these Sleep + ERR connections with high Time values, it suggests your application is not properly closing connections or handling exceptions. You may want to lower the FE wait_timeout to automatically reclaim these idle connections:
sql
-- Example: Set idle timeout to 1 hour (3600s)
SET GLOBAL wait_timeout = 3600;
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• sql-reference/sql-statements/cluster-management/plan_profile/SHOW_PROFILELIST.md
• using_starrocks/running_queries.md
• administration/management/resource_management/query_queues.mdRumit Jain
06/12/2026, 11:24 AM2026-06-12 10:55:55.675Z INFO (AuditEventProcessor|66) [AuditLog.log():73] {"Warehouse":"default_warehouse","User":"sr_dml_user","Time":3,"Timestamp":1781261755671,"ReturnRows":0,"IsQuery":true,"Stmt":"SELECT model_name, model_meta_json FROM lakehouse_meta.model_meta WHERE model_name = 'tlqe-tldbtestapp:testTldbLakehouseObject';","ScanRows":0,"IsForwardToLeader":false,"PlanCpuCost":1068.5,"QuerySource":"EXTERNAL","StmtId":2122,"Client":"10.218.126.211:35192","SessionId":"019ebb79-64eb-7bd4-9cb3-6c72b2c242e7","ResourceGroup":"","Db":"","ScanBytes":0,"Digest":"","PlanMemCost":0.0,"AuthorizedUser":"'sr_dml_user'@'%'","QueryId":"019ebb79-6517-7af5-89c5-b8192e40d7b5","feIp":"kube-starrocks-fe-0.kube-starrocks-fe-search.plattest03.svc.cluster.local","CNGroup":"","Catalog":"default_catalog","QueryFEAllocatedMemory":425368,"State":"ERR","ErrorCode":"INTERNAL_ERR","TransmittedBytes":0,"CustomQueryId":""}Rocky
06/12/2026, 11:24 AMErrorCode: INTERNAL_ERR in a StarRocks audit log indicates that an unhandled exception occurred in the Frontend (FE) during the processing of the query.
Because the Time is only 3ms and ScanRows is 0, the failure happened very early—likely during the *SQL analysis, parsing, or optimization phase*—before the query ever reached the execution stage on the Backends (BE).
Possible Reasons for INTERNAL_ERR
1. Frontend Java Exception (Most Common):
An unexpected error (like a NullPointerException or IndexOutOfBoundsException) occurred in the StarRocks FE code. This is usually caused by a corner case in the SQL optimizer or metadata manager that the system didn't catch gracefully.
* Action: Search your fe.log for the QueryId (019ebb79-6517-7af5-89c5-b8192e40d7b5). The log will contain the full Java stack trace for this error, which reveals exactly what failed.
2. Metadata Inconsistency or Invalid View:
If lakehouse_meta.model_meta is a View, and one of the underlying tables it references has been dropped or altered, the query might fail with an internal error during the expansion of the view.
* Action: Run SHOW CREATE TABLE lakehouse_meta.model_meta; to verify the table/view status.
3. Inconsistent Catalog State:
Since the query involves a database named lakehouse_meta, if this is part of an external catalog (like Iceberg or Hive) or a custom integration, there may be a connectivity issue or a version mismatch between StarRocks and the external metadata store that caused the FE to crash while fetching schema info.
4. Schema Change Conflicts:
If a DROP TABLE, TRUNCATE, or ALTER TABLE was running on lakehouse_meta.model_meta at the exact same millisecond the query started, a race condition in the FE's metadata lock could result in an INTERNAL_ERR.
Recommended Troubleshooting Steps
1. Check FE Logs:
The most definitive way to know the reason is to check the fe.log (and fe.warn.log) on the FE leader node.
bash
grep "019ebb79-6517-7af5-89c5-b8192e40d7b5" fe.log -A 20
This will show the specific Java exception.
2. Verify Table Existence:
Ensure the user sr_dml_user can still "see" the table:
sql
DESC lakehouse_meta.model_meta;
3. Try Disabling the Optimizer (Test Only):
To see if the issue is in the Cost-Based Optimizer (CBO), try running the query with the optimizer disabled in your session:
sql
SET enable_cbo = false;
-- Then run your SELECT query
_If it works with enable_cbo = false, it is a bug in the optimizer._
4. Check FE Leader:
Ensure you are looking at the logs of the FE Leader, as internal planning errors are sometimes only fully logged there if the query was forwarded.
References
• data_source/catalog/iceberg/iceberg_meta_table.md
• administration/management/BE_configuration.md
• data_source/catalog/deltalake_catalog.mdRumit Jain
06/12/2026, 11:29 AM019ebb79-6517-7af5-89c5-b8192e40d7b5 . What else can be looked in the cluster?Rocky
06/12/2026, 11:29 AM019ebb79-6517-7af5-89c5-b8192e40d7b5 in your fe.log, it usually means the error occurred in a thread or at a phase (like initial parsing) where the logger context had not yet associated the ID with the log message.
Since the audit log shows IsForwardToLeader: false, the error definitely happened on the node kube-starrocks-fe-0.
Here are the other places and methods to find the root cause:
1. Search for the Table Name or Error String
Instead of searching for the Query ID, search for the table name or the INTERNAL_ERR string in the logs. This will often catch the stack trace that the ID search missed:
bash
grep -C 20 "lakehouse_meta" fe.log
# OR
grep -C 20 "INTERNAL_ERR" fe.log
2. Check fe.warn.log and fe.out
* fe.warn.log: Significant planning errors or metadata failures are often piped specifically to the warning log.
* fe.out: This file captures standard output/error (stdout/stderr) of the JVM. If the FE crashed or hit a severe "OutOfMemory" or "StackOverflow" during planning, the details might only exist here and not in the formatted fe.log.
3. Check for Metadata Inconsistency
Since the table lakehouse_meta.model_meta seems to be used for storing metadata, check if the table itself is corrupted or if there is a lock contention:
* Run SHOW CREATE TABLE lakehouse_meta.model_meta; to ensure the schema is intact.
* Check fe.log for any "Metadata is not ready" or "Edit log" errors which indicate the FE is having trouble staying in sync.
4. Use the query_dump API
StarRocks has a specific API to help debug "Unknown/Internal Errors" by dumping everything the FE knows about a specific query. You can try to manually "dump" the failure if you can reproduce the query:
bash
curl --user root: -X POST \
"http://<fe_ip>:<fe_http_port>/api/query_dump?db=lakehouse_meta" \
-d "SELECT model_name, model_meta_json FROM lakehouse_meta.model_meta WHERE model_name = 'tlqe-tldbtestapp:testTldbLakehouseObject';"
This will return a JSON containing the exception stack trace if the planning fails.
5. Check FE JVM Health
If the planning failed in 3ms with an internal error, the FE might be struggling with memory.
* Check the FE memory usage: jstat -gcutil <fe_pid> 1000 10
* Look for java.lang.OutOfMemoryError in fe.log or fe.out.
6. Verify the User Permissions
Even though it says INTERNAL_ERR, sometimes early-stage authorization failures against specific internal catalogs can trigger this if the error handling is not caught. Verify that sr_dml_user has SELECT privileges on both the database and the table.
Summary Recommendation:
Check fe.warn.log and fe.out on node kube-starrocks-fe-0. If those are empty, use the query_dump HTTP API shown above to force a stack trace.
References
• faq/Dump_query.md
• administration/management/logs.md
• administration/management/FE_configuration.md
• sql-reference/information_schema/loads.md
• administration/http_interface/query_detail.md
References
• administration/management/logs.md
• administration/management/FE_configuration.md
• administration/http_interface/query_detail.md
• faq/Dump_query.mdRumit Jain
06/12/2026, 11:34 AMRocky
06/12/2026, 11:35 AMfe.log, fe.warn.log, etc.) are 0 bytes is likely because your StarRocks FE is configured to send logs to the Console (stdout/stderr) instead of writing them to local files.
In Kubernetes environments (like yours, based on the kube-starrocks-fe-0 hostname), this is the standard configuration. It allows log collectors (like Fluent Bit or Filebeat) to scrape the container's output and push it to OpenSearch.
Why the files are empty:
1. sys_log_to_console: In containerized environments, the environment variable SYS_LOG_TO_CONSOLE is typically set to 1. This tells the FE to use a ConsoleAppender for Log4j, which redirects all logs to the container's standard output and stops writing to the .log files on disk.
2. sys_log_level = INFO: This setting only controls how much detail is logged (Information, Warning, Error), but it does not control where the logs go.
Where to find your logs:
Since you are using Kubernetes and pushing to OpenSearch:
1. Check OpenSearch: Search in your OpenSearch dashboard for the `QueryId`: 019ebb79-6517-7af5-89c5-b8192e40d7b5.
2. Check kubectl logs: You can view the live logs directly from the Kubernetes API:
bash
kubectl logs kube-starrocks-fe-0 -n <your-namespace> | grep "019ebb79-6517-7af5-89c5-b8192e40d7b5"
3. Check fe.out (if it exists): Sometimes if the logging system itself fails to initialize, errors are printed to fe.out. However, in K8s, this is usually also redirected to the container's stdout.
If you still can't find the error:
If OpenSearch doesn't show the stack trace for that INTERNAL_ERR, it is likely because the error happened before the Logger context was fully initialized for that query.
Try the Query Dump API:
Run this command from a machine that can reach the FE. It forces the FE to re-plan the query and return the full error/stack trace in the HTTP response:
bash
curl --user sr_dml_user:<password> -X POST \
"http://<FE_IP>:8030/api/query_dump?db=lakehouse_meta" \
-d "SELECT model_name, model_meta_json FROM lakehouse_meta.model_meta WHERE model_name = 'tlqe-tldbtestapp:testTldbLakehouseObject';"
Summary of Log Configs
* sys_log_to_console: When true, files are empty and logs go to stdout.
* sys_log_format: If you are pushing to OpenSearch, check if this is set to json. If it is, the logs in stdout will be structured JSON, making them much easier to query in OpenSearch.
References
• administration/management/FE_configuration.md
• administration/management/logs.md
• faq/Dump_query.md
References
• administration/management/FE_configuration.md
• administration/management/logs.mdRumit Jain
06/12/2026, 11:43 AMsys_log_format = json in a running cluster?Rocky
06/12/2026, 11:43 AMsys_log_format parameter is not mutable, meaning it cannot be changed dynamically via SQL while the cluster is running. To enable JSON logging for your FE system logs, you must modify the configuration and restart the FE nodes.
1. Requirements
* Version: You must be on StarRocks v3.2.10 or higher.
* Location: The configuration must be added to your fe.conf.
2. Steps for Kubernetes (Operator or Helm)
Since you are running in Kubernetes (kube-starrocks-fe-0), follow these steps:
1. Update Configuration:
Modify your StarRocks custom resource (if using the Operator) or your Helm values.yaml. Add the following to the FE configuration section:
yaml
fe:
config: |
sys_log_format = json
2. Apply and Restart:
Apply the change. If using the Operator, it will typically trigger a rolling restart of your FE pods automatically.
bash
kubectl apply -f starrocks-cluster.yaml
If it doesn't restart automatically, you can trigger it manually:
bash
kubectl rollout restart statefulset kube-starrocks-fe -n <namespace>
3. Alternative: Mutable JSON Logs (No Restart)
If you specifically want Audit Logs (the ones you saw in your first message) to be in JSON format without restarting the FE, you can set those dynamically because they are "mutable":
sql
-- This affects the audit logs (queries, connections, etc.)
ADMIN SET FRONTEND CONFIG ("audit_log_json_format" = "true");
-- This affects internal statistic/audit entries
ADMIN SET FRONTEND CONFIG ("internal_log_json_format" = "true");
_Note: audit_log_json_format requires v3.2.7+._
Summary of sys_log_format
* plaintext (Default): Human-readable logs (what you likely have now).
* `json`: Emits structured JSON events (UTC timestamps, level, thread, class, message, and stack traces). This is ideal for OpenSearch/ELK because it eliminates the need for complex Grok patterns.
Warning: Once you switch sys_log_format to json, all logs appearing in kubectl logs will be JSON strings. Ensure your OpenSearch pipeline is ready to parse JSON instead of parse the old plaintext format.
References
• administration/management/FE_configuration.md
• administration/management/logs.md
• administration/management/BE_configuration.md
• sql-reference/sql-statements/administration/ADMIN_SET_CONFIG.md
• deployment/helm.md
• deployment/operator.md
References
• administration/management/FE_configuration.md
• administration/management/BE_configuration.mdRumit Jain
06/12/2026, 1:13 PMRocky
06/12/2026, 1:13 PMStarrocksCNCPUUsage and StarrocksMemCPUUsage are not native StarRocks Prometheus metric names. They are likely custom aliases or names used in a specific dashboard (like a custom Grafana template) or a cloud-specific monitoring service.
In StarRocks, Compute Nodes (CN) and Backends (BE) share the same core engine, so they use the same underlying Prometheus metrics. To monitor and alert on CN CPU and Memory usage, you should use the standard metrics provided by the /metrics endpoint.
1. Equivalent Standard Metrics
The equivalent native StarRocks metrics for these are:
Goal | Native StarRocks Metric
CPU Usage | starrocks_be_cpu
Memory Usage | starrocks_be_process_mem_bytes
2. How to Get These Metrics
You can verify the metrics are being exported by accessing the CN's HTTP port (default 8040):
bash
# Replace <CN_IP> with your CN node's IP or pod name
curl http://<CN_IP>:8040/metrics | grep -E "starrocks_be_cpu|starrocks_be_process_mem_bytes"
3. Recommended Alert Rules (PromSQL)
To add alerts in Prometheus Alertmanager or Grafana, use the following PromSQL expressions:
A. CN CPU Usage Alert (Triggers when > 90%)
This calculation calculates the percentage of non-idle CPU time.
sql
(1 - (sum(rate(starrocks_be_cpu{mode="idle", job="starrocks_cluster"}[5m])) by (instance)) /
(sum(rate(starrocks_be_cpu{job="starrocks_cluster"}[5m])) by (instance))) * 100 > 90
B. CN Memory Usage Alert (Triggers when > 90% of limit)
StarRocks BE/CN memory is controlled by the mem_limit (default 90%). You should alert when the process memory approaches this limit.
sql
# Simple version: Alert when memory exceeds a specific byte threshold (e.g., 60GB)
starrocks_be_process_mem_bytes{job="starrocks_cluster"} > (60 * 1024 * 1024 * 1024)
# Ratio version: Memory usage relative to the configured limit
starrocks_be_process_mem_bytes / (starrocks_be_mem_limit_bytes) > 0.9
4. How to Add the Alerts
1. Prometheus: Add the PromSQL above to your alert.rules file under a groups section.
2. Grafana:
* Create a new Alert Rule.
* Paste the PromSQL into the query section.
* Set the Threshold (e.g., IS ABOVE 90).
* Configure the Notification Policy (Slack, Email, PagerDuty).
3. Kubernetes Operator: If you are using the StarRocks Operator, you can configure HPA (Horizontal Pod Autoscaler) to automatically scale CNs based on CPU/Memory using the autoScalingPolicy in your StarRocksCluster YAML:
yaml
starRocksCnSpec:
autoScalingPolicy:
hpaPolicy:
metrics:
• type: Resource
resource:
name: cpu
target:
averageUtilization: 80
Troubleshooting Tip
If you are seeing "StarrocksCNCPUUsage" in an existing system and need to find its definition, check your Grafana Variable definitions or your Prometheus relabel_configs. It is common for users to rename starrocks_be_cpu to StarrocksCNCPUUsage during the ingestion phase for easier reading from the CN pods.
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/alert.md
• deployment/sr_operator.md
• administration/management/monitoring/metrics.md
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/Monitor_and_Alert.mdRumit Jain
06/12/2026, 1:23 PMRocky
06/12/2026, 1:24 PMstarrocks_be_resource_group_mem_limit_bytes is not the same as the process-level metrics discussed earlier.
While starrocks_be_process_mem_bytes monitors the memory of the entire node, this metric monitors the memory limit of a specific Resource Group (Workload Management).
The Key Differences
Metric | Level | What it represents
starrocks_be_process_mem_bytes | Node | The actual memory currently being used by the entire StarRocks process (BE or CN).
starrocks_be_mem_limit_bytes | Node | The total memory upper bound for the entire StarRocks process on that node.
starrocks_be_resource_group_mem_limit_bytes | Resource Group | The memory quota assigned to a subset of users or queries (e.g., a "DataScience" or "Dashboard" group).
When to use which?
1. Use Node-level metrics (starrocks_be_process_mem_bytes) for infrastructure health alerts. This tells you if the pod is about to crash due to an OOM (Out of Memory) error.
2. Use Resource Group metrics (starrocks_be_resource_group_mem_limit_bytes) if you want to monitor Workload Isolation.
* For example, if you have a "Marketing" group with a mem_limit=20%, this metric shows the byte-value of that 20%.
* You would pair this with starrocks_be_resource_group_mem_inuse_bytes to see if a specific department is hitting their assigned limit.
Example Alert for Resource Group
If you want to know when a specific resource group is using more than 90% of its assigned quota:
sql
# Alert when a group uses > 90% of its allocated slice
starrocks_be_resource_group_mem_inuse_bytes / starrocks_be_resource_group_mem_limit_bytes > 0.9
Summary:
If your goal is to monitor if the CN node itself is running out of memory, stay with starrocks_be_process_mem_bytes. If your goal is to monitor if specific queries/users are being throttled because they hit their group quota, use the resource_group metrics.
References
• administration/management/monitoring/metrics.md
• administration/management/resource_management/resource_group.mdRumit Jain
06/12/2026, 1:26 PMRocky
06/12/2026, 1:26 PMStarrocksFENodeDown alert. This alert triggers when the Prometheus scraper cannot reach the FE container, typically indicating the Java process has crashed or the Pod is in an unhealthy state.
──────────
Runbook: StarRocks FE Node Down
1. Immediate Triage (Impact Assessment)
Determine if the entire cluster is down or just one node:
* Check other FEs: Run kubectl get pods -n <namespace> to see if other fe pods are Running.
* Check Cluster Status: If you can still connect to the cluster via SQL (through a different FE), run:
sql
SHOW FRONTENDS;
* If Alive is false for the specific pod, it is confirmed down.
* If the Role of the down node was LEADER, check if a new Leader was elected.
2. Inspect Kubernetes State
Check why the Pod is down or not ready:
* Pod Status: kubectl describe pod <pod_name> -n <namespace>
* Look for OOMKilled: The FE process exceeded its JVM/Container memory limit.
* Look for Node Affinity/Taints: The pod cannot be scheduled.
* Look for Unhealthy Events: Readiness/Liveness probe failures.
* Node Status: kubectl get nodes
* Check if the underlying EKS node is NotReady or has DiskPressure.
3. Analyze Logs
If the container is crashing (CrashLoopBackOff), the logs will contain the reason:
* Standard Output (JVM errors):
bash
kubectl logs <pod_name> -n <namespace> -c fe --previous
Look for: java.lang.OutOfMemoryError, Too many open files, or Invalid Configuration.
* FE System Logs:
Search for fe.warn.log or fe.log inside the pod (if accessible) or via your log aggregator (ELK/OpenSearch).
Look for: BDBJE exceptions, metadata corruption, or network timeout errors.
4. Common Failure Scenarios & Solutions
Scenario | Diagnostic | Resolution
OOMKilled | kubectl describe shows Reason: OOMKilled | Increase FE memory limits in your Helm values/Operator CRD. Ensure JAVA_OPTS matches the container limits.
Metadata Lock/Corruption | Logs show ReplicaWriteException or BDBJE errors | High Risk: If only one node is down, K8s usually restarts it. If it fails to sync, you may need to clear its meta directory and restart with --helper.
No Leader (Majority Down) | All FEs down or stuck in INIT | If >50% of Follower nodes are down, the cluster loses quorum. You may need to use bdbje_reset_election_group = true (See [Metadata Recovery](https://docs.starrocks.io/docs/administration/Meta_recovery)).
Disk Full | Logs show No space left on device | Check the PVC size for the FE metadata directory. Increase the volume size or delete old logs/dumps.
5. Recovery Procedure
1. Restart Pod: If the pod is stuck, try a manual deletion to let the StatefulSet recreate it:
bash
kubectl delete pod <pod_name> -n <namespace>
2. Verify Metadata Health: Once the pod is back, log into the SQL interface:
sql
SHOW FRONTENDS; -- Ensure Alive = true
SHOW BACKENDS; -- Ensure FE can still communicate with BEs
3. Check Open Files Limit: If logs show Too many open files, ensure the ulimit -n is set to at least 65535 in the container environment.
6. Escalation
If the FE fails to join the cluster after a restart and shows consistent BDBJE metadata errors:
* Identify the current Leader (SHOW FRONTENDS).
* Check the fe/meta directory of the failing node.
* Contact the StarRocks community or support if metadata recovery is required to prevent data loss.
References
• administration/Meta_recovery.md
• administration/management/logs.md
• deployment/deploy_manually.mdRocky
06/12/2026, 1:26 PMRumit Jain
06/12/2026, 1:36 PMRocky
06/12/2026, 1:36 PMsql
-- Check if the node is marked as Alive = false
SHOW COMPUTE NODES;
-- Alternatively, use the PROC command
SHOW PROC '/compute_nodes';
* Alive: false → The FE cannot reach the CN via the heartbeat port (default 9050).
* StatusCode: DISCONNECTED → The node has lost contact with the cluster.
* StatusCode: SHUTDOWN → The node is performing a graceful shutdown (check if a scaling-down operation is in progress).
2. Inspect Kubernetes State (EKS/K8s)
If StarRocks is running on Kubernetes, check the Pod and Node health:
* Check Pod Status: kubectl get pods -l "starrocks-component=cn" -n <namespace>
* Check for Restarts: If RESTARTS > 0, the process is crashing.
* Identify Crashes: kubectl describe pod <cn_pod_name> -n <namespace>
* Reason: OOMKilled → The CN process exceeded its container memory limit. CNs are memory-intensive during large joins or aggregations.
* Liveness/Readiness Probe Failure → The process is alive but unresponsive (possibly due to high CPU load or a long GC pause).
3. Analyze Logs
The CN logs are stored in the same format as BE logs.
* Standard Output (Process start errors):
bash
kubectl logs <cn_pod_name> -n <namespace> --previous
* Warning/Error Logs:
Search for be.WARNING or <http://be.INFO|be.INFO> inside the pod:
bash
# Search for common error keywords
kubectl exec <cn_pod_name> -n <namespace> -- grep -i "error" /opt/starrocks/cn/log/be.WARNING
Look for: Memory limit exceeded, Failed to get starlet client, or Heartbeat timeout.
4. Common CN Failure Scenarios
Scenario | Diagnostic | Resolution
Out of Memory (OOM) | OOMKilled in K8s or Memory limit exceeded in logs. | Increase resources.limits.memory in your YAML. Check if query_mem_limit is set too high for the available hardware.
Zombie CN | Alive: false but Pod is Running. | There may be a network partition between FE and CN. Check if the CN can reach FE on port 9010 and FE can reach CN on 9050/9060.
Cache Disk Failure | Logs show IO Error or Failed to initialize starlet. | In shared-data mode, CNs use local disks for caching. Check if the disk is full or has hardware errors.
CPU Saturation | CpuUsedPct is 100% in SHOW COMPUTE NODES. | The node may be timing out on heartbeats because it's too busy. Consider scaling out (adding more CNs).
5. Recovery Steps
1. Restart the CN: If the pod is stuck or unresponsive:
bash
kubectl delete pod <cn_pod_name> -n <namespace>
Since CNs are stateless (compute-only), they can be restarted safely without data loss.
2. Verify Joining: After the pod restarts, run SHOW COMPUTE NODES; again. The LastStartTime should be current and Alive should be true.
3. Check Query Distribution: If queries are failing, verify the variables:
sql
-- Ensure the cluster is configured to use CNs
SHOW VARIABLES LIKE '%compute_node%';
6. Escalation
If CNs repeatedly crash with "Heartbeat timeout" but memory and CPU appear normal:
* Check the FE logs (fe.log) for messages related to the CN ID.
* Ensure the priority_networks configuration in cn.conf correctly matches the K8s pod network to avoid the CN registering with a private/unreachable IP.
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.mdRumit Jain
06/12/2026, 1:43 PMRocky
06/12/2026, 1:43 PMquery_mem_limit, you can use standard SQL commands via any MySQL-compatible client connected to StarRocks.
1. Check the Current Session Value
This shows the limit applied to your current connection:
sql
SHOW VARIABLES LIKE 'query_mem_limit';
2. Check the Global Value
This shows the default limit that will be applied to all new connections:
sql
SHOW GLOBAL VARIABLES LIKE 'query_mem_limit';
──────────
Understanding the Value
* Default (0): A value of 0 means there is no specific limit imposed on individual queries by this variable (though they are still bound by the overall BE memory limit or Resource Group limits).
* Unit: The value is in bytes.
_ _Example:* 2147483648 is 2 GB.
* Scope: This limit is applied per BE node. If you set it to 2 GB and your cluster has 3 BEs, the query can theoretically use up to 6 GB total (2 GB on each node).
How to Change It
If you need to adjust it because a query is failing with a "Memory limit exceeded" error:
* For the current session only:
sql
SET query_mem_limit = 8589934592; -- Set to 8GB
* Globally (for all new sessions):
sql
SET GLOBAL query_mem_limit = 8589934592;
Related: Checking Actual Memory Usage
If you want to see how much memory a running query is actually using right now, you can check the BE memory tracker via your browser:
http://<BE_IP>:<BE_HTTP_PORT>/mem_tracker?type=query
References
• sql-reference/System_variable.md
• administration/management/resource_management/Memory_management.md
• administration/management/resource_management/Query_management.md
References
• administration/management/resource_management/Memory_management.md
• sql-reference/System_variable.md
• administration/management/resource_management/Query_management.md
• administration/management/resource_management/query_queues.mdRumit Jain
06/12/2026, 1:51 PMRocky
06/12/2026, 1:51 PMStarrocksFEQueryLatency alert, which triggers when 95% of queries take longer than 5 seconds.
──────────
Runbook: High Query Latency (P95 > 5s)
1. Immediate Triage (Mitigation)
Determine if the latency is caused by a few "heavy" queries or a systemic cluster slowdown.
* Identify Heavy Queries: Run the following to see queries currently consuming high CPU or memory:
sql
SHOW PROC '/current_queries';
* Kill "Runaway" Queries: If a specific QueryId is consuming massive resources (e.g., ScanBytes in GBs or CPUCost in hundreds of seconds), terminate it:
sql
KILL QUERY <connection_id>; -- Get connection_id from SHOW PROC
* Check Cluster Resource Load: Use top or a monitoring dashboard (Grafana) to check BE/CN nodes for high CPU (>80%) or Disk I/O saturation.
2. Distinguish: Planning vs. Execution
High FE-reported latency can occur in two distinct phases:
Phase | Symptom | Diagnostic
Planning | High latency before the query starts on BEs. | Check fe.log for "planner use long time".
Execution | Query spends most of its time on BE/CN nodes. | SHOW PROFILELIST shows high "Time" values.
3. Investigate Slow Planning (FE-side)
If the delay is in the FE, it is often due to metadata or JVM issues:
* JVM Full GC: Check fe.gc.log. If Full GC events are occurring, the FE will "freeze," causing all queries to hang.
_ _Fix:* Increase FE Heap size (-Xmx) or investigate metadata growth.
* Metadata Locks: If one user is performing a heavy DDL (e.g., ALTER TABLE), other queries may wait for a database lock.
_ _Check:* SHOW PROC '/db_lock'.
* High Cardinality Statistics: Large schemas or complex joins can slow down the Cost-Based Optimizer (CBO).
4. Investigate Slow Execution (BE/CN-side)
If planning is fast but execution is slow, use the Query Profile:
1. Enable Profiling:
sql
SET enable_profile = true;
2. Find the Query: Run SHOW PROFILELIST; and find the QueryId of a slow query.
3. Analyze Bottlenecks:
sql
ANALYZE PROFILE FROM '<QueryId>';
Look for:
* OLAP_SCAN_NODE: If "IOTaskWaitTime" is high, disks are saturated. If "RowsRead" is much higher than "RowsReturned," you may need better indexes or partitioning.
* EXCHANGE_NODE: High "NetworkTime" indicates data shuffling bottlenecks. Consider Colocated Joins.
* HASH_JOIN_NODE: If one instance is significantly slower than others, check for Data Skew.
5. Common Root Causes & Solutions
Scenario | Symptom | Solution
Data Skew | One BE has 10x more CPUTime than others in Profile. | Re-evaluate the DISTRIBUTED BY key for the table.
Large Scans | ScanBytes is very high for simple filters. | Add Bitmap Indexes or use Materialized Views to pre-aggregate data.
Metadata Heavy | Cluster has millions of Tablets. | Consolodate small partitions or increase tablet_max_size.
RPC Latency | High latency despite low CPU. | Set brpc_connection_type = pooled in be.conf and restart BEs.
6. Systemic Check (Audit Log)
If the alert is persistent, analyze the StarRocks Audit Log (fe/log/fe.audit.log) to find patterns:
* Search for queries with IsQuery=1 and QueryTime > 5000.
* Check if many queries are failing with Memory limit exceeded.
References
• administration/management/monitoring/alert.md
• best_practices/query_tuning/query_planning.md
• faq/Sql_faq.md
• best_practices/query_tuning/query_profile_text_based_analysis.md
ReferencesRocky
06/12/2026, 1:51 PMRumit Jain
06/12/2026, 1:55 PMRocky
06/12/2026, 1:55 PMSHOW PROC '/current_queries'; and receiving an Empty set simply means that there are no queries currently being processed by the Front End (FE) node you are connected to at this exact moment.
Here is a breakdown of why it might be empty and how to see what has happened recently:
1. It is a Real-Time Snapshot
This command only shows queries that are in the RUNNING or PENDING (queued) state at the millisecond you hit Enter. Because StarRocks is designed for high performance, many queries finish in milliseconds and will not stay in this list long enough for you to "catch" them manually.
2. You may be checking the wrong FE
The /current_queries path only shows queries managed by the specific FE node your MySQL client is connected to. In a multi-FE cluster, queries might be running on other follower FEs.
* To see all queries cluster-wide, use:
sql
SHOW PROC '/global_current_queries';
(Note: This requires StarRocks v3.0+)
3. How to see "Past" Queries
If you want to see queries that have already finished, SHOW PROC is not the right tool. Use one of these instead:
* Audit Log (Recommended): Every query is recorded in the FE audit log.
* File location: fe/log/fe.audit.log
* If you have the AuditLoader plugin installed, you can query the history via SQL:
sql
SELECT * FROM starrocks_audit_db*.starrocks_audit_tbl*
ORDER BY timestamp DESC LIMIT 10;
* Query Profile List: If you have profiling enabled, you can see recent finished queries and their execution IDs:
sql
SHOW PROFILELIST;
* Information Schema: You can query the metadata for execution information:
sql
SELECT * FROM information_schema.exec_queries;
Summary of common SHOW PROC query paths:
Path | Description
/current_queries | Queries active on the FE you are currently logged into.
/global_current_queries | Queries active across all FEs in the cluster.
/current_backend_instances | Shows which BE nodes are currently working on fragments.
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROC.md
• using_starrocks/running_queries.md
• administration/management/audit_loader.md
References
• administration/management/audit_loader.md
• faq/operation_maintenance_faq.md
• administration/management/logs.md
• administration/sql_digest.mdRumit Jain
06/12/2026, 1:58 PMRocky
06/12/2026, 1:58 PMsql
SHOW VARIABLES LIKE 'enable_profile';
* false (Default): Profiling is disabled (to save network overhead).
* `true`: Profiling is enabled, and StarRocks will collect execution details for your queries.
2. How to Enable It
If you want to start collecting profiles, you can enable it at the session or global level:
* For your current session:
sql
SET enable_profile = true;
* Globally (for all future connections):
sql
SET GLOBAL enable_profile = true;
3. Verify if Profiles are being Generated
After running a query with profiling enabled, you can check if it was successfully recorded by running:
sql
SHOW PROFILELIST;
If this list is empty after running a query, profiling was likely not enabled or the query finished too quickly to be captured (though typically all queries with enable_profile = true should appear).
Related Settings
* enable_statistics_collect_profile: Specifically for profiling internal statistics collection queries (introduced in v3.1.5).
* Web UI: You can also view profiles by visiting http://<FE_IP>:<FE_HTTP_PORT>/query in your browser.
References
• best_practices/query_tuning/query_profile_overview.md
• sql-reference/System_variable.md
• best_practices/query_tuning/query_profile_text_based_analysis.md
References
• best_practices/query_tuning/query_profile_overview.md
• sql-reference/System_variable.md
• best_practices/query_tuning/query_profile_text_based_analysis.md
• administration/management/proc_profile.md
• administration/management/FE_configuration.md
References
• best_practices/query_tuning/query_profile_overview.md
• administration/management/FE_configuration.md
• sql-reference/System_variable.md
• administration/management/proc_profile.md
• best_practices/query_tuning/query_profile_text_based_analysis.mdRumit Jain
06/12/2026, 2:01 PMSHOW PROFILELIST\G;
*************************** 1. row ***************************
QueryId: 019ebc21-856f-756b-8aff-34bb2d8ca0e4
StartTime: 2026-06-12 13:59:34
Time: 48ms
State: Finished
Statement: DELETE FROM _statistics_.predicate_columns WHERE fe_id='kube-starrocks-fe-1.kube-starrocks-fe-search.plattest03.svc.cluster. ...
*************************** 2. row ***************************
QueryId: 019ebc21-853d-76c7-ac48-5b3ee4f94fa0
StartTime: 2026-06-12 13:59:33
Time: 48ms
State: Finished
Statement: DELETE FROM _statistics_.predicate_columns WHERE fe_id='2' AND last_used < '2026-06-11 13:59:33'
*************************** 3. row ***************************
QueryId: 019ebc21-6514-7691-b250-389d01ee157f
StartTime: 2026-06-12 13:59:25
Time: 190ms
State: Finished
Statement: INSERT INTO _statistics_.predicate_columns(fe_id, db_id, table_id, column_id, usage, last_used ) VALUES ('1', 509828, 135450 ...
*************************** 4. row ***************************
QueryId: 019ebc21-64dd-7904-afb6-fe6c1da199f1
StartTime: 2026-06-12 13:59:25
Time: 55ms
State: Finished
Statement: DELETE FROM _statistics_.predicate_columns WHERE fe_id='kube-starrocks-fe-0.kube-starrocks-fe-search.plattest03.svc.cluster. ...
*************************** 5. row ***************************
QueryId: 019ebc21-64ab-78eb-8a3d-7cd73c88e7ea
StartTime: 2026-06-12 13:59:25
Time: 55ms
State: Finished
Statement: DELETE FROM _statistics_.predicate_columns WHERE fe_id='1' AND last_used < '2026-06-11 13:59:25'
*************************** 6. row ***************************
QueryId: 019ebc21-3149-7862-b3d1-151f41e36e0e
StartTime: 2026-06-12 13:59:12
Time: 110ms
State: Finished
Statement: LOAD LABEL `sampledatameshdb`.`sampledatameshdb__testdatameshlakehouseobject__messagebasedbundle__7f46cd8459__rwxkl__1__1781 ...
*************************** 7. row ***************************
QueryId: 019ebc21-30ee-7f22-b402-e110b8995e45
StartTime: 2026-06-12 13:59:12
Time: 90ms
State: Finished
Statement: LOAD LABEL `sampledatameshdb`.`sampledatameshdb__testdatameshlakehouseobject__messagebasedbundle__7f46cd8459__rwxkl__1__1781 ...
*************************** 8. row ***************************
QueryId: 019ebc21-302a-7f72-a7bc-04f58c2263e4
StartTime: 2026-06-12 13:59:11
Time: 1s264ms
State: Finished
Statement: LOAD LABEL `sampledatameshdb`.`sampledatameshdb__testdatameshlakehouseobject__messagebasedbundle__7f46cd8459__rwxkl__1__1781 ...
8 rows in set (0.00 sec)
ERROR:
No query specified
Starrocks >Rocky
06/12/2026, 2:01 PMSHOW PROFILELIST
Based on the output provided, here is the breakdown of what is happening in your cluster:
1. Internal Statistics Maintenance (Rows 1–5)
Most of the activity you see involves INSERT and DELETE operations on the _statistics_.predicate_columns table.
* What this is: This is normal internal behavior for StarRocks (especially versions 3.5.0+). StarRocks tracks "Predicate Columns" (columns frequently used in WHERE, JOIN, or GROUP BY clauses) to decide which columns need updated statistics for the Cost-Based Optimizer (CBO).
* The "Anomaly": These tasks are running frequently. While this is expected metadata maintenance, if you see thousands of these per minute, it might indicate that your FE is very busy refreshing its statistics cache. However, the latencies shown (48ms–190ms) are healthy.
2. Data Loading (Rows 6–8)
The queries starting with LOAD LABEL are data ingestion jobs.
* Observation: Query 019ebc21-302a-7f72-a7bc-04f58c2263e4 took 1.264 seconds, while the other loads took less than 110ms.
* Possible Anomaly: If these loads are all the same size/type, the 1.2s load is significantly slower (10x) than the others. This could be due to a larger batch of data or a temporary lock/resource contention on the destination table.
3. Kubernetes Environment
The fe_id in Row 1 (kube-starrocks-fe-1.kube-starrocks-fe-search...) confirms you are running in a Kubernetes environment. The FE is using its full DNS name as its ID, which is standard.
──────────
Effects of Enabling Profiling (enable_profile = true)
Enabling profiling is a powerful diagnostic tool, but it has specific "after-effects" on cluster performance:
1. Network Overhead:
* Every time a query finishes, the Backend (BE) nodes must serialize their execution metrics and send them to the Front End (FE). In a high-concurrency environment (hundreds of queries per second), this extra network traffic can lead to congestion and increased query latency.
2. FE Memory Consumption:
* The FE stores the last 100 query profiles in memory by default so you can view them in the Web UI. If your queries are very complex (thousands of plan nodes), these profiles can become large, consuming FE heap memory.
3. Disk I/O & CPU:
* If enable_profile_log is on (default in newer versions), the FE writes these profiles to fe.profile.log in JSON format. This involves CPU for serialization/compression and Disk I/O for writing the logs.
4. Performance Jitter:
* For very short, sub-millisecond queries, the time taken to "collect" and "report" the profile can actually be longer than the query execution itself, making "fast" queries appear slightly slower.
Recommendation
Do not leave enable_profile = true turned on globally in a production environment forever. Instead, use the Slow Query Threshold:
sql
-- Only generate profiles for queries taking longer than 500ms
SET GLOBAL big_query_profile_threshold = '500ms';
SET GLOBAL enable_profile = true;
This ensures you capture the "problem" queries (like your 1.2s load) without wasting resources on the 48ms background tasks.
References
• best_practices/query_tuning/query_profile_overview.md
• sql-reference/System_variable.md
• administration/management/logs.md
• using_starrocks/Cost_based_optimizer.md
References
• best_practices/query_tuning/query_profile_overview.md
• using_starrocks/Cost_based_optimizer.mdRocky
06/12/2026, 2:01 PMRumit Jain
06/12/2026, 2:10 PMRocky
06/12/2026, 2:11 PMenable_profile variable back to false.
Depending on how you enabled it (session-only or globally), use the corresponding command:
1. Disable for your current session
If you only want to stop profiling for your current connection:
sql
SET enable_profile = false;
2. Disable globally
If you enabled it for the whole cluster, use this to prevent future queries from generating profiles:
sql
SET GLOBAL enable_profile = false;
3. (Optional) Disable Internal Statistics Profiling
In your previous SHOW PROFILELIST output, many rows were internal statistics tasks. If you specifically enabled profiling for those, disable it with:
sql
SET GLOBAL enable_statistics_collect_profile = false;
How to verify it's off:
Run this to confirm the setting has changed:
sql
SHOW VARIABLES LIKE 'enable_profile';
The value should now be false.
──────────
Tip: If your goal was to only catch "slow" queries without the overhead of profiling everything (like those 48ms internal tasks), a better approach is to keep profiling "on" but set a high threshold:
sql
SET GLOBAL enable_profile = true;
SET GLOBAL big_query_profile_threshold = '5s'; -- Only profile queries longer than 5 seconds
References
• sql-reference/System_variable.md
• best_practices/query_tuning/query_profile_overview.md
• administration/management/FE_configuration.md
• loading/loading_introduction/troubleshooting_loading.md
References
• sql-reference/System_variable.md
• best_practices/query_tuning/query_profile_overview.md
• administration/management/FE_configuration.md
• loading/loading_introduction/troubleshooting_loading.md
References
• sql-reference/System_variable.md
• administration/management/FE_configuration.md
• best_practices/query_tuning/query_profile_overview.md
• faq/Others.md
• loading/loading_introduction/troubleshooting_loading.md
• administration/management/proc_profile.mdRumit Jain
06/12/2026, 2:12 PMRocky
06/12/2026, 2:12 PMSHOW PROFILELIST for two main reasons:
1. SET GLOBAL Does Not Affect Your Current Session
In StarRocks, SET GLOBAL only changes the setting for future connections. Your current session (the one you are typing in) is still using the old value.
To stop profiling for your current session immediately, run:
sql
SET enable_profile = false;
To verify if it is truly disabled for your current window, run SHOW VARIABLES LIKE 'enable_profile'; and ensure the Value (session) is false.
2. SHOW PROFILELIST is a Historical Cache
SHOW PROFILELIST displays a list of the most recent 100 queries that were already recorded while profiling was on.
* Disabling the variable stops new queries from being added to the list.
* It does not clear the existing history.
* As you run more queries with profiling off, those historical entries will eventually be pushed out of the "Last 100" cache, or they will simply remain there until the FE (Front End) is restarted.
3. Check for Internal Statistics Profiling
If you are still seeing new rows appearing in SHOW PROFILELIST (check the StartTime column), you may have internal statistics profiling enabled. This is a separate toggle:
Check if it's on:
sql
ADMIN SHOW FRONTEND CONFIG LIKE 'enable_statistics_collect_profile';
If it is true, disable it:
sql
ADMIN SET FRONTEND CONFIG ("enable_statistics_collect_profile" = "false");
Summary of how to verify:
1. Run SET enable_profile = false; (no global).
2. Run a new query (e.g., SELECT 1;).
3. Run SHOW PROFILELIST;.
4. Check if the SELECT 1 query appeared at the top. If it did not appear, profiling is successfully disabled.
References
• sql-reference/System_variable.md
• best_practices/query_tuning/query_profile_overview.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/plan_profile/SHOW_PROFILELIST.md
References
• sql-reference/System_variable.md
• best_practices/query_tuning/query_profile_overview.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/plan_profile/SHOW_PROFILELIST.md
References
• sql-reference/System_variable.md
• best_practices/query_tuning/query_profile_overview.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/plan_profile/SHOW_PROFILELIST.md
References
• sql-reference/System_variable.md
• best_practices/query_tuning/query_profile_overview.mdRumit Jain
06/12/2026, 2:17 PMRocky
06/12/2026, 2:18 PMnode_exporter installed).
1. StarRocks Internal Metric (Recommended)
StarRocks CN nodes export the same metrics as BE nodes. The most accurate way to measure the process-level CPU utilization via Prometheus is by using the starrocks_be_cpu metric.
PromQL Rule:
promql
(1 - (sum(rate(starrocks_be_cpu{mode="idle", job="$job_name"}[5m])) by (instance)) /
(sum(rate(starrocks_be_cpu{job="$job_name"}[5m])) by (instance))) * 100 > 80
* What it does: Calculates the percentage of time the CPU was not idle over the last 5 minutes.
* Threshold: Trigger an alert if usage exceeds 80% (adjust based on your needs).
* Duration: Set the for condition (e.g., for: 2m) to avoid alerting on temporary spikes.
2. OS-Level Metric (Using node_exporter)
If you want to monitor the total CPU usage of the machine/container where the CN is running, use node_cpu_seconds_total.
PromQL Rule:
promql
100 * (1 - avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m]))) > 80
3. Resource Group CPU Monitoring
If you use Resource Groups to isolate workloads (e.g., separating small queries from large ones), you may want to alert when a specific group hits its limit:
Metric: starrocks_be_resource_group_cpu_use_ratio
* Value: 0 to 1 (where 1 = 100% of the group's quota used).
* Alert Rule: starrocks_be_resource_group_cpu_use_ratio > 0.9 (Alert when a resource group uses 90% of its allocated CPU).
Recommended Alert Configuration
Metric | Alert Threshold | Duration | Severity
CN CPU Usage | > 90% | 5m | Critical
CN CPU Usage | > 80% | 10m | Warning
Troubleshooting High CPU on CN
If this alert fires, you can investigate the cause directly in StarRocks:
1. Check Running Queries:
sql
SHOW PROC '/current_queries';
Look for queries with high CPUCostSeconds.
2. Check CN Status:
sql
SHOW COMPUTE NODES;
Check the CpuUsedPct column to see which node is struggling in real-time.
3. Identify Big Queries: If CPU is high due to specific queries, consider setting a big_query_cpu_second_limit in a Resource Group to auto-kill queries that consume too much CPU.
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.mdRumit Jain
06/12/2026, 2:29 PMRocky
06/12/2026, 2:29 PMsql
SHOW COMPUTE NODES;
-- Check columns: IP, Alive, NumRunningQueries, CpuUsedPct
3. Check for system-wide congestion:
sql
SHOW PROC '/global_current_queries';
Step 2: Analysis (Find the Culprit)
Find out what is consuming the CPU. It is usually one of three things: a "heavy" query, high concurrency, or background statistics collection.
1. Identify high-CPU queries:
Look for queries with high CPUTime and long ExecTime.
sql
-- View running queries across all FEs
SHOW PROC '/global_current_queries';
* Action: Sort by CPUTime or ScanRows. A query scanning billions of rows with complex joins is the likely cause.
2. Check Resource Group usage:
Determine if a specific workload (e.g., "Analytics" vs "Reporting") is hogging the CPU.
sql
SHOW USAGE RESOURCE GROUPS;
-- Look for high BEInUseCpuCores for that CN's IP
3. Check for Statistics Collection:
Background ANALYZE tasks can occasionally spike CPU.
sql
SHOW ANALYZE STATUS; -- Look for 'RUNNING' tasks
Step 3: Mitigation (Stop the Bleeding)
If the system is unresponsive or latency is spiking for all users, take these steps in order:
1. Kill the offending query:
If you found a specific QueryId in Step 2:
sql
KILL QUERY '<query_id>';
2. Stop background analysis (if necessary):
If ANALYZE tasks are the cause:
sql
KILL ANALYZE <task_id>;
3. Scale Out (Long-term or Emergency):
Since CNs are stateless, you can quickly add more CN nodes to the cluster to distribute the load.
4. Restart the CN (Last Resort):
If a CN is "stuck" at 100% and won't respond to KILL commands, restart the process. Because CNs don't store data, this is safe and won't trigger data rebalancing.
Step 4: Prevention (Post-Mortem)
Once the alert is cleared, apply these limits to prevent a recurrence:
* Set Resource Limits: Create a Resource Group with a hard CPU limit (exclusive_cpu_cores) for heavy users.
* Enable Query Limits: Set session or global limits to auto-kill "runaway" queries:
sql
SET GLOBAL query_timeout = 300; -- Kill queries after 5 mins
SET GLOBAL big_query_cpu_second_limit = 1000; -- Kill if CPU time > 1000s
* Tune the Query: Use EXPLAIN ANALYZE on the identified query to see if it's missing indexes or needs better distribution keys.
References
• administration/management/monitoring/alert.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
• using_starrocks/running_queries.md
• sql-reference/sql-statements/cluster-management/nodes_processes/KILL.md
• administration/management/resource_management/resource_group.md
References
• best_practices/audit_log_resource_group.mdRocky
06/12/2026, 2:29 PMRumit Jain
06/12/2026, 3:47 PMRocky
06/12/2026, 3:47 PMStarrocksMemCPUUsage, so you should set up two separate alerts.
1. Alert Expressions (PromQL)
CPU Usage Alert
This measures the percentage of CPU time not spent in "idle" mode over a 5-minute window.
promql
(1 - (sum(rate(starrocks_be_cpu{mode="idle", instance=~".*"}[5m])) by (instance)) /
(sum(rate(starrocks_be_cpu{instance=~".*"}[5m])) by (instance))) * 100 > 90
* Threshold: > 90%
* Duration: Trigger after 2-5 minutes to ignore brief spikes.
Memory Usage Alert (Process-level)
This monitors how much of the allocated mem_limit the StarRocks process is using.
promql
(starrocks_be_process_mem_bytes / (starrocks_be_mem_limit_bytes)) * 100 > 90
* Threshold: > 90%
* Note: If starrocks_be_mem_limit_bytes is not available in your version, use the node-level memory metric: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90.
──────────
2. Runbook: High CPU/Memory on CN or BE
Step 1: Identify the Culprit
The most common cause is "runaway" or "heavy" queries.
1. Check currently running queries:
sql
SHOW PROC '/current_queries';
Look for queries with high CPUCostSeconds, MemoryUsageBytes, or ScanBytes.
2. Check for large data loads:
Check the status of Routine Load or Broker Load tasks.
sql
SHOW ROUTINE LOAD;
SHOW LOAD;
Step 2: Analysis
* For CPU: If a single query is consuming massive CPU, get its plan:
sql
EXPLAIN ANALYZE <query_id>;
* For Memory: If memory is climbing without dropping, check if there are many concurrent small queries or a few massive joins that are spilling (or failing to spill) to disk.
Step 3: Immediate Mitigation
1. Kill the offending query:
If a specific QueryId is identified as the resource hog:
sql
KILL QUERY '<query_id>';
2. Stop background statistics collection:
If ANALYZE tasks are causing the spike during peak hours:
sql
SHOW ANALYZE STATUS;
KILL ANALYZE <task_id>;
3. Emergency Restart:
If the node is completely unresponsive or in an OOM (Out of Memory) loop:
* Restart the BE/CN process. Since CNs are stateless, this is safe. For BEs, the cluster will automatically re-replicate data if the node stays down, but a quick restart is usually fine.
Step 4: Prevention
* Enable Resource Isolation: Use Resource Groups to limit the maximum CPU and Memory a specific user or workload can consume.
* Set Query Limits:
sql
-- Kill queries that use more than 10GB of memory
SET GLOBAL query_mem_limit = 10737418240;
-- Kill queries that run longer than 5 minutes
SET GLOBAL query_timeout = 300;
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/Monitor_and_Alert.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROC.md
• administration/management/resource_management/resource_group.md
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/Monitor_and_Alert.mdRocky
06/12/2026, 3:48 PMStarrocksMemCPUUsage usually refers to a custom alert rule name. Below are the specific PromQL expressions for each component and the corresponding runbooks.
──────────
1. Alert Expressions (PromQL)
A. Compute Node (CN) Alerts
CN nodes use the same metrics as Backend (BE) nodes.
* CN CPU Usage (> 90%):
promql
(1 - (sum(rate(starrocks_be_cpu{mode="idle"}[5m])) by (instance)) /
(sum(rate(starrocks_be_cpu[5m])) by (instance))) * 100 > 90
* CN Memory Usage (> 90%):
promql
(starrocks_be_process_mem_bytes / starrocks_be_mem_limit_bytes) * 100 > 90
B. Frontend (FE) Alerts
FE monitoring focuses on the JVM heap and the FE process CPU.
* FE CPU Usage (> 90%):
promql
(1 - rate(starrocks_fe_cpu_idle[5m])) * 100 > 90
* FE JVM Heap Usage (> 80%):
promql
(starrocks_fe_jvm_heap_size_bytes{type="used"} / starrocks_fe_jvm_heap_size_bytes{type="max"}) * 100 > 80
──────────
2. Runbook: StarRocks CN (Compute Node)
Symptoms: Query latency increases, "Failed to reserve memory" errors, or node heartbeats timeout.
1. Identify Heavy Queries:
Run the following to find queries consuming the most resources on that specific CN:
sql
SHOW PROC '/current_queries'; -- Check CPUCostSeconds and MemoryUsageBytes
2. Immediate Mitigation:
* Kill offending queries: KILL QUERY '<query_id>';
* Emergency Scale Out: Since CNs are stateless, you can quickly add new CN nodes to the cluster to distribute the load.
3. Optimization:
* Check for data skew or extremely large joins missing a broadcast/shuffle optimization.
* Set query_mem_limit and big_query_cpu_second_limit in your Resource Groups to prevent single queries from exhausting node resources.
──────────
3. Runbook: StarRocks FE (Frontend)
Symptoms: SQL clients cannot connect, SHOW FRONTENDS shows FE as "Dead", or extremely slow query planning/parsing.
1. Check for JVM Full GC:
Check fe.log or fe.out for "Full GC" messages. Frequent Full GCs will cause the FE to hang (Stop-the-World).
2. Memory Analysis (Heap Dump):
If FE memory is stuck at 80-90%+, identify what is taking space (e.g., metadata, large result sets, or many concurrent connections):
bash
jmap -histo:live <fe_pid> | head -n 20
3. Check Connection Count:
High CPU on FE is often caused by a surge in concurrent connections or very complex SQL parsing.
sql
SHOW PROCESSLIST; -- Check for hundreds of "Query" or "Sleep" sessions
4. Mitigation:
* Increase Heap Size: Modify -Xmx in fe.conf (ensure it doesn't exceed 80% of physical RAM).
* Restart FE: If the Leader FE is unresponsive, it will usually trigger a re-election. You may need to manually restart the process if it's stuck in a GC loop.
* Offload Checkpoints: If memory spikes during image saving, ensure image_checkpoint_offload_to_follower is enabled (v3.4+).
Summary Table for Alert Configuration
Component | Metric Type | Alert Threshold | Duration
CN | CPU Usage | > 90% | 2m
CN | Mem Usage | > 90% | 1m
FE | CPU Usage | > 90% | 5m
FE | JVM Heap | > 80% | 3m
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/alert.md
• knowledge/trouble_shooting/fe_memory_problems.md
• faq/fe_mem_faq.md
ReferencesRocky
06/12/2026, 3:48 PMmem_limit).
promql
# Alert if CN process memory > 90% of limit
(starrocks_be_process_mem_bytes / starrocks_be_mem_limit_bytes) * 100 > 90
_Note: If starrocks_be_mem_limit_bytes is not available in your version, use the node-level expression:_
promql
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90
B. Frontend (FE) Memory Usage
FE is Java-based, so monitoring focuses on the JVM Heap. An 80% threshold is recommended to allow overhead for garbage collection.
promql
# Alert if FE JVM Heap usage > 80%
(starrocks_fe_jvm_heap_size_bytes{type="used"} / starrocks_fe_jvm_heap_size_bytes{type="max"}) * 100 > 80
──────────
2. Runbook: StarRocks CN Memory Usage
Symptoms: Queries failing with "Memory limit exceeded," node becomes "Dead" in SHOW COMPUTE NODES, or high swap usage on the host.
1. Identify Memory-Heavy Queries:
Check currently running queries and sort by memory consumption.
sql
SHOW PROC '/current_queries';
-- Check 'MemoryUsageBytes' and 'CPUCostSeconds'
2. Kill Offending Queries:
If a single query is consuming a disproportionate amount of memory:
sql
KILL QUERY '<query_id>';
3. Check for Metadata/Schema Issues:
Excessive memory can be caused by wide tables (thousands of columns) or very high concurrency of complex joins.
4. Mitigation:
* Emergency Scale Out: Since CNs are stateless, you can immediately add more CN nodes to the cluster to distribute the load.
* Restart the Process: If a CN node is stuck and unresponsive, restart the CN process. This will clear the process memory without data loss.
5. Prevention:
* Resource Groups: Bind users to resource groups with hard memory limits.
* Spill to Disk: Ensure enable_spill = true is set for large queries to prevent OOM.
──────────
3. Runbook: StarRocks FE Memory Usage
Symptoms: "Full GC" logs in fe.log, slow query planning, or SQL clients unable to connect.
1. Check JVM Heap Health:
Run a histogram of objects in the heap to see what is consuming memory (metadata, connection objects, or query results).
bash
# Run on the FE host
jmap -histo:live <fe_pid> | head -n 20
2. Inspect Connections:
High connection counts can exhaust FE memory.
sql
SHOW PROCESSLIST;
3. Mitigation:
* Increase Heap Size: If the physical RAM allows, increase the -Xmx parameter in fe.conf (e.g., set to 16G or 32G depending on metadata size).
* Restart FE: If the FE is stuck in a "Stop-the-World" GC loop, restart the process. In a High Availability (HA) setup, the Follower will take over as Leader.
4. Optimization:
* Metadata Management: If memory is consumed by metadata, consider cleaning up old partitions or reducing the number of tablets.
* Offload Checkpoints: Ensure image_checkpoint_offload_to_follower = true is enabled to prevent memory spikes during metadata image creation.
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/alert.md
• knowledge/trouble_shooting/fe_memory_problems.md
• administration/management/BE_configuration.md
ReferencesRocky
06/12/2026, 3:48 PMRumit Jain
06/12/2026, 3:55 PMRocky
06/12/2026, 3:55 PMstarrocks_fe_jvm_heap_size_bytes, it is likely because you are using a version (such as v3.3+ or v3.5+) that has moved toward more granular internal memory tracking, or you are looking for the metric name without the StarRocks-specific prefix.
1. Alert Expressions (PromQL)
Frontend (FE) Memory Alert
If you only have starrocks_fe_memory_usage, this metric typically tracks memory allocated to internal FE modules (like metadata or query parsing). Since it doesn't always provide a "max" value, you should sum the usage and alert against a fixed threshold based on your FE heap configuration (-Xmx).
* Option A: Using starrocks_fe_memory_usage (Internal Modules)
promql
# Alert if FE internal memory exceeds 12GB (Adjust 12884901888 to your Xmx * 0.8)
sum(starrocks_fe_memory_usage) by (instance) > 12884901888
* Option B: Standard JVM Metric (Recommended)
If starrocks_fe_jvm_heap_size_bytes is missing, check if your Prometheus is scraping the standard Java metrics instead:
promql
# Alert if JVM Heap used > 80% of Max
jvm_memory_bytes_used{area="heap"} / jvm_memory_bytes_max{area="heap"} > 0.8
Compute Node (CN) Memory Alert
CNs use the same core metrics as Backends (BE). Use the process-level metric:
promql
# Alert if CN process memory > 90% of limit
(starrocks_be_process_mem_bytes / starrocks_be_mem_limit_bytes) * 100 > 90
──────────
2. Runbook: StarRocks FE Memory High
When starrocks_fe_memory_usage spikes, you can identify the exact internal cause by looking at the labels:
1. Identify the Hitting Module:
Run this query in your Prometheus/Grafana explorer to see which FE module is consuming memory:
starrocks_fe_memory_usage (look for labels like module="metadata", module="query_pool", or module="load")
2. Module-Specific Actions:
* `module="metadata"`: Your metadata (tablets, partitions, image files) is too large for the current heap. Increase -Xmx in fe.conf or clean up old partitions.
* `module="query_pool"`: Too many concurrent or complex queries. Check SHOW PROCESSLIST and kill long-running queries.
* `module="load"`: High load concurrency or large transaction metadata. Reduce load frequency or increase heap.
3. Check Memory Trackers (v3.3+):
If the metric is high, check the internal tracker in StarRocks:
sql
ADMIN SHOW FRONTEND MEMORY; -- (If supported in your version)
4. Mitigation:
* Restart FE: If memory doesn't drop after killing queries, the FE might be stuck in a Garbage Collection loop. Restart the process to clear the heap.
──────────
3. Runbook: StarRocks CN Memory High
1. Check Query Pool:
CNs primarily use memory for query execution.
sql
SHOW PROC '/current_queries';
Sort by MemoryUsageBytes. Kill queries exceeding your limits.
2. Mitigation:
* Scale Out: Add more CN nodes. They are stateless and will immediately begin sharing the query load.
* Spill to Disk: If memory is consistently high due to large joins, ensure enable_spill = true is set in your session or resource group.
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• faq/fe_mem_faq.md
• knowledge/trouble_shooting/fe_memory_problems.md
References
• sql-reference/information_schema/fe_metrics.md
• administration/management/monitoring/metrics.mdRocky
06/12/2026, 3:55 PMRumit Jain
06/12/2026, 4:31 PMRocky
06/12/2026, 4:31 PM-Xmx). When the heap reaches this level, the Java process typically enters a Full GC loop, causing significant latency, connection timeouts, or an automated restart (crash).
──────────
Runbook: StarRocksFEJVMHeapUsageCritical
1. Symptoms
* High Query Latency: SQL queries take much longer to plan or return results.
* Connection Timeouts: Clients receive "Lost connection to MySQL server" or cannot connect at all.
* Leader Election: If the Leader FE hangs due to Full GC, it may lose its heartbeat, causing a new Leader to be elected. Logs will show transfer FE type from LEADER to UNKNOWN.
* Logs: Frequent "Full GC" messages in fe.gc.log (if enabled) or fe.out.
2. Quick Diagnostics (The "5-Minute" Check)
1. Check JVM Stats:
Run this on the FE host to see the heap breakdown (Old Gen is usually the culprit):
bash
# View GC stats every 1 second
jstat -gcutil <fe_pid> 1000
Look at the O column (Old Generation). If it is consistently >95%, the FE is in a Full GC loop.
2. Check for Heavy Queries:
If you can still connect via MySQL client:
sql
SHOW PROCESSLIST; -- Look for many long-running queries or complex joins
3. Check Logs for Crashes:
bash
grep -i "OutOfMemoryError" fe/log/fe.log
3. Root Cause Analysis (RCA)
Depending on your StarRocks version, use the following tools:
* Memory Profiles (v3.3.6+):
Check fe/log/proc_profile/. StarRocks automatically generates .tgz flame graphs. Look for the widest frames to see which module (e.g., QueryPool, Metadata) is consuming memory.
* Memory Usage Tracker (v3.3.7+):
Check fe/log/fe.log for "Memory Usage Tracker" logs. These record the memory footprint of internal modules like metadata, loads, and query parsing.
* Metadata Size:
Check the number of tablets. Large metadata (millions of tablets) requires a larger heap.
sql
SHOW PROC '/statistic';
* Lightweight Object Histogram:
bash
jmap -histo:live <fe_pid> | head -n 20
Caution: Running jmap -dump is heavy and may crash a struggling FE; only do it if the node is already out of the rotation.
4. Mitigation Steps
Immediate (Emergency):
1. Restart the FE: Restarting is the fastest way to clear the heap. In an HA setup, the cluster will remain available as a Follower takes over.
2. Kill Heavy Queries: If a specific query is causing a surge, identify its ID from SHOW PROCESSLIST and run KILL QUERY <id>;.
3. Increase Heap Size: If the physical machine has spare RAM, increase -Xmx and -Xms in fe/conf/fe.conf.
_ _Recommendation:* Set -Xmx and -Xms to the same value (e.g., JAVA_OPTS="-Xmx32g -Xms32g").
Short Term:
1. Offload Checkpoints: If memory spikes during metadata saving, ensure image_checkpoint_offload_to_follower = true (v3.4+) is enabled in fe.conf.
2. Clean Up Metadata: Drop unused tables or shorten the retention of TTL/Partitioned tables to reduce the number of tablets.
5. Prevention & Long-Term Tuning
* Standardize Heap Sizes:
* < 1M tablets: 16GB
* 1M–2M tablets: 32GB
* 2M–5M tablets: 64GB
* Resource Groups: Use Resource Groups to limit the number of concurrent complex queries that can hit the FE at once.
* GC Tuning: Ensure you are using G1GC (default in recent versions) for better large-heap management.
References
• administration/management/monitoring/alert.md
• faq/fe_mem_faq.md
• knowledge/trouble_shooting/fe_memory_problems.md
• administration/Meta_recovery.mdRocky
06/12/2026, 4:31 PMRumit Jain
06/12/2026, 4:48 PMRocky
06/12/2026, 4:48 PMpromql
# Alert when Data Cache disk usage exceeds 90% of quota
starrocks_be_block_cache_disk_used_rate > 90
B. Cache Health / Write Failure Alert (Critical)
This is the more important alert for "Disk" issues. If the cache cannot write to the disk, it usually means the physical disk is full, the filesystem is read-only, or the disk is failing.
promql
# Alert if there are any failed writes to the data cache in the last 5 minutes
increase(starrocks_be_block_cache_write_fail_count[5m]) > 0
──────────
2. Runbook: StarrocksCNDataCacheDisk
Symptoms:
* StarrocksCNDataCacheDisk alert firing.
* Query performance degradation (queries hitting remote storage like S3/HDFS instead of local cache).
* High starrocks_be_block_cache_write_fail_count.
Diagnostic Steps:
1. Check Cache Status:
Verify if the cache instance is abnormal.
sql
-- Check metrics for status
starrocks_be_block_cache_status
-- 1 = NORMAL, 0 = ABNORMAL, 2 = UPDATING
2. Verify Physical Disk Space:
The Data Cache quota (set by datacache_disk_size) might be smaller than the actual disk, but if other processes (like logs) are filling the same disk, the cache will fail to write.
bash
df -h # Check the mount point used for data_cache_path
3. Inspect Logs:
Search for IO or Block Cache errors in the CN logs.
bash
grep -E "Cache|IO|Disk" cn/log/be.INFO | tail -n 100
Mitigation:
1. If Capacity is the Issue:
* If your queries are slow due to low hit rates and high usage, increase the datacache_disk_size in cn.conf (requires restart) or via ADMIN SET FRONTEND CONFIG if applicable.
* Add more CN nodes to increase the aggregate cache capacity of the cluster.
2. If Disk is Full (Physical):
* Clean up old logs in cn/log/.
* Check if other applications are sharing the same disk volume.
3. If Health is Abnormal:
* Check for hardware failures (dmesg).
* Restart the CN process to re-initialize the Block Cache instance.
References
• data_source/data_cache_observe.md
• using_starrocks/caching/block_cache.md
• administration/management/monitoring/metrics.md
• administration/management/BE_configuration.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• data_source/data_cache_observe.mdRumit Jain
06/12/2026, 4:50 PMRocky
06/12/2026, 4:51 PMblock_cache* to datacache*.
Alert Expression:
promql
# Alert when Data Cache disk usage exceeds 90%
(datacache_disk_used_bytes / datacache_disk_quota_bytes) * 100 > 90
Why the change?
Starting in v4.0, StarRocks unified the in-memory (Page Cache) and disk (Block Cache) into the Data Cache system. Older metrics like block_cache_disk_used_rate may still exist for backward compatibility in some patch versions, but the datacache_ prefix is the new standard.
──────────
2. StarRocks FE JVM Heap Alert (v4.0+)
If you are missing starrocks_fe_jvm_heap_size_bytes, it is because StarRocks now relies on standard JVM collector metrics or the unified starrocks_fe_memory_usage for internal tracking.
Option A: Using Standard JVM Metrics (Recommended)
Prometheus usually scrapes these directly from the FE's JVM exporter. They do not always have the starrocks_fe_ prefix.
promql
# Alert if FE JVM Heap used > 90% of Max
(jvm_memory_bytes_used{area="heap", job="starrocks-fe"} / jvm_memory_bytes_max{area="heap", job="starrocks-fe"}) * 100 > 90
Option B: Using starrocks_fe_memory_usage
If you want to alert specifically on the memory StarRocks' internal modules (Metadata, Query Pool, etc.) are using, use the metric you confirmed is available:
promql
# Alert if the total memory tracked by FE modules exceeds a fixed threshold (e.g., 28GB)
sum(starrocks_fe_memory_usage) by (instance) > 30064771072
──────────
3. Summary of Metric Changes in v4.0.1
Old Metric (Pre-4.0) | New Metric (4.0.1+) | Description
block_cache_disk_used_bytes | datacache_disk_used_bytes | Current disk usage of Data Cache.
block_cache_disk_quota_bytes | datacache_disk_quota_bytes | Total allocated disk for Data Cache.
starrocks_fe_jvm_heap_size_bytes | jvm_memory_bytes_used | Standard JVM heap metric.
(N/A) | starrocks_fe_memory_usage | Granular memory usage per FE module.
Troubleshooting missing metrics:
1. Check Labels: In v4.0, a new is_leader label was added to many FE metrics. Ensure your Prometheus query isn't filtering it out.
2. Verify Endpoint: Visit http://<FE_IP>:8030/metrics or http://<CN_IP>:8040/metrics in your browser to see the raw list of metrics currently being exported by your version. Search for datacache or jvm there to see the exact strings.
References
• administration/management/monitoring/metrics.md
• data_source/data_cache_observe.md
• release_notes/release-4.0.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• administration/management/monitoring/metrics.md
• data_source/data_cache_observe.mdRumit Jain
06/12/2026, 4:52 PMRocky
06/12/2026, 4:52 PMpromql
# Note the potential 'starrocks_be_' prefix added by many exporters
(starrocks_be_datacache_disk_used_bytes / starrocks_be_datacache_disk_quota_bytes) * 100 > 90
If the above is still missing, search for the legacy names (sometimes kept for compatibility):
* starrocks_be_block_cache_disk_used_bytes
* starrocks_be_block_cache_disk_quota_bytes
How to verify the exact name:
Run this command from your terminal to see exactly what your CN is exporting:
bash
curl -s http://<CN_IP>:8040/metrics | grep datacache
_Look for datacache_disk_used_bytes or starcache_disk_used_bytes._
──────────
2. Correct FE JVM Heap Alert (v4.0.1)
In v4.0.1, StarRocks FE metrics have been updated. If starrocks_fe_jvm_heap_size_bytes is missing, it is likely because the exporter is now using the standard JVM metrics format or the unified memory tracker.
Recommended Expression (Standard JVM):
promql
# This is the standard JVM exporter metric name
(jvm_memory_bytes_used{area="heap", job="starrocks-fe"} / jvm_memory_bytes_max{area="heap", job="starrocks-fe"}) * 100 > 90
Alternative (StarRocks internal tracker):
If you prefer to monitor the memory actually tracked by StarRocks' internal components (Metadata, Load, Query):
promql
# Use the sum of tracked memory across FE modules
sum(starrocks_fe_memory_usage) by (instance)
How to verify the exact name:
bash
curl -s http://<FE_IP>:8030/metrics | grep jvm_memory
──────────
Summary Table for v4.0.1
Component | Metric Name in v4.0.1 | Purpose
Data Cache (Disk) | starrocks_be_datacache_disk_used_bytes | Current used disk space.
Data Cache (Quota) | starrocks_be_datacache_disk_quota_bytes | Configured max disk size.
FE JVM Used | jvm_memory_bytes_used{area="heap"} | Actual used heap.
FE JVM Max | jvm_memory_bytes_max{area="heap"} | The -Xmx limit.
Important Note: In v4.0+, ensure Data Cache is actually enabled. If datacache_enable is false in your cn.conf, these metrics will not be exported. You can verify this by running SHOW BACKENDS\G or SHOW COMPUTE NODES\G in your SQL client and checking the DataCacheMetrics field.
References
• administration/management/monitoring/metrics.md
• data_source/data_cache_observe.md
• release_notes/release-4.0.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• administration/management/monitoring/metrics.md
• data_source/data_cache_observe.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• administration/management/monitoring/metrics.md
• data_source/data_cache_observe.mdRumit Jain
06/13/2026, 2:25 AMRocky
06/13/2026, 2:25 AMpromql
(starrocks_be_process_mem_bytes / starrocks_be_mem_limit_bytes) * 100 > 90
* Threshold: 90%
* Evaluation Period: 1m to 3m (to avoid alerting on brief spikes).
Option B: Kubernetes Container Metrics
If you prefer standard Kubernetes monitoring (using cAdvisor), use this expression. It compares the Pod's working set memory to the resource limit you set in your YAML.
* Alert Expression:
promql
(container_memory_working_set_bytes{container="cn"} / kube_pod_container_resource_limits{resource="memory", container="cn"}) * 100 > 90
──────────
2. Recommended Thresholds & Behavior
In StarRocks, the memory behavior is governed by the mem_limit configuration (defaulting to 90% of the total available memory):
Threshold | Severity | StarRocks Behavior
80% | Warning | Soft Limit: StarRocks will start to trigger minor GC and may restrict new memory-intensive tasks.
90% | Critical | Hard Limit: StarRocks will begin killing the most memory-intensive queries to prevent a process OOM (Out of Memory).
95%| Emergency | OOM Risk: High risk that the Linux OOM killer will terminate the entire Pod. ────────── 3. Troubleshooting "Missing Metrics" If you cannot find these metrics in Prometheus, verify the exact names being exported by your CN version: 1. Check the CN metrics endpoint directly:
bash
kubectl exec -it <cn-pod-name> -- curl -s <http://localhost:8040/metrics> | grep process_mem
2. Common Name Variations:
* Depending on your Prometheus scrape config, the prefix might be different. Look for process_mem_bytes or starrocks_be_process_mem_bytes.
* If starrocks_be_mem_limit_bytes is missing, you can substitute it with the hardcoded byte value of your Pod's memory limit.
4. What to do when this alert fires
1. Check for slow/heavy queries: Run SHOW PROC '/current_queries' to see if a single query is consuming excessive memory.
2. Check Resource Groups: Ensure you have resource isolation configured to prevent one user from exhausting all CN memory.
3. Horizontal Scaling: If memory is consistently high across all CNs, add more CN nodes to the cluster.
4. Vertical Scaling: Increase the resources.limits.memory in your StarRocks CN Pod specification.
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/resource_management/Memory_management.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/alert.md
• administration/management/BE_configuration.md
References
• administration/management/monitoring/metrics.mdRocky
06/13/2026, 2:25 AMRumit Jain
06/13/2026, 2:54 AMRocky
06/13/2026, 2:54 AMStarrocksFELogWriteLatency (commonly labeled in Grafana dashboards) refers to the time it takes for the StarRocks FE Leader to write metadata changes to the Edit Log (Journal). In StarRocks, this is handled by Berkeley DB (BDB JE).
In version 4.0.1, the specific Prometheus metric tracking this is usually starrocks_fe_txn_write_latency_ms, which measures the "write" phase of transactions (the duration from preparation to commit in the journal).
1. Alert Expression
You should alert on the P99 (99th percentile) latency to capture outliers where metadata writes are stalling.
PromQL Expression:
promql
# Alert if the 99th percentile of FE write latency exceeds 2000ms
starrocks_fe_txn_write_latency_ms{quantile="0.99", is_leader="true"} > 2000
Note: This metric is only reported by the Leader FE node.
──────────
2. Recommended Threshold
* Warning: > 1000ms (1 second) for 3 minutes.
* Critical: > 2000ms (2 seconds) for 1 minute.
Why 2000ms? StarRocks has a built-in configuration edit_log_write_slow_log_threshold_ms which defaults to 2000ms. When writes exceed this limit, the FE will start emitting WARN logs about slow journal writes.
──────────
3. Runbook: High FE Log Write Latency
If this alert fires, it indicates that the FE is struggling to persist metadata, which will slow down all DDL operations (CREATE/DROP) and all data loading tasks.
Step 1: Check Disk I/O on FE Leader
The Edit Log is persisted to disk on the FE node.
• Check Disk Latency: Use iostat -x 1 or check your node exporter metrics for high disk utilization or wait times on the metadata partition.
• Verification: Ensure the metadata directory is not on a slow or saturated disk (e.g., network-attached storage with high latency). SSD is highly recommended for FE metadata.
Step 2: Check Network Latency (Leader to Followers)
StarRocks uses BDB replication. The Leader must wait for a majority of Follwer FEs to acknowledge the write.
• Check Connectivity: Check the network latency between the FE Leader and Follower nodes.
• Resolution: If one Follower is extremely slow or flapping, it can delay the Leader. Consider restarting a problematic Follower.
Step 3: Analyze FE Logs
Search the fe.log on the Leader node for "slow" write warnings:
bash
grep "edit log write slow" fe.log
This log entry will often include the batch size and the actual duration, helping you determine if the slow writes are due to a massive metadata burst or a hardware stall.
Step 4: Check JVM Garbage Collection
High write latency can be caused by the JVM "stopping the world" for a Major GC.
• Metric: jvm_gc_collection_seconds_sum (standard JVM metric).
• Resolution: If GC pauses are frequent, increase the FE heap size (-Xmx) in fe.conf.
Step 5: Check Metadata Log Count
If the FE is not performing checkpoints, the BDB log files can grow excessively large, slowing down writes.
• Metric: starrocks_fe_meta_log_count
• Resolution: If this value is > 100,000, the checkpoint process may be failing. Verify the image generation in the logs.
References
• administration/management/monitoring/metrics.md
• administration/management/FE_configuration.md
• administration/management/monitoring/alert.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• administration/management/monitoring/metrics.md
• administration/management/FE_configuration.mdRumit Jain
06/15/2026, 6:24 AMRocky
06/15/2026, 6:25 AMSELECT query:
* The Flow: CNs process the data and send the final result rows to the FE node that is handling the client's MySQL/HTTP connection. The FE then sends this data to the client.
* Cost Impact: For queries that return large amounts of data (e.g., SELECT * on large tables or large exports), the data transfer from CN to FE can be substantial. If the FE and the CN holding the "Result Sink" fragment are in different AZs, you are billed for this transfer.
2. Query Plan Distribution & Fragment Scheduling
* The Flow: For every query, the FE generates a physical execution plan and distributes "fragments" (tasks) to the CNs via RPC (Remote Procedure Call).
* Cost Impact: Generally low. These are serialized metadata structures and small control messages. However, in extremely high-concurrency environments with thousands of small queries per second, this "chatter" can add up.
3. Data Loading (Stream Load & Routine Load)
* Stream Load (Redirection): Typically, a client connects to the FE to start a Stream Load. The FE redirects the client to a CN. The actual data then flows Client -> CN. In this case, the data does not pass between FE and CN.
* Stream Load (Proxy Mode): If you use an FE Proxy or a specific LoadBalancer setup where the FE proxies the data to the CN, the entire load volume flows FE -> CN. This would be a major cost driver.
* Routine Load (Kafka): The FE schedules tasks, but the CNs pull data directly from Kafka. The transfer between FE and CN is limited to task instructions and status reports (low impact).
4. Metadata and Heartbeats
* The Flow: FEs send heartbeats to CNs to monitor their health and resource usage (CPU/Memory/Disk Cache status). CNs report their state back to the FE.
* Cost Impact: Negligible. These are very small packets sent at regular intervals (default every 5 seconds).
5. Shared-Data Cache Management
In a shared-data (CN-based) architecture:
* The Flow: While CNs pull actual data from S3 (which is free within the same region), the FE manages the metadata about which data is cached on which CN.
* Cost Impact: Low. The metadata updates regarding cache hits/misses or "warm-up" commands are small control signals.
──────────
Summary of AWS Data Transfer Cost Sources
Data Flow | Direction | Volume | Cost Concern
Query Results | CN → FE | High | High (for large result sets)
Shuffle/Join | CN ↔️ CN | Very High | Highest (Inter-node data redistribution)
Query Plans | FE → CN | Low | Low
Stream Load | Client → CN | High | Low (Direct to CN, no FE-CN hop)
Heartbeats | FE ↔️ CN | Minimal | Negligible
How to Reduce Costs
1. AZ Affinity: Use Kubernetes Node Affinity or Topology Spread Constraints to keep your StarRocks cluster within a single AZ if your workload is highly sensitive to data transfer costs. Note that this reduces high availability.
2. Proximity Scheduling: Try to ensure the FE and the CNs are in the same AZ. In AWS EKS, you can use topologyKey: <http://topology.kubernetes.io/zone|topology.kubernetes.io/zone> to manage this.
3. Result Set Management: Avoid fetching massive result sets to the client (e.g., use INSERT INTO SELECT or export to S3 directly from the CNs/BEs using SELECT INTO OUTFILE).
References
• introduction/Architecture.md
• quick_start/shared-data.mdRocky
06/15/2026, 6:25 AMRocky
06/15/2026, 6:30 AM/metrics endpoint on the FE (port 8030) and the CN (port 8040).
* Cost Impact: The metrics payload in StarRocks is quite large (it includes hundreds of counters). If your Prometheus server is in a different AZ than your pods, this can generate significant "hidden" transfer costs.
4. FE Metadata Synchronization (BDB JE)
If you have multiple FE pods (e.g., 3 FEs for High Availability):
* The Flow: The FE Leader writes metadata changes (like creating that one database and table) to an "Edit Log." The Follower FEs must download these logs to stay in sync.
* Cost Impact: This traffic happens between FE pods, but it is often grouped under the same "Internal Data Transfer" line item in AWS billing.
5. Kubernetes Liveness/Readiness Probes
Kubernetes itself is constantly "pinging" your pods:
* The Flow: The Kubelet on each worker node calls the health check endpoints of the FE and CN pods.
* Cost Impact: Minimal, unless your K8s Control Plane or worker nodes are highly distributed across AZs.
──────────
How to Verify the Traffic
You can see exactly how much data is being transferred by looking at the internal reports:
1. Check Heartbeat/Report Status:
sql
SHOW PROC '/compute_nodes';
Look at the LastHeartbeat and Status columns to see the frequency of check-ins.
2. Inspect Metrics Payload:
Run this from your local machine to see the size of the data being "scraped":
bash
curl -I http://<CN_IP>:8040/metrics
Recommendations to Lower "Idle" Costs
* AZ Alignment: Ensure your FE and CN pods are scheduled in the same Availability Zone if you do not strictly require cross-AZ redundancy for testing. You can use Kubernetes nodeSelector or Affinity to achieve this.
* Single-Node FE: For a test environment, use only one FE to eliminate the metadata synchronization traffic between FE followers.
* Reduce Scraping Frequency: If you use Prometheus, increase the scrape interval from 15s to 60s for the test cluster.
References
• administration/management/monitoring/metrics.md
• introduction/Architecture.mdRocky
06/15/2026, 6:30 AMRumit Jain
06/15/2026, 6:36 AMRocky
06/15/2026, 6:36 AM"Error on ingesting samples with different value but same timestamp") typically occurs when the same StarRocks FE metric is being scraped twice by Prometheus at nearly the same time, or when the /metrics endpoint itself is outputting duplicate lines for a single metric.
In your Kubernetes environment, this is almost certainly caused by Double Scraping.
1. The Cause: Double Scraping
When you deploy StarRocks via Helm or the Operator, it often creates a ServiceMonitor (as seen in your error: scrape_pool=serviceMonitor/...).
If you also have Pod Annotations enabled (e.g., <http://prometheus.io/scrape|prometheus.io/scrape>: "true"), your Prometheus server might be trying to scrape the FE through two different "jobs":
1. Job A: Discovered via the ServiceMonitor (Targeting the Service IP/Port).
2. Job B: Discovered via Kubernetes Pod Discovery (Targeting the Pod IP/Port).
Because both jobs might result in the same set of labels after relabeling, Prometheus tries to save two different values for the exact same timestamp, causing the conflict.
2. How to Fix
You should use only one method to scrape metrics. Since your error log shows the ServiceMonitor is already working, you should disable the pod-annotation-based scraping.
Option A: Remove Annotations from StarRocks FE
Check your StarRocks Cluster YAML (or Helm values). If you have the following annotations, remove them:
yaml
# Remove these from your FE pod template spec
annotations:
<http://prometheus.io/scrape|prometheus.io/scrape>: "true"
<http://prometheus.io/path|prometheus.io/path>: "/metrics"
<http://prometheus.io/port|prometheus.io/port>: "8030"
If you are using the StarRocks Operator, ensure starrocksFeSpec.annotations does not contain these.
Option B: Disable the ServiceMonitor
If you prefer using pod annotations for all your apps, you can disable the ServiceMonitor in your Helm `values.yaml`:
yaml
starrocks-cluster:
starrocksFeSpec:
serviceMonitor:
enabled: false
3. Check for Duplicate Lines in the Source
If you are not double-scraping, there may be a bug where the FE outputs the same metric twice in one scrape (sometimes seen with Materialized View metrics).
You can verify this by manually calling the metrics endpoint from a pod within the cluster:
bash
curl <http://10.176.120.31:8030/metrics> | grep "metric_name_from_prometheus_error"
If you see the exact same metric name and label combination twice in that output, it is a known issue in some versions (specifically related to with_materialized_view_metrics). However, since your cluster is empty, Double Scraping (Section 1) is the 99% likely culprit.
Summary Recommendation
Check your FE pod description (kubectl describe pod <fe-pod-name>). If you see <http://prometheus.io/scrape|prometheus.io/scrape>: true in the annotations AND you have a ServiceMonitor running, remove the annotations. The annotations*. The "different value but same timestamp" error is simply Prometheus telling you it is being asked to do the same work twice.* Remove the annotations to resolve the conflict.
References
• administration/management/FE_configuration.md
• faq/Deploy_faq.md
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.mdRumit Jain
06/15/2026, 6:48 AMRocky
06/15/2026, 6:49 AM"Error on ingesting samples with different value but same timestamp" specifically for target=...:8030/metrics means that the StarRocks FE is returning the exact same metric and labels twice in a single response.
Why this is happening
This is a known behavior (and sometimes a bug) in certain StarRocks versions where the /metrics endpoint accidentally duplicates lines. Common triggers include:
1. Duplicate labels: If you have two internal components (like two Resource Groups or two internal Materialized Views) with the same name, StarRocks may export two lines for the same metric.
2. Version-specific Bug: There is a recorded issue (e.g., in v3.2.x) where the FE exports duplicate metrics, particularly when metrics related to Materialized Views or Query Resource Groups are enabled.
3. Redundant Scraping: You have a ServiceMonitor (as shown in your scrape_pool) targeting port 8030. If you also have another scrape job (like a static config or another ServiceMonitor) hitting the same pod IP, Prometheus will see two "targets" for the same metrics and try to merge them, causing this error.
How this contributes to your AWS Cost
Since you mentioned high data transfer costs even before using the cluster:
* Large Metrics Payload: StarRocks FE metrics are verbose. A single scrape can be 1MB to 5MB of plain text.
* High Frequency: If Prometheus scrapes every 15 seconds, and you have multiple FEs, you are transferring gigabytes of text data per month just for monitoring.
* Cross-AZ Scrape: If your Prometheus server is in AZ-a and your StarRocks FE is in AZ-b, you are being charged $0.01 per GB for this traffic.
* The Error Impact: When Prometheus encounters this error, it often "drops" the samples, but the data transfer has already happened and been billed by AWS. You are essentially paying for data that Prometheus is throwing away.
How to Fix & Verify
1. Verify the Duplicates manually:
Run this from a terminal that can reach your pod IP:
bash
curl -s <http://10.176.120.31:8030/metrics> | sort | uniq -d
If this returns any lines, those are the metrics StarRocks is duplicating. If it's empty, then the issue is that Prometheus is scraping the same target twice (check your Prometheus "Targets" page for duplicate entries).
2. Increase Scrape Interval:
If this is a test cluster, increase the scrape interval in your ServiceMonitor to 60s or 120s. This will immediately reduce your data transfer cost by 4x–8x.
3. Address Istio vs. StarRocks Scraping:
Your annotations tell Prometheus to scrape Istio metrics on 15020. Your ServiceMonitor tells it to scrape StarRocks metrics on 8030.
* If you don't need Istio metrics for StarRocks: Remove the <http://prometheus.io/scrape|prometheus.io/scrape>: true annotation from the FE pod. This stops the extra scrape on 15020 and saves cost.
* If you don't need StarRocks metrics yet: Disable the ServiceMonitor in your Helm chart:
yaml
starrocks:
metrics:
serviceMonitor:
enabled: false
4. Check for redundant ServiceMonitors:
Run kubectl get servicemonitor -n <your-namespace>. If you see more than one ServiceMonitor targeting the StarRocks FE, delete the redundant one.
Summary
The cost is coming from Prometheus chatter (heavy metrics scraping) and Internal Heartbeats (FE-CN cross-AZ talk). The error is a side effect of the FE outputting redundant data, which makes the expensive data transfer even more wasteful. For more information, see:
• administration/management/monitoring/metrics.mdRumit Jain
06/16/2026, 3:19 AMRocky
06/16/2026, 3:21 AMlabel_keep_max_num = 150000 is not generally recommended as a starting point, especially for a new cluster on v4.0.1, unless you have a specific technical requirement and have tuned your FE JVM heap accordingly.
In StarRocks, this parameter controls how many load job labels (Stream Load, Broker Load, etc.) the FE keeps in memory and its metadata store.
1. The Trade-off: History vs. Memory
* Default Value: 1000.
* Why people increase it: To avoid the "Label Already Exists" error and to keep a longer history of load job statuses in the information_schema.loads or SHOW LOAD output.
* Memory Impact: Every label stored in the FE consumes JVM Heap memory. While a single label is small (a few KB), storing 150,000 of them creates a large number of long-lived objects. This can lead to:
* Increased FE Heap usage.
* Longer Garbage Collection (GC) pauses.
* Larger Metadata Image files, which slows down FE restart/checkpointing.
2. Is 150,000 necessary for you?
You can calculate the required value based on your ingestion frequency:
* Ingestion every 5 seconds: $(24 \times 60 \times 12) = 17,280$ labels per day.
* Ingestion every 1 second: $86,400$ labels per day.
If you set it to 150,000 and keep labels for the default 3 days (label_keep_max_second = 259200), you are essentially planning for a cluster that handles ~1.7 loads per second, 24/7.
3. Recommendations for v4.0.1 (FE+CN)
Since you are using the Shared-Data (FE+CN) architecture, your FE already has additional metadata responsibilities (managing object storage segments).
1. Start Smaller: Try 20,000 or 50,000 first. This is usually more than enough for most production environments to handle high-frequency stream loading while keeping a few days of history.
2. Check FE Heap: Ensure your FE has a large enough heap (at least 16GB–32GB for high label counts). In v4.0.1, you should be using JDK 17, which helps manage large heaps more efficiently.
3. Coordinate with Retention: If you must increase the number, consider decreasing the retention time (label_keep_max_second). For example, keeping 150,000 labels for only 24 hours is safer than keeping them for 7 days.
4. Monitor Metadata: Keep an eye on your FE's meta/image file size. If it grows into several gigabytes, it’s a sign that your label retention is too high.
Summary
* 10,000 to 20,000: Recommended for most high-frequency loading scenarios.
* 150,000: Only recommended if you are doing sub-second loading across many tables and have allocated 64GB+ of Heap to your FE with active monitoring of GC behavior.
To change it dynamically (without restart):
sql
ADMIN SET FRONTEND CONFIG ("label_keep_max_num" = "20000");
References
• administration/management/FE_configuration.md
• faq/Deploy_faq.md
• administration/management/monitoring/metrics.md
• deployment/plan_cluster.md
• loading/StreamLoad.md
References
• administration/management/FE_configuration.md
• administration/management/resource_management/be_label.md
• administration/management/BE_configuration.mdRocky
06/16/2026, 3:23 AMlabel_keep_max_num = 150000 is generally not recommended unless you have a specific requirement and the FE (Frontend) has significant memory headroom.
Increasing this value from the default of 1,000 to 150,000 can lead to substantial memory consumption and performance degradation on the FE.
1. What this parameter does
label_keep_max_num determines how many finished (FINISHED or CANCELLED) load job records the FE keeps in its memory.
* Purpose: It allows you to query the status of recent load jobs (via SHOW LOAD) and prevents "label already used" errors for a certain period.
* Default: 1,000 records.
2. Why 150,000 is risky
* Memory Overhead: Every load job record is stored in the FE's JVM heap. Keeping 150,000 records in memory can consume several gigabytes of RAM. If your FE heap is not large enough, this can trigger frequent Garbage Collection (GC) pauses, making the cluster sluggish or causing FE crashes.
* Metadata Pressure: StarRocks metadata is replicated across FE nodes. A massive backlog of load labels increases the size of the edit logs and the time it takes for follower FEs to synchronize or for a new FE to start up.
* Search Latency: Commands like SHOW LOAD may become significantly slower as the FE has to iterate through a much larger list of historical jobs.
3. When you might need to increase it
The only common scenario for increasing this (usually to ~5,000 or 10,000, but rarely 150,000) is if you are running extremely frequent, small loads (e.g., Stream Load or Flink jobs every second) and you need to ensure that:
1. Labels don't expire before a Flink checkpoint can verify them.
2. You need a long look-back period for debugging failed jobs.
4. Better Alternatives
If you are worried about losing history, consider these instead of bloating the FE memory:
* Check `label_keep_max_second`: This parameter (default: 3 days) also controls how long labels are kept. If you increase max_num but not max_second, the records might still get deleted based on time.
* External Logging: For long-term auditing, use the FE Audit Log (fe.audit.log) or export StarRocks metrics to Prometheus/Grafana. These methods track job history without burdening the FE's memory.
* Batching: If you are hitting the 1,000 limit quickly, it usually means your load frequency is too high. Try to batch your data so you have fewer, larger load jobs.
Summary
If you decide to proceed with 150,000, ensure your FE has at least 16GB-32GB of heap memory allocated and monitor the Resident Set Size (RSS) and GC activity closely. Start with a smaller increment (e.g., 10,000) and see how the memory reacts before jumping to 150,000.
To change it dynamically:
sql
ADMIN SET FRONTEND CONFIG ("label_keep_max_num" = "10000");
(Remember to also update fe.conf to make it permanent.)
References
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• sql-reference/sql-statements/data-manipulation/SHOW_LOAD.md
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/resource_management/be_label.md
• administration/management/monitoring/metrics.md
• loading/loading_introduction.md
• sql-reference/System_variable.md
• administration/data_migration_tool.mdRocky
06/16/2026, 3:23 AMRocky
06/16/2026, 3:23 AMRocky
06/16/2026, 3:23 AMRocky
06/16/2026, 3:23 AMRocky
06/16/2026, 3:23 AMRocky
06/16/2026, 3:23 AMRocky
06/16/2026, 3:23 AMRocky
06/16/2026, 3:23 AMRocky
06/16/2026, 3:23 AMRumit Jain
06/16/2026, 3:25 AMlabel_keep_max_second and label_keep_max_numRocky
06/16/2026, 3:25 AMlabel_keep_max_second and label_keep_max_num, you can run the following SQL command in your MySQL client:
1. View specific parameters
Use the LIKE clause to filter for these exact parameters:
sql
ADMIN SHOW FRONTEND CONFIG LIKE "%label_keep_max%";
2. View all FE configurations
If you want to see the full list of FE configurations:
sql
ADMIN SHOW FRONTEND CONFIG;
Explanation of the output
When you run these commands, you will see a table with several columns:
* Key: The parameter name.
* Value: The current value active in the FE.
* IsMutable: Indicates if you can change this value dynamically using ADMIN SET CONFIG without restarting the FE.
* MasterOnly: Indicates if the parameter only takes effect on the Leader FE node.
Reminder on Defaults
* label_keep_max_second: Default is 259200 (3 days). This is how long load job history is kept.
* label_keep_max_num: Default is 1000. This is the maximum number of job records kept in memory.
Note: These are FE configuration parameters. If you need to check BE (Backend) parameters, you can query the metadata table:
sql
SELECT * FROM information_schema.be_configs WHERE NAME LIKE "%label%";
References
• sql-reference/information_schema/be_configs.md
• sql-reference/information_schema/fe_metrics.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.mdRumit Jain
06/16/2026, 8:54 AMRocky
06/16/2026, 8:55 AMstarrocks_fe_jvm_heap_stat
* Goal: Keep this below 70-80%. If you see this trend upward after the change, your FE needs more memory (-Xmx).
* Command Line (Real-time):
Run this on your FE node to see the "Old Generation" (O) usage:
bash
jstat -gcutil <FE_PID> 1000 10
If the O column (Old Gen) remains consistently high (>90%) or the FGC (Full GC) count increases rapidly, 50,000 is too high for your current memory allocation.
2. Check Module-Level Memory Usage
Starting from v3.3.7, StarRocks includes a Memory Usage Tracker that prints memory consumption by module in fe.log.
* How to check: Search your fe.log for "MemoryUsageTracker". Look for the LoadManager or StreamLoadMgr entries.
* What to watch: If these modules are consuming several gigabytes of RAM after the increase, it confirms the labels are bloating the heap.
3. Monitor Metadata Health (Edit Logs)
Every load job adds entries to the FE's edit logs. If the FE cannot process these quickly enough due to memory pressure, logs will pile up.
* Prometheus Metric: starrocks_fe_meta_log_count
* Safety Threshold: This should ideally stay below 50,000. If it exceeds 100,000, your FE is failing to perform checkpoints, likely because GC is pausing the process or the metadata is too large to save.
4. Benchmark SHOW LOAD Performance
The SHOW LOAD command iterates through these labels. Increasing the count can make this command slow.
* The Test: Run a broad SHOW LOAD and measure the time:
sql
-- Run this before and after changing the config
SHOW LOAD FROM your_db LIMIT 100;
If this command starts taking seconds to return, it may impact automated monitoring scripts or user experience.
5. Recommended Testing Workflow
Instead of updating fe.conf and restarting, apply the change dynamically first. This allows you to revert immediately if the FE starts struggling.
1. Apply dynamically:
sql
ADMIN SET FRONTEND CONFIG ("label_keep_max_num" = "50000");
2. Observe for 24-48 hours: Watch the starrocks_fe_jvm_heap_stat in Grafana.
3. Check for Full GCs: Look at fe.gc.log. If you see "Full GC" or pauses longer than 1-2 seconds, revert the change.
4. Persist: Only after a successful observation period, add the line to fe.conf to make it survive a restart.
Summary of KPIs
Indicator | Metric/Source | Healthy Target
Heap Usage | starrocks_fe_jvm_heap_stat | < 80%
Old Gen | jstat -gcutil (O column) | Stable (not 99%)
Full GC | fe.gc.log | Zero or very rare
Meta Logs | starrocks_fe_meta_log_count | < 50,000
References
• administration/management/FE_configuration.md
• knowledge/trouble_shooting/fe_memory_problems.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• administration/management/FE_configuration.md
• loading/loading_introduction/loading_considerations.mdRumit Jain
06/16/2026, 8:57 AMADMIN SET FRONTEND CONFIG ("label_keep_max_num" = "50000");Rocky
06/16/2026, 8:57 AMlabel_keep_max_num is a mutable (dynamic) parameter, running the ADMIN SET FRONTEND CONFIG command applies the change to the running FE process instantly.
However, there are two important caveats:
1. It is not permanent: Changes made via ADMIN SET FRONTEND CONFIG are stored in memory. If your pods restart (e.g., due to a node failure, a rolling update, or a manual pod deletion), the value will revert to whatever is in your fe.conf (or your Kubernetes ConfigMap).
2. Making it permanent in Kubernetes: Since you mentioned "pods," you are likely running on Kubernetes. To ensure the value stays at 50,000 after a pod restart, you must also update your StarRocks operator configuration or the fe.conf template in your Helm chart/ConfigMap:
* Operator/Helm: Update the config section of your FE spec.
* Manual: Update the fe.conf file inside the persistent volume (if applicable).
Verification
After running the command, you can verify it took effect by running:
sql
ADMIN SHOW FRONTEND CONFIG LIKE "label_keep_max_num";
Check the Value column to confirm it shows 50000.
References
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SET_CONFIG.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
References
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SET_CONFIG.mdRumit Jain
06/18/2026, 11:16 AMRocky
06/18/2026, 11:16 AMBACKUP SNAPSHOT command to a remote repository (S3, HDFS, or MinIO), follow these steps:
Step 1: Identify the correct snapshot
First, list all available snapshots in your repository to find the timestamps for your N-1 or N-2 backups.
sql
SHOW SNAPSHOT ON your_repository_name;
Look for the Timestamp column. The most recent is N, the one before it is N-1, and so on.
Step 2: Run the Restore command
Use the RESTORE command and specify the exact backup_timestamp you identified.
sql
RESTORE SNAPSHOT your_snapshot_name
FROM your_repository_name
DATABASE your_db_name
PROPERTIES(
"backup_timestamp" = "2024-12-09-10-25-58-842" -- Replace with N-1/N-2 timestamp
);
Note: Since v3.4.0, you can also restore specific tables, UDFs, and views using the ON clause.
Step 3: Monitor progress
Restoration is asynchronous. Monitor it using:
sql
SHOW RESTORE;
──────────
2. Cluster Snapshot (Shared-data clusters v3.4.2+)
If you are using the Shared-data architecture and have enabled AUTOMATED CLUSTER SNAPSHOT, the system handles metadata and data consistency automatically.
Limitation: By default, the automated cluster snapshot feature currently only retains the single latest snapshot.
If you have manually moved older snapshots to different paths in object storage to keep an N-1/N-2 history:
1. Stop the cluster.
2. Edit the fe/conf/cluster_snapshot.yaml file on the Leader FE.
3. Update the cluster_snapshot_path to point to the specific N-1 or N-2 URI in your object storage.
4. Restart the Leader FE with the --cluster_snapshot flag.
5. Clean the metadata directories of other nodes and restart them.
──────────
3. Considerations for Kubernetes ("Pods")
Since you previously mentioned pods, keep these operational details in mind:
* Repository Access: Ensure the new or existing pods have the correct IAM roles or secrets to access the backup bucket.
* Clean Slate: If you are performing a full cluster recovery (Standard), it is often cleaner to restore into a new database or a newly deployed cluster to avoid metadata conflicts with existing tables.
* Persistence: If you restore a database to a running cluster, ensure your fe.conf and be.conf are not overwritten by the restoration process; RESTORE only affects data and metadata, not the physical node configurations.
Summary of Commands
Action | Command
List Backups | SHOW SNAPSHOT ON <repo>;
Restore N-1 | RESTORE SNAPSHOT ... PROPERTIES("backup_timestamp" = "...");
Check Status | SHOW RESTORE;
References
• administration/management/Backup_and_restore.md
• sql-reference/sql-statements/backup_restore/RESTORE.md
• administration/cluster_snapshot.md
• sql-reference/sql-statements/backup_restore/SHOW_SNAPSHOT.md
References
• administration/management/Backup_and_restore.md
• faq/Exporting_faq.md
• sql-reference/sql-statements/backup_restore/RESTORE.mdRumit Jain
06/18/2026, 11:19 AMRocky
06/18/2026, 11:19 AMsql
-- Trigger a manual snapshot
ADMIN CREATE CLUSTER SNAPSHOT manual_snapshot_20250615;
You can then see these in information_schema.cluster_snapshots.
Option B: Manual Directory Archiving
If you want to keep an automated snapshot before it is overwritten:
1. Find the current snapshot path: SELECT storage_path FROM information_schema.cluster_snapshots WHERE snapshot_type = 'automated';
2. Use your cloud provider's CLI (e.g., aws s3 cp or ossutil cp) to copy that entire directory to a backup folder (e.g., /backups/N-1/).
3. To Restore: Point the cluster_snapshot.yaml to this specific backup URI during the FE recovery process.
Summary for v4.0.1 Shared-Data
Feature | Behavior
Standard BACKUP/RESTORE | Not supported for shared-data (FE+CN).
Cluster Snapshot | The primary recovery method for your architecture.
Retention | Automated = Latest only. Manual = Persistent.
Recovery | Requires starting FE with --cluster_snapshot flag.
Important Note: Before restoring from an old snapshot, you must clean the local meta directory on your FEs and the storage_root_path on your CNs to ensure no stale state interferes with the snapshot data being pulled from the snapshot.
References
• administration/cluster_snapshot.md
• administration/management/Backup_and_restore.md
• release_notes/release-4.0.md
References
• administration/cluster_snapshot.md
• administration/management/Backup_and_restore.mdRumit Jain
06/18/2026, 1:01 PMRumit Jain
06/18/2026, 1:01 PMRocky
06/18/2026, 1:01 PMcluster_snapshot_consecutive_failure_count
* Description: The number of consecutive failed automated cluster snapshot jobs since the last successful one.
* Usage: A value greater than 0 indicates a problem (e.g., storage volume misconfiguration or network issues). You should set an alert for when this value remains non-zero.
* cluster_snapshot_last_finished_time
* Description: The timestamp (Epoch time in milliseconds) of the last successfully finished automated cluster snapshot.
* Usage: You can use this to calculate the age of the latest snapshot (time() - cluster_snapshot_last_finished_time/1000). If this duration exceeds your expected interval (default 600s), it suggests snapshots are stuck or not being triggered.
2. SQL Monitoring (Better for Detail)
Since metrics only give you counts and times, use the built-in system views for detailed troubleshooting:
sql
-- Check the status of current and past snapshot jobs
SELECT * FROM information_schema.cluster_snapshot_jobs
ORDER BY created_time DESC;
-- Confirm the latest available snapshot
SELECT * FROM information_schema.cluster_snapshots;
3. Proxy Health: Metadata Checkpoints
Because automated snapshots are triggered immediately after a Metadata Checkpoint succeeds, failure in the checkpoint process will stop snapshots from occurring. Monitor:
* fe_checkpoint_push_per_second: Tracks the frequency of metadata images being generated and pushed.
New in v4.0+
In version 4.0, you can also use a dedicated administrative command to check the schedule and status:
sql
ADMIN SHOW AUTOMATED CLUSTER SNAPSHOT;
Recommendation for Alerts
Set an alert in Grafana/Prometheus for cluster_snapshot_consecutive_failure_count > 0. This is the clearest "red flag" that your disaster recovery point is no longer being updated.
References
• administration/management/monitoring/metrics.md
• administration/cluster_snapshot.md
• release_notes/release-4.0.md
References
• administration/management/monitoring/metrics.md
• administration/cluster_snapshot.mdRumit Jain
06/18/2026, 1:05 PMcluster_snapshot_consecutive_failure_count I am on v 4.0.1 and fe+cnRocky
06/18/2026, 1:05 PMcluster_snapshot_last_finished_time is explicitly mentioned in snippet 1.4.6 as "Epoch time (in milliseconds) of the last finished automated cluster snapshot, or 0 if none has finished."
• The prefix for FE metrics is typically starrocks_fe_.
• I see starrocks_fe_cluster_snapshot_last_finished_time is a likely metric name.
• I don't see cluster_snapshot_consecutive_failure_count in the documentation or snippets. I might have inferred it or it might be internal/new.
• There is a snippet mentioning starrocks_fe_unfinished_backup_job but it says it's 0 for shared-data clusters.
• The cluster_snapshot feature uses a background job.
• Let's re-verify the exact name for failure count if it exists.
• In snippet 1.4.4, it says "Added categorization for Iceberg... Refactored MergeCommitTask... Supports intervals for automated cluster snapshots. #67525".
• In snippet 1.2.9, it mentions "Added a snapshot_meta.json marker file... Added metrics for Iceberg...".
• I'll search for the source code or common FE metrics list to be sure about the "consecutive_failure" metric. It's possible I named it based on common patterns in other StarRocks features (like max_task_consecutive_fail_count).
Wait, the snippet 1.4.6 says:
`cluster_snapshot_last_finished_time`: Epoch time (in milliseconds) of the last finished automated cluster snapshot, or 0 if none has finished.
I will search specifically for "cluster_snapshot" metrics in the StarRocks GitHub repository if possible, or do a broad google search for the specific failure metric name.thought
Okay, I have found strong evidence in snippet 2.4.3:
• `cluster_snapshot_last_finished_time`: Epoch time (in milliseconds) of the last finished automated cluster snapshot, or 0 if none has finished.
• cluster_snapshot_consecutive_failure_count: Number of consecutive failed automated cluster snapshot jobs since the last successful one.
The user says they don't see them. This could be due to:
1. Prefixing: StarRocks FE metrics are usually prefixed with starrocks_fe_. So the user should look for starrocks_fe_cluster_snapshot_consecutive_failure_count.
2. Leader-only: Snapshot jobs are only managed by the Leader FE. If the user is scraping a non-leader FE, these metrics might not appear or might be 0.
3. Feature disabled: If ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON has not been run, the job won't exist and the metrics might not be exposed.
4. Version specifics: The documentation (snippet 2.4.3) clearly lists them for "Shared-data Clusters", and the user is on 4.0.1 (which is shared-data if they use FE+CN).
5. Metrics Scraping configuration: Sometimes specific metrics are hidden unless a parameter like ?with_cluster_snapshot_metrics=true (analogous to materialized views) is needed, although I haven't seen a specific one for snapshots in the docs.
Wait, I should double check if the metric names are exactly starrocks_fe_cluster_snapshot_consecutive_failure_count or just cluster_snapshot_consecutive_failure_count. Most FE metrics follow the starrocks_fe_ pattern.
Let's check if there's any special scraping param for snapshots like there is for materialized views (with_materialized_view_metrics). Snippet 1.4.8 mentions with_materialized_view_metrics.
I will synthesize the answer based on these points. I will also check if there is any mention of with_cluster_snapshot_metrics.It is possible you are looking for the metric name without its mandatory prefix or scraping the wrong node. In StarRocks, Frontend (FE) metrics are typically prefixed with starrocks_fe_.
For StarRocks v4.0.1 on a shared-data (FE+CN) architecture, please verify the following:
1. Correct Metric Names
The exact names as they appear in the Prometheus /metrics endpoint are:
* starrocks_fe_cluster_snapshot_consecutive_failure_count
* starrocks_fe_cluster_snapshot_last_finished_time
2. Check the Leader FERocky
06/18/2026, 1:05 PM0.
* Ensure your Prometheus configuration is scraping all FEs or dynamically discovering the Leader.
3. Verify the Feature is Enabled
These metrics are only populated if the automated snapshot feature is active. You can check the status with:
sql
ADMIN SHOW AUTOMATED CLUSTER SNAPSHOT;
If it is OFF, enable it with:
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON;
4. Alternative: Information Schema
If you still cannot see them in Prometheus, you can verify the status directly in SQL to see if the system is at least recording the data internally:
sql
-- Check for any errors in recent jobs
SELECT * FROM information_schema.cluster_snapshot_jobs
WHERE state = 'ERROR'
ORDER BY created_time DESC;
Why might they be missing?
* Default View: Some StarRocks versions require specific flags to export detailed metrics (similar to how Materialized Views require ?with_materialized_view_metrics=all). However, cluster snapshot metrics are usually part of the standard set.
* Empty State: If a snapshot job has never run (e.g., the cluster was just started and hasn't hit its first 10-minute interval), the metric might not be initialized in the exporter yet.
Recommendation: Try running curl http://<LEADER_FE_IP>:8030/metrics | grep cluster_snapshot directly from your terminal to see if the strings exist in the raw output.
References
• administration/cluster_snapshot.md
• administration/management/monitoring/metrics.md
• release_notes/release-4.0.md
References
• administration/cluster_snapshot.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/metrics-shared-data.mdRumit Jain
06/18/2026, 6:34 PMRocky
06/18/2026, 6:34 PMstarrocks_fe_query_resource_group_err counts the number of queries within a specific resource group that failed or were terminated. If this value is continuously increasing, it indicates that queries assigned to that group are failing consistently.
Here is what you should check to identify the root cause:
1. Check the fe.audit.log
This is the most direct way to see why queries are failing. Filter for errors and look at the ResourceGroup and ErrorMsg columns:
bash
grep "State=ERR" fe.audit.log | grep "your_resource_group_name"
Common error messages to look for:
* "Exceed memory limit of resource group": The query consumed more memory than the mem_limit defined for the group.
* "Query killed by big query monitor": The query exceeded the big_query_cpu_second_limit, big_query_scan_rows_limit, or big_query_mem_index_limit set for the group.
* "pending timeout": The query waited in the queue longer than the allowed query_queue_pending_timeout_second.
2. Verify Resource Group Limits
Check the definition of the problematic resource group to see if the limits are too restrictive for your workload:
sql
SELECT * FROM information_schema.resource_groups WHERE name = 'your_group_name';
If you see that the mem_limit or cpu_core_limit (if using hard limits) is being hit frequently, you may need to increase them:
sql
ALTER RESOURCE GROUP your_group_name WITH ('mem_limit' = '0.5'); -- Example: increase to 50%
3. Check for Query Queuing
If you have query queues enabled, queries might be failing because the queue is full or they are timing out while waiting. Check these related metrics:
* `starrocks_fe_resource_group_query_queue_timeout`: Increasing values mean queries are timing out in the queue.
* `starrocks_fe_resource_group_query_queue_pending`: If this is high, your cluster is at capacity for that group.
4. Is it the default_wg?
If the name label in Prometheus is default_wg, it means queries that don't match any specific classifier are falling into the default group and failing there. Check your Classifiers to ensure queries are being routed to the intended groups.
5. Backend (BE/CN) Resource Pressure
Since you are on a shared-data architecture (FE+CN), check if the CN nodes are under heavy memory pressure. If a CN node is low on memory, it may proactively kill queries to prevent a crash, which will be logged as an error in the resource group metric.
Summary Checklist
1. Identify the Group: Use the name label in your Prometheus metric to find the specific resource group.
2. Audit Logs: Search fe.audit.log for the specific error string.
3. Big Query Rules: Check if you have set big_query_cpu_second_limit or big_query_scan_rows_limit which are designed to kill "runaway" queries.
References
• administration/management/resource_management/resource_group.md
• administration/management/monitoring/metrics.md
• administration/management/resource_management/query_queues.md
References
• administration/management/resource_management/resource_group.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/metrics-shared-data.md
References
• administration/management/monitoring/metrics.mdRocky
06/18/2026, 6:34 PMRumit Jain
06/20/2026, 1:01 PMRocky
06/20/2026, 1:02 PMstarrocks_fe_thread_pool
* PromSQL:
promql
starrocks_fe_thread_pool{job="$job_name", type!="completed_task_count"} > 3000
* Duration: 1 to 5 minutes (to avoid alerting on very brief spikes).
──────────
Why this happens
1. High Query Concurrency: A sudden surge in user connections or concurrent queries.
2. Complex Queries (UNION ALL): A large number of UNION ALL operations in a single SQL statement can lead to an explosion of execution threads.
3. Slow Metadata Operations: In FE+CN architecture, if the object storage (S3/GCS/OSS) has high latency, the FE threads responsible for fetching file metadata can hang, causing thread accumulation.
4. Thrift Server Backlog: If queries are not being processed fast enough by the CN nodes, the Thrift worker threads on the FE stay occupied longer.
Resolution & Mitigation
If this alert fires, take the following steps:
1. Identify the Source:
Check which queries are running and if any specific user is causing the spike:
sql
SHOW PROCESSLIST;
2. Adjust Query Parallelism:
Lower the pipeline_dop to reduce the number of threads used per query:
sql
SET GLOBAL pipeline_dop = 8;
3. Emergency Buffer:
If you are close to the 4096 limit and need to keep the service alive, you can temporarily increase the max worker threads:
sql
ADMIN SET FRONTEND CONFIG ("thrift_server_max_worker_threads" = "8192");
4. Check JVM Health:
Excessive threads often go hand-in-hand with high JVM Heap usage. Check starrocks_fe_jvm_heap_stat to ensure the FE isn't struggling with Garbage Collection (GC).
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/FE_configuration.md
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/Monitor_and_Alert.mdRumit Jain
06/20/2026, 1:08 PMRocky
06/20/2026, 1:09 PMstarrocks_fe_status == 0
_ _Why:* FE manages metadata and query planning. If all FEs go down, the cluster is inaccessible.
* CN/BE Node Down: starrocks_be_status == 0
_ _Why:* If too many Compute Nodes (CN) go down, query capacity drops and remaining nodes may OOM due to shifted load.
2. Resource Saturation (Warning/Critical)
These metrics predict "Out of Memory" (OOM) crashes or system hangs.
* FE JVM Heap Usage: starrocks_fe_jvm_heap_stat > 80%
_ _Why:* High heap usage leads to frequent Stop-The-World (STW) Garbage Collection, making the FE unresponsive.
* CN/BE Memory Usage: (starrocks_be_memory_allocated_bytes / starrocks_be_query_pool_mem_limit) > 0.9
_ _Why:* CN nodes will start killing queries or may crash if they exceed the process memory limit.
* FE Thread Count: starrocks_fe_thread_pool{type="active_thread_count"} > 3500
_ _Why:* As discussed, the default limit is 4096. Approaching this will prevent new connections.
3. Data & Metadata Health
* Cluster Snapshot Failures: starrocks_fe_cluster_snapshot_consecutive_failure_count > 3
_ _Why:* Specifically for your shared-data architecture, failing snapshots mean you lose your point-in-time recovery safety net.
* Compaction Score: starrocks_be_max_tablet_compaction_score > 1000
_ _Why:* High scores indicate data isn't being merged fast enough. This leads to "Too many versions" errors and slow queries.
* Unhealthy Tablets: starrocks_fe_tablet_committed_backfill_count (or any non-zero count of UNHEALTHY tablets in SHOW PROC '/cluster_balance/tablet_info')
_ _Why:* Indicates data consistency or replication issues.
4. Query & Task Performance
* Query Error Rate: sum(rate(starrocks_fe_query_err[5m])) / sum(rate(starrocks_fe_query_total[5m])) > 0.1
_ _Why:* Alerts you if 10% or more of your queries are failing (e.g., due to the resource_group_err you observed).
* Routine Load Error: starrocks_fe_routine_load_error_count > 0
_ _Why:* If you use Routine Load (Kafka), this indicates the ingestion task has paused or failed due to data format or connection issues.
5. Storage (Infrastructure)
* CN Local Disk Usage: starrocks_be_disks_data_used_capacity / starrocks_be_disks_total_capacity > 0.85
_ _Why:* Even in shared-data, CNs use local disk for Data Cache and Spilling. If the disk fills up, queries will slow down or fail.
Recommendation: How to scrape detailed metrics
Some of these (like table-level or user-specific metrics) are not exported by default. To get the most detail, configure Prometheus to scrape with extra parameters:
yaml
params:
with_table_metrics: ['all']
with_materialized_view_metrics: ['all']
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.mdRocky
06/20/2026, 1:09 PMcount(up{group="fe"}) | < 3 (or < total_nodes)
CN Node Health | node_info{type="be_node_num", state="dead"} | > 1
Metadata Checkpoint | starrocks_fe_meta_log_count | > 100,000
Query Error Rate | rate(starrocks_fe_query_err[5m]) / rate(starrocks_fe_query_total[5m]) | > 10%
* Note on Metadata: In StarRocks, if the FE metadata log count is too high, it indicates the Leader FE cannot perform checkpoints, which risks metadata corruption or long recovery times upon restart.
2. Resource Saturation (Warning/Critical)
These alerts warn you before the system crashes due to Out-of-Memory (OOM) or CPU exhaustion.
Metric | Threshold | Why it matters
FE JVM Heap | > 80% | Prevents FE OOM and long GC pauses that hang queries.
CN Memory Usage | > 90% | CN nodes will kill queries or crash if they hit physical RAM limits.
CN CPU Idle | < 10% | High CPU leads to query latency spikes and heartbeat timeouts.
Local Cache Disk | < 20% (avail) | In FE+CN, CN nodes use local disks for caching. If full, query performance drops significantly.
3. Shared-Data Specific Metrics (Critical for Performance)
Because FE+CN relies on object storage (S3/GCS/OSS), monitoring the I/O layer is vital.
* Object Storage Latency (fslib_s3_single_upload_latency_ms):
* Alert: If the 99th percentile (P99) latency exceeds 500ms-1s (depending on your provider).
* Impact: High latency in object storage directly slows down data loading and table creation.
* Compaction Score (starrocks_be_max_tablet_compaction_score):
* Alert: > 100.
* Impact: If compaction falls behind in shared-data mode, the number of small files grows, causing "Too many versions" errors and slow scans.
* Starlet Cache Hit Ratio (fslib_cache_hit_ratio):
* Watch: If this drops below your baseline (e.g., < 50% for a stable workload).
* Impact: Indicates that the CN local cache is too small or data access patterns have changed, forcing slow remote reads.
4. Application & Load Health (Warning)
* Transaction Failure Rate: rate(starrocks_fe_txn_failed[5m]) > 5%. Indicates issues with Stream Load or Routine Load.
* Connection Limit: starrocks_fe_connection_total > 4000. FE has a default limit of 4096 connections. Approaching this will block new users.
Summary Checklist for Grafana
Ensure your dashboard includes the Shared-data Dashboard and Starlet Dashboard templates provided by StarRocks, which specifically visualize:
1. S3/Object Storage IOPS and Latency
2. Cache Hit/Miss Rates
3. Metadata Cache performance
Pro-tip: For the most accurate metrics in v4.x, ensure your Prometheus scrape configuration includes params: { with_table_metrics: ["all"] } if you need to alert on specific table-level hotspots.
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics-shared-data.md
• administration/management/compaction.md
References
• knowledge/admin_and_operation/shared_data_compaction.mdRumit Jain
06/20/2026, 1:10 PMRocky
06/20/2026, 1:10 PMstarrocks_fe_query_latency_ms (especially around 10–20ms) when no users are active is common. This happens because "idle" does not mean "zero queries" in a Kubernetes-managed StarRocks cluster.
Here are the primary reasons why this metric shows 12ms:
1. Internal Health Checks (SQL Probes)
If you are using the kube-starrocks operator or the official Helm chart, the system often performs periodic health checks to ensure the database is actually responsive, not just that the process is running.
* The Operator: The StarRocks Operator frequently runs lightweight SQL commands (like SELECT 1, SHOW FRONTEND, or SHOW BACKEND) to monitor the state of the cluster and manage its lifecycle.
* Monitoring Agents: If you have an exporter (like a Sidecar or a Prometheus agent) or a liveness/readiness probe configured to execute a script, it likely runs a simple SQL query every 5–30 seconds.
* Latency: A simple SELECT 1 typically takes 10–15ms to parse, plan, and execute, which matches your observed 12ms.
2. Prometheus "Summary" Metric Behavior
The metric starrocks_fe_query_latency_ms is a Summary type.
* Summaries calculate quantiles (like 0.95) over a sliding time window (usually the last 10 minutes).
* If you ran a query 5 minutes ago and then stopped, the P95 value will remain on your dashboard until that 10-minute window expires or until new queries are recorded to "push" the old data out.
3. Frontend (FE) Background Tasks
StarRocks FEs perform several internal background tasks that might be recorded as query activity depending on the version:
* Metadata Synchronization: Follower FEs constantly communicate with the Leader FE to synchronize image logs and edit logs.
* Resource Group Monitoring: In newer versions (v3.1+), FEs report query statistics to the Leader to manage resource group concurrency.
How to verify what is running
To see exactly what queries are contributing to that 12ms latency, run the following command in a MySQL client:
sql
-- This will show currently running queries
SHOW PROC '/current_queries';
-- This will show the last 100 queries executed (if audit plugin is enabled)
-- Look for the 'User' column; internal checks often come from 'root' or a dedicated 'admin' user
SELECT * FROM information_schema.audit_log ORDER BY query_start_time DESC LIMIT 10;
Recommendation
If the value is stable at 12ms and you see no user queries in the audit_log, this is normal behavior. It indicates that your cluster is healthy and responding quickly to internal management probes. You should only be concerned if this value spikes (e.g., > 500ms) or if the starrocks_fe_query_err metric begins to increase.
References
• administration/management/monitoring/metrics.mdRumit Jain
06/20/2026, 1:17 PMRocky
06/20/2026, 1:17 PMstarrocks_fe_thread_pool metric, the name label identifies the specific internal Java thread pool being monitored. While there are dozens of these, most are small maintenance or timer pools.
To effectively alert on "Excessive FE Thread Count," you should focus on the total process threads and the specific high-concurrency pools.
1. The Most Critical Pool: thrift-server-pool
The most important value for the name label is typically thrift-server-pool (or in some versions, it might appear as ThriftServer).
* Why: This pool handles all incoming RPC requests and SQL queries from clients.
* Hard Limit: Controlled by the FE config thrift_server_max_worker_threads (default: 4096).
* Critical Alert: If active_thread_num or pool_size for this specific name approaches 4,000, your FE will stop accepting new connections.
2. What the other names mean
The names you see are background workers. Here is what the ones you mentioned do:
Name Label | Function | Criticality
analyze-task-concurrency-pool | Manages ANALYZE TABLE tasks for statistics collection. | High if you have many tables and stats tasks are hanging.
Connect-Scheduler-Check-Timer | Periodic health checks on internal connection state. | Low. Usually only 1–2 threads.
Table-Metrics-Cleaner | Cleans up expired table-level metrics from memory. | Low. Maintenance task.
Metric-Timer-Pool | Collects the very metrics you are looking at in Prometheus. | Low. Internal housekeeping.
3. Recommended Alert Strategy
Instead of alerting on each specific name, use these two patterns:
A. The "Canary" Alert (Total Threads)
Monitor the sum of all threads to ensure the FE process isn't hitting OS or JVM limits.
* PromSQL: sum(starrocks_fe_thread_pool{type="active_thread_num"}) > 3500
* Action: If this fires, the FE is saturated. Check SHOW PROCESSLIST to see if query concurrency is the cause.
B. The "Query Blocked" Alert (Thrift Pool)
Monitor the specific pool that limits user access.
* PromSQL: starrocks_fe_thread_pool{name="thrift-server-pool", type="active_thread_num"} > 3000
* Action: Increase thrift_server_max_worker_threads or investigate slow queries that are holding threads open.
Why you see so many "Timers"
StarRocks uses a "micro-service" architecture inside the FE. Every background task (checking tablet health, cleaning logs, refreshing materialized views, collecting metrics) gets its own named thread pool. This allows developers to prevent a deadlock in one task (like metrics collection) from freezing the entire database. Under normal idle conditions, these pools will show 0 or 1 active.
Summary: Watch thrift-server-pool for query-related issues, and analyze-task-concurrency-pool if you suspect statistics collection is causing overhead.
References
• administration/management/monitoring/metrics.md
• administration/management/FE_configuration.mdRumit Jain
06/20/2026, 1:33 PMthrift_server_max_worker_threads (default: 4096) for all 3 pods of fe?Rocky
06/20/2026, 1:34 PMstarrocks_fe_thread_pool{pod="kube-starrocks-fe-2", ...}
it is showing you the data only for that specific pod.
* If you have 3 FE pods, you will see 3 distinct series in Prometheus.
* To see the total threads across your entire cluster, you would use a sum:
sum(starrocks_fe_thread_pool{type="active_thread_num"})
* To see the highest usage on any single FE (which is what you should alert on), you would use:
max(starrocks_fe_thread_pool{type="active_thread_num"}) by (pod)
2. thrift_server_max_worker_threads is Per-Pod
The limit of 4096 is per FE node, not a global sum for all 3 pods.
* Pod 1: Can handle up to 4096 threads.
* Pod 2: Can handle up to 4096 threads.
* Pod 3: Can handle up to 4096 threads.
* Total Capacity: Your cluster technically has a combined capacity of $4096 \times 3$ threads for handling requests.
Why this matters for your Alerts
Because each FE handles its own connections (usually distributed by a LoadBalancer/Service), one FE pod might be overwhelmed while others are idle.
Recommendation: Set your alert threshold based on the individual pod's capacity.
* Alert Rule: starrocks_fe_thread_pool{name="thrift-server-pool", type="active_thread_num"} > 3500
* Logic: If any single FE pod crosses 3500 threads, send an alert. Do not sum them up for this specific alert, or you might miss a single pod that is about to crash while the "average" across 3 pods looks fine.
References
• administration/management/FE_configuration.md
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.md
References
• administration/management/FE_configuration.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/alert.mdRumit Jain
06/20/2026, 2:29 PMstarrocks_fe_thread_pool{name="thrift-server-pool", type="active_thread_num"} > 3500
How to resolve this if this gets firedRocky
06/20/2026, 2:29 PMstarrocks_fe_thread_pool{name="thrift-server-pool", type="active_thread_num"} > 3500
1. Severity & Impact
* Severity: High / Critical
* Impact: When this pool hits the limit (default 4096), the FE will stop accepting new SQL connections. Existing queries may slow down, and the Kubernetes Readiness probe may fail, causing the pod to be removed from the service or restarted.
──────────
2. Immediate Diagnostic Steps
Run these commands via a MySQL client connected to the cluster:
A. Identify "Who" and "How Many"
Check where the connections are coming from.
sql
-- Count connections by user and host
SELECT USER, HOST, COUNT(*)
FROM information_schema.processlist
GROUP BY USER, HOST
ORDER BY COUNT(*) DESC;
* Action: If a single IP has 1000+ connections, investigate that specific application for connection leaks or missing connection pools.
B. Identify "Slow" or "Complex" Queries
Check what those threads are actually doing.
sql
-- See all currently running queries
SHOW PROC '/current_queries';
-- Or check the processlist for queries with high Time
SELECT * FROM information_schema.processlist
WHERE COMMAND != 'Sleep'
ORDER BY TIME DESC LIMIT 20;
* Action: Look for queries using many UNION ALL statements or queries that have been running for hundreds of seconds.
C. Check for FE Internal Locks
If queries appear "stuck" even if they are simple, the FE might be experiencing lock contention.
* Action: Log into the FE pod and run: jstack -l $(pgrep -f StarRocksFE) > /tmp/fe_jstack.txt
* Action: Search the file for parking to wait for. If hundreds of threads are waiting for the same lock address (e.g., a java.util.concurrent.locks.ReentrantReadWriteLock), the FE is bottlenecked on metadata updates.
──────────
3. Short-Term Mitigation (Emergency)
If the cluster is failing to respond, use these "safety valves":
Option 1: Increase the Thread Limit (Dynamic)
You can increase the limit without restarting the FE.
sql
ADMIN SET FRONTEND CONFIG ("thrift_server_max_worker_threads" = "8192");
Note: Only do this if the FE has spare CPU and Memory.
Option 2: Kill "Zombies" or Long Queries
If you identified a specific user or query causing the spike:
sql
-- Kill a specific query
KILL QUERY <connection_id>;
-- Kill a connection
KILL <connection_id>;
Option 3: Reduce Parallelism
If complex queries are exhausting threads, lower the pipeline degree of parallelism:
sql
SET GLOBAL pipeline_dop = 8; -- Or a lower value than current
──────────
4. Long-Term Resolution
1. Horizontal Scaling: If your active_thread_num is consistently high due to legitimate traffic, add more FE nodes to your Kubernetes deployment.
2. App-Side Pooling: Ensure your applications use a connection pool (like HikariCP or Druid) and that they are not opening/closing connections for every single query.
3. Slow Query Optimization: Use the Audit Loader or Query Profile to identify and optimize the queries that hold threads open the longest.
4. Version Upgrade: Newer versions of StarRocks (v3.x+) have significant improvements in FE locking (Fine-grained locking) that prevent one heavy query from blocking the entire thread pool.
References
• administration/management/monitoring/alert.md
• administration/management/FE_configuration.md
• knowledge/trouble_shooting/fe_deadlock_problems.md
References
• administration/management/FE_configuration.mdRocky
06/20/2026, 2:29 PMRumit Jain
06/20/2026, 2:40 PMRocky
06/20/2026, 2:40 PMprocesslist inside information_schema. Instead, it uses standard MySQL-style SHOW commands and a special PROC system for diagnostics.
Here is the corrected Diagnostic Step 2 for your runbook:
2. Immediate Diagnostic Steps (Corrected)
Run these commands via a MySQL client to identify the cause of the thread spike.
A. List Active Sessions and Connections
This is the closest equivalent to the table you were looking for. It shows which users and hosts are consuming the most threads.
sql
-- View all active connections
SHOW FULL PROCESSLIST;
* What to look for: High values in the Time column (queries running for a long time) or many connections from the same Host.
* Note: If you want to filter this data (since it's not a table), you can usually only do so visually or by piping to a tool like grep if you are using the CLI.
B. Identify Heavy Resource Queries
To see exactly what the threads are doing (CPU, Memory usage, scan rows), use the /proc filesystem:
sql
-- See queries running on the specific FE you are connected to
SHOW PROC '/current_queries';
-- See queries running across ALL FE pods in the cluster
SHOW PROC '/global_current_queries';
* Action: Look for queries with very high ScanRows or MemoryUsage. These are the queries likely "clogging" your thread pool.
C. Check FE Health & Metadata Locks
If the SHOW PROCESSLIST shows many queries in a Pending or Waiting state, the FE might be stuck on a metadata lock.
sql
-- Check the status of all Frontends
SHOW FRONTENDS;
* Action: Ensure all FEs are Alive. if one is false, it might be causing a pile-up of requests on the remaining healthy pods.
Summary of Commands for your Runbook:
Goal | Command
Count connections by User/Host | SHOW FULL PROCESSLIST;
Find long-running queries | SHOW PROC '/global_current_queries';
Kill a problematic thread | KILL <connection_id>;
Kill a specific query ID | KILL QUERY <query_id>;
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROC.md
• administration/management/monitoring/metrics.md
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROC.md
• administration/management/monitoring/metrics.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_RUNNING_QUERIES.md
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROC.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_RUNNING_QUERIES.mdRocky
06/20/2026, 2:40 PMRumit Jain
06/20/2026, 2:50 PMRocky
06/20/2026, 2:50 PMactive_thread_num > 3500), you should follow these steps, ranging from immediate emergency relief to long-term prevention.
1. Emergency Mitigation (Immediate Recovery)
If the cluster is becoming unresponsive, the fastest way to restore service is to increase the capacity or kill the offending load.
* Increase the Thread Limit (No Restart Required):
The default is 4096. You can safely increase this to 8192 if the FE pod has sufficient CPU/Memory.
sql
ADMIN SET FRONTEND CONFIG ("thrift_server_max_worker_threads" = "8192");
* Kill Long-Running Queries:
Identify and terminate queries that have been holding threads for too long.
sql
-- Find connection IDs with high 'Time'
SHOW FULL PROCESSLIST;
-- Terminate the connection
KILL <connection_id>;
2. Tactical Mitigation (Traffic & Query Control)
If the thread spike is caused by specific high-complexity queries (common with many UNION ALL statements), reduce their resource footprint.
* Lower Pipeline Parallelism:
High parallelism can lead to a single query spawning many internal threads. Reducing pipeline_dop helps throttle the thread usage.
sql
-- Default is 0 (auto). Setting it to 8 or lower can stabilize the FE.
SET GLOBAL pipeline_dop = 8;
* Block Heavy Users:
If one specific user/application is flooding the FE, you can temporarily change their resource group or connection limits if you have Resource Groups configured.
3. Diagnostic Mitigation (Identifying Bottlenecks)
If threads are high but queries are not moving, the FE may be experiencing Metadata Lock Contention.
* Analyze Locks:
Run jstack on the FE pod to see if threads are "Waiting on condition" or "parking to wait for" a ReentrantReadWriteLock.
bash
jstack -l <fe_pid> > fe_stack.txt
* Resolution: If you see widespread locking, consider upgrading to v3.x+ which introduces "Fine-grained locking" to allow more concurrent metadata operations.
4. Strategic Mitigation (Prevention)
* Horizontal Scaling: Add more FE pods to your Kubernetes cluster. Since each FE pod has its own thrift_server_max_worker_threads limit, adding a 4th or 5th FE pod increases your total cluster-wide capacity linearly.
* Implement Connection Pooling: Ensure application-side pools (like HikariCP) have a maxPoolSize that, when multiplied by the number of application instances, does not exceed 80% of your total FE thread capacity.
* Audit Loader: Enable the Audit Loader to track which specific SQL patterns or users are consistently responsible for thread spikes to optimize those queries at the source.
References
• administration/management/monitoring/alert.md
• administration/management/FE_configuration.md
• knowledge/trouble_shooting/fe_deadlock_problems.md
References
• administration/management/monitoring/alert.md
• knowledge/trouble_shooting/fe_deadlock_problems.md
• knowledge/trouble_shooting/fe_memory_problems.mdRumit Jain
06/20/2026, 2:54 PMstarrocks_fe_thread_pool{name="thrift-server-pool", type="active_thread_num"} > 3500Rocky
06/20/2026, 2:55 PMfor clause in Prometheus) for this alert depends on your environment's tolerance for noise versus service availability. Because the Thrift thread pool has a hard default limit of 4096, reaching 3500 means you are at 85% capacity and at high risk of the FE refusing new SQL connections.
Recommended Durations
* 1 Minute (Critical/Production): Use this if your FE is the entry point for real-time applications. If threads stay above 3500 for a full minute, it usually indicates a sustained pile-up of queries or a connection leak that won't resolve on its own.
* 3 Minutes (Warning/Standard): This is a balanced setting. It filters out transient spikes caused by a single massive UNION ALL query or a temporary surge in traffic, while still notifying you before the pool completely exhausts.
* 5 Minutes (Maximum): Do not set the duration longer than 5 minutes. If the thread pool is saturated for 5 minutes, your FE is likely already failing health checks or timing out for most users.
Recommended Alert Rule Configuration
yaml
- alert: StarRocksFEThriftPoolHigh
expr: starrocks_fe_thread_pool{name="thrift-server-pool", type="active_thread_num"} > 3500
for: 2m # Recommended middle ground
labels:
severity: warning
annotations:
summary: "FE Thrift Thread Pool near exhaustion on {{ $labels.instance }}"
description: "Active threads ({{ $value }}) are approaching the 4096 limit. FE may stop accepting connections soon."
Why this duration matters:
1. Transient Spikes: StarRocks sometimes spawns many threads for complex metadata operations or very large UNION queries. A short duration (e.g., 15 seconds) might trigger "flapping" alerts that resolve themselves.
2. The "Deadlock" Risk: If the thread count is high due to a metadata lock (catalog lock), the count will typically stay flat at the limit and never drop. A 2-3 minute duration is perfect for catching these "stuck" states without firing for every busy burst.
References
• administration/management/monitoring/alert.md
• administration/management/FE_configuration.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/Monitor_and_Alert.mdRumit Jain
06/20/2026, 4:41 PMstarrocks_fe_cluster_snapshot_consecutive_failure_count > 3
I dont see this metrics in prometheus. There is this one starrocks_fe_unfinished_backup_job.
Are both same?Rocky
06/20/2026, 4:42 PMstarrocks_fe_unfinished_backup_job: This tracks standard Manual Backups (using the BACKUP command). It is primarily used in Shared-Nothing clusters. In Shared-Data clusters, this metric will always be 0.
* starrocks_fe_cluster_snapshot_consecutive_failure_count: This is a specific metric for the Automated Cluster Snapshot feature. This feature snapshots the entire cluster state (metadata + data) into object storage for disaster recovery.
2. Why you don't see the metric
The cluster_snapshot metric only appears if the following conditions are met:
* Version: You are running StarRocks v3.4.2 or later.
* Architecture: You are using a Shared-Data (Cloud-Native) cluster. This feature is not available for Shared-Nothing (local storage) clusters.
* Feature Enabled: The feature must be enabled via:
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON;
3. Which one should you use?
* If you use Shared-Nothing (Standard BEs): Use starrocks_fe_unfinished_backup_job and monitor your BACKUP tasks. You will not have the cluster_snapshot metric.
* If you use Shared-Data (CN nodes): You should look for the cluster_snapshot metrics. If the automated snapshot fails repeatedly, it indicates an issue connecting to your S3/Object storage or an FE checkpointing failure.
Summary Table
Feature | Metric Name | Cluster Type | Version
Manual Backup | starrocks_fe_unfinished_backup_job | Shared-Nothing | All
Cluster Snapshot | starrocks_fe_cluster_snapshot_consecutive_failure_count | Shared-Data | v3.4.2+
If you are on a version earlier than 3.4.2 or on Shared-Nothing, you can safely ignore the cluster snapshot alert and focus on CheckPoint Failure Alerts instead (as snapshots are triggered by successful checkpoints):
promql
-- Alert if metadata log count grows too high, indicating checkpoint failure
starrocks_fe_meta_log_count > 100000
References
• administration/cluster_snapshot.md
• administration/management/monitoring/metrics.md
• administration/management/Backup_and_restore.md
• sql-reference/sql-statements/backup_restore/BACKUP.md
References
• administration/cluster_snapshot.md
• administration/management/monitoring/metrics.md
• administration/management/Backup_and_restore.md
• sql-reference/sql-statements/backup_restore/BACKUP.md
• administration/management/FE_configuration.md
References
• administration/cluster_snapshot.md
• administration/management/monitoring/metrics.mdRumit Jain
06/20/2026, 4:51 PMRocky
06/20/2026, 4:51 PMstarrocks_fe_meta_log_count graph is the expected and healthy behavior of the StarRocks Metadata Checkpoint mechanism.
Here is exactly why it happens:
1. The "Going to High" Phase (Writing Logs)
Every time you perform an action in StarRocks (creating a table, starting a load job, changing a setting), the Leader FE writes this change into a metadata log called the Edit Log (stored in BDBJE).
* As more operations occur, the number of logs increases.
* The starrocks_fe_meta_log_count tracks how many of these log entries exist that have not yet been merged into the permanent metadata image file.
2. The "Drop to 0" Phase (The Checkpoint)
By default, when the log count reaches 50,000 (controlled by the configuration edit_log_roll_num), the FE triggers a Checkpoint:
1. The FE takes the current "Image" file (a snapshot of all metadata) and replays all the new "Edit Logs" onto it.
2. It saves this as a brand-new, up-to-date Image File.
3. Once the new image is successfully saved and synchronized across FEs, the old edit logs are deleted or marked as processed.
4. Consequently, the starrocks_fe_meta_log_count resets to 0 (or a very low number) because those logs are now "baked into" the image.
Why this is important for Monitoring
* Normal Behavior: A sawtooth that peaks around 50,000 and drops frequently.
* Abnormal Behavior: If the graph keeps climbing and exceeds 100,000 without dropping, it means the Checkpoint process is failing.
Common reasons for a failing Checkpoint (no drops):
* Low Disk Space: The FE cannot save the new image file.
* Memory Pressure: The FE doesn't have enough JVM heap to perform the merge.
* Network Issues: The Leader FE cannot synchronize the new image to the Follower FEs.
If you ever see this metric stay high (e.g., >100,000) for a long time, check your Leader fe.log for the keyword Exception when generate new image file.
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/metrics.md
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/alert.md
• administration/management/FE_configuration.md
• administration/Meta_recovery.mdRumit Jain
06/20/2026, 4:54 PMstarrocks_fe_cluster_snapshot_consecutive_failure_count metrics butRocky
06/20/2026, 4:54 PMstarrocks_fe_cluster_snapshot_consecutive_failure_count, it is often because the metric is only initialized in Prometheus after the first failure or successful run occurs, or your StarRocks version might be slightly different.
1. Key Prometheus Metrics
Here are the exact names used in StarRocks (usually prefixed with starrocks_fe_ in Prometheus):
* starrocks_fe_cluster_snapshot_consecutive_failure_count:
* What it tracks: The number of failures since the last successful snapshot.
* Alerting Logic: If this is > 0, it means the last attempt failed. If it is > 3, there is likely a persistent issue with your Storage Volume (S3/GCS/OSS) or FE metadata health.
* starrocks_fe_cluster_snapshot_last_finished_time:
* What it tracks: The timestamp (epoch ms) of the last successful snapshot.
* Alerting Logic: Compare this to the current time. Since snapshots follow the checkpoint cycle (default ~10 mins), if (time() * 1000) - starrocks_fe_cluster_snapshot_last_finished_time > 3600000 (1 hour), your snapshots have stopped running.
2. Check the SQL View (The "Source of Truth")
If you want to verify if snapshots are actually being created without relying on Prometheus, run this SQL command:
sql
SELECT * FROM information_schema.cluster_snapshots;
* This view shows the snapshot_name, created_time, and storage_path.
* If this table is empty, the automated snapshot process has not successfully completed even once.
3. Why you might not see the metric
1. Checkpoint dependency: Automated snapshots are triggered only after a successful metadata checkpoint. If your starrocks_fe_meta_log_count is staying high and not dropping (as we discussed before), no checkpoint is happening, and therefore no snapshot is even being attempted.
2. Version requirement: This feature and its metrics were introduced in v3.4.2. Ensure all FE nodes are on this version or later.
3. Storage Volume issue: If the Storage Volume specified in ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON is misconfigured, the FE may fail to initialize the snapshot task entirely. Check the leader FE's fe.log for any errors containing ClusterSnapshot.
Recommended Alert Rule
Instead of just checking for failures, monitor the "freshness" of the snapshot:
yaml
- alert: StarRocksClusterSnapshotStale
expr: (time() * 1000) - starrocks_fe_cluster_snapshot_last_finished_time > 1800000 # 30 minutes
for: 5m
labels:
severity: warning
annotations:
description: "No cluster snapshot has been successfully created in the last 30 minutes."
References
• administration/cluster_snapshot.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/FE_configuration.md
References
• administration/cluster_snapshot.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.mdRumit Jain
06/20/2026, 4:58 PMRocky
06/20/2026, 4:58 PMbash
# Replace <LEADER_FE_IP> with your actual Leader FE IP
curl -s http://<LEADER_FE_IP>:8030/metrics | grep cluster_snapshot
If you see no output, the Leader FE hasn't initialized the counter yet. This often happens if the snapshot process hasn't encountered its first failure or if the feature was just recently turned on.
2. Recommended Alerting Strategy
Instead of only looking for a failure count, it is best practice to monitor the freshness of the snapshot. If the last_finished_time stops updating, it means snapshots are no longer being created (which is often a silent failure).
Option A: Prometheus Alert (Recommended)
Look for starrocks_fe_cluster_snapshot_last_finished_time. This metric is more reliable than the failure count because it always exists once the first snapshot is successful.
Alert Rule:
yaml
- alert: ClusterSnapshotStale
# Trigger if no snapshot has finished in the last 60 minutes
expr: (time() * 1000) - starrocks_fe_cluster_snapshot_last_finished_time > 3600000
for: 5m
labels:
severity: critical
annotations:
description: "Cluster snapshot is stale. Check FE logs for checkpoint or storage volume errors."
Option B: SQL-Based Monitoring (The Source of Truth)
Since you are on v4.0.1, you have access to information_schema.cluster_snapshot_jobs. This table contains the exact status of every attempt. You can run this to see recent failures:
sql
SELECT *
FROM information_schema.cluster_snapshot_jobs
WHERE state = 'ERROR'
ORDER BY created_time DESC
LIMIT 5;
3. Why metrics might be missing in v4.0.1
1. Leader FE Only: Check only the FE node where SHOW FRONTENDS shows IsMaster as true.
2. is_leader Label: In v4.0, StarRocks added an is_leader="true" label to many FE metrics. Check if your Prometheus query is filtering by node name and accidentally excluding the leader.
3. Checkpoint Dependency: Snapshots only trigger after a Metadata Checkpoint. If your metadata is not checkpointing (check starrocks_fe_meta_log_count), a snapshot will never be attempted, and the metric won't be updated.
Summary of metrics to check:
* `starrocks_fe_cluster_snapshot_consecutive_failure_count`: Increments on failure.
* `starrocks_fe_cluster_snapshot_last_finished_time`: Epoch timestamp of success.
If both are missing from the /metrics endpoint of your Leader FE, check your Leader fe.log for any errors containing the string ClusterSnapshot.
References
• administration/cluster_snapshot.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• data_source/data_cache_observe.mdRumit Jain
06/20/2026, 5:00 PMRocky
06/20/2026, 5:01 PMstarrocks_fe_cluster_snapshot_consecutive_failure_count metric, you need to make the storage destination temporarily unreachable.
Follow these steps carefully:
Step 1: Identify your Storage Volume
First, find out which storage volume is being used for automated snapshots.
sql
-- Check which volume is currently used
SHOW STORAGE VOLUMES;
-- If you don't recall which one was set, you can check the snapshot history
SELECT storage_volume FROM information_schema.cluster_snapshots LIMIT 1;
Step 2: Intentionally "Break" the Volume
Alter the storage volume to point to an invalid endpoint or provide incorrect credentials. For example, if you are using S3:
sql
-- Replace 'my_s3_volume' with your volume name
-- Changing the endpoint to a non-existent URL will cause the snapshot to fail
ALTER STORAGE VOLUME my_s3_volume
SET ("aws.s3.endpoint" = "<http://invalid-dns-name-starrocks-test.com>");
Step 3: Trigger a Checkpoint (The Snapshot Trigger)
Automated snapshots are triggered only after a metadata checkpoint. By default, this happens every 50,000 logs. To force a checkpoint to happen sooner:
1. Reduce the roll threshold (Temporary):
sql
ADMIN SET FRONTEND CONFIG ("edit_log_roll_num" = "10");
2. Generate some metadata activity: Create and drop a few dummy tables to quickly reach the 10-log threshold.
sql
CREATE TABLE dummy_1 (id int); DROP TABLE dummy_1;
CREATE TABLE dummy_2 (id int); DROP TABLE dummy_2;
-- Repeat a few times until a checkpoint is triggered
Step 4: Verify the Failure
Once a checkpoint completes, it will attempt a snapshot and fail.
1. Check the SQL view:
sql
-- Look for jobs with 'ERROR' state
SELECT * FROM information_schema.cluster_snapshot_jobs
ORDER BY created_time DESC;
2. Check the Metrics:
Connect to your Leader FE metrics endpoint:
bash
curl -s http://<LEADER_FE_IP>:8030/metrics | grep cluster_snapshot_consecutive_failure_count
Step 5: REVERT THE CHANGES (Important)
Once you have verified the metric, fix your cluster:
1. Restore the Storage Volume: Use ALTER STORAGE VOLUME to set the correct endpoint/credentials again.
2. Restore the Config:
sql
ADMIN SET FRONTEND CONFIG ("edit_log_roll_num" = "50000");
Why this works
The metric starrocks_fe_cluster_snapshot_consecutive_failure_count is a counter that resets to 0 on success. By breaking the storage link and forcing a metadata checkpoint, you guarantee a failed snapshot attempt, which initializes and increments this metric in Prometheus.
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
References
• administration/cluster_snapshot.md
• sql-reference/sql-statements/cluster-management/storage_volume/ALTER_STORAGE_VOLUME.md
• administration/management/FE_configuration.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.mdRocky
06/20/2026, 5:01 PMRumit Jain
06/20/2026, 5:05 PMRocky
06/20/2026, 5:05 PMstarrocks_fe_object_count{module="Backup", className="BackupHandler", objectName="BackupOrRestoreJob"} tracks the number of traditional Shared-Nothing BACKUP and RESTORE jobs currently residing in the Frontend (FE) memory.
Here is why it is not the metric you are looking for:
1. It belongs to a different feature
This metric is tied to the legacy BACKUP and RESTORE commands used in Shared-Nothing clusters to move data between clusters.
* Module: Backup refers to the traditional backup system.
* ClassName: BackupHandler is the Java class in the StarRocks FE that manages these specific jobs.
* ObjectName: BackupOrRestoreJob represents an individual task instance of that feature.
2. Why it is always 0 for you
You mentioned you are using the FE+CN (Shared-Data) architecture. In Shared-Data mode:
* The traditional BACKUP and RESTORE commands are not supported (because the data already lives in shared storage).
* Since the feature is essentially disabled for your architecture, the BackupHandler will never have any active BackupOrRestoreJob objects, so the value will always stay at 0.
3. Metric for "Automated Cluster Snapshots"
The feature you are using—*Automated Cluster Snapshots*—is a separate mechanism built specifically for Shared-Data clusters. It does not use the BackupHandler class.
To monitor your snapshots, you should ignore the starrocks_fe_object_count and look for these instead:
* starrocks_fe_cluster_snapshot_consecutive_failure_count: Number of failures since the last success.
* starrocks_fe_cluster_snapshot_last_finished_time: Timestamp of the last successful snapshot.
Summary: The metric you found is a "false friend." It tracks a feature you aren't using (and can't use in Shared-Data mode). For your architecture, you must monitor the starrocks_fe_cluster_snapshot_* family of metrics.
References
• administration/management/monitoring/metrics.md
• administration/management/Backup_and_restore.md
• sql-reference/sql-statements/backup_restore/BACKUP.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/backup_restore/RESTORE.mdRumit Jain
06/20/2026, 5:08 PMstarrocks_fe_cluster_snapshot_consecutive_failure_count
* starrocks_fe_cluster_snapshot_last_finished_time
How should I track snapshot failure error and send alert as soon as it fails.Rocky
06/20/2026, 5:09 PMstarrocks_fe_cluster_snapshot_* metrics on your Leader FE's /metrics endpoint, it is likely because the metrics are lazy-initialized. In many StarRocks versions, certain error-specific or feature-specific counters do not appear in the Prometheus output until the first event (success or failure) occurs.
Here is how to track and alert on snapshot failures when the metrics are not showing up.
Method 1: SQL-Based Alerting (Recommended for v4.0.1)
Since you can see data in information_schema.cluster_snapshot_jobs, the most reliable way to alert is to query this table directly. You can use a Prometheus SQL Exporter or a simple cron script to check for failed jobs.
The Query:
sql
SELECT count(*)
FROM information_schema.cluster_snapshot_jobs
WHERE state = 'ERROR'
AND finished_time > NOW() - INTERVAL 10 MINUTE;
If this count is > 0, an alert should be triggered.
Method 2: Force Initializing the Metrics
If you want the metrics to appear in Prometheus so you can use standard PromQL, you can "kickstart" the system to record its first state.
1. Verify Leader Status: Confirm you are hitting the Leader FE. Only the Leader manages snapshots.
sql
SHOW FRONTENDS; -- Look for IsMaster = true
2. Trigger a Manual Snapshot: Running a manual snapshot often initializes the "last finished time" metric.
sql
-- Replace with your storage volume name
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME your_volume_name;
3. Check Metrics Again:
bash
curl -s http://<LEADER_IP>:8030/metrics | grep cluster_snapshot
Method 3: Log-Based Alerting
If the metrics are missing, the FE logs are the source of truth. StarRocks logs snapshot failures in the fe.log. You can use a log collector (like Fluentd, Loki, or Filebeat) to watch for these patterns:
* Error Pattern: Exception when generate new image file
* Error Pattern: FAILED to create cluster snapshot
* Error Pattern: ClusterSnapshotJob.*state=ERROR
Method 4: Monitor the Checkpoint (Indirect Alert)
Automated snapshots are triggered immediately after a Metadata Checkpoint. If snapshots are failing because of metadata issues, the checkpoint itself will likely fail.
Alert on Checkpoint failure:
yaml
# If BDB log count exceeds 100,000, checkpoints are failing.
# Snapshots cannot run if checkpoints fail.
expr: starrocks_fe_meta_log_count{instance="<LEADER_FE>"} > 100000
Why you might not see the metrics in v4.0.1
* Feature Status: Ensure snapshots are actually enabled: SHOW VARIABLES LIKE '%automated_cluster_snapshot%'; or check if information_schema.cluster_snapshot_jobs has recent entries.
* Lazy Export: StarRocks sometimes omits metrics with a value of 0 to keep the /metrics payload small. Once a failure occurs, the consecutive_failure_count will appear.
* Version Note: v4.0.1 refined the snapshot process; if you still don't see them after a manual run, use the SQL-based alerting (Method 1) as it is the most robust "source of truth" in this version.
References
• administration/cluster_snapshot.md
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.md
References
• administration/cluster_snapshot.md
• administration/management/monitoring/metrics.mdRumit Jain
06/25/2026, 4:22 AM2026-06-25 04:21:09.420Z WARN (UNKNOWN kube-starrocks-fe-2.kube-starrocks-fe-search.olymsre01.svc.cluster.local_9010_1781180508475(-1)|1) [GlobalStateMgr.waitForReady():1261] It took too much time for FE to transfer to a stable state(LEADER/FOLLOWER), it maybe caused by one of the following reasons: 1. There are too many BDB logs to replay, because of previous failure of checkpoint(you can check the create time of image file under meta/image dir). 2. Majority voting members(LEADER or FOLLOWER) of the FE cluster haven't started completely. 3. FE node has multiple IPs, you should configure the priority_networks in fe.conf to match the ip record in meta/image/ROLE. And we don't support change the ip of FE node. Ignore this reason if you are using FQDN. 4. The time deviation between FE nodes is greater than 5s, please use ntp or other tools to keep clock synchronized. 5. The configuration of edit_log_port has changed, please reset to the original value. 6. The replayer thread may get stuck, please use jstack to find the details.Rocky
06/25/2026, 4:22 AMIt took too much time for FE to transfer to a stable state(LEADER/FOLLOWER) indicates that your Frontend (FE) node is unable to complete its startup sequence and elect a Leader within the hardcoded timeout period. In a Kubernetes environment, this often leads to a restart loop because the container's Liveness Probe kills the pod before it can finish.
Here are the most likely causes and how to fix them, ordered by frequency in Kubernetes:
1. Liveness Probe is too aggressive (Most Likely)
If you have a large amount of metadata (many BDB logs), the FE may need several minutes to replay them before it becomes "Ready." If your Kubernetes livenessProbe or readinessProbe has a short initialDelaySeconds or failureThreshold, Kubernetes will kill the FE pod while it is still working, causing a loop.
* Check: Run kubectl describe pod <fe-pod-name> and look for "Liveness probe failed."
* Fix: Increase the initialDelaySeconds to at least 300 (5 minutes) or 600 (10 minutes) and increase the failureThreshold in your Helm chart or YAML.
2. IP Mismatch in Kubernetes (If not using FQDN)
If your cluster is not configured to use FQDNs, the FE stores its own IP in the metadata (meta/image/ROLE). In Kubernetes, when a pod restarts, it often gets a new IP. The FE will see its new IP doesn't match the one in its metadata and refuse to start.
* Fix: Ensure you are using FQDN mode (standard for the StarRocks Operator). If you are manual, check if priority_networks is set in fe.conf.
* Verification: Check the fe.log for "IP mismatch" or "Member is not in the group."
3. Too many BDB logs (Checkpoint Failure)
If the previous Leader failed to perform a "checkpoint" (merging edit logs into a new image file), the new FE must replay every single log since the last successful checkpoint. If there are hundreds of thousands of logs, this process is very slow.
* Check: Access the pod's persistent volume (PVC) or exec into the container (if it stays up long enough) and check the size/count of files in your meta/bdb directory and the date of the latest image.xxxx file in meta/image.
* Fix: If the logs are healthy but just numerous, follow Fix #1 (increase probe timeouts). If the logs are corrupted, you may need metadata recovery.
4. Majority of FE nodes are down
An FE cluster needs a quorum (majority) to elect a leader. If you have 3 FEs and 2 are stuck or crashed, the 3rd FE will wait indefinitely in the UNKNOWN state.
* Fix: Ensure all FE pods are attempting to start. If you have lost the majority of your FE nodes and cannot recover them, you may need to force a new election on a single node.
5. Time Desync
If the clocks between your Kubernetes worker nodes differ by more than 5 seconds, the BDB JE (the underlying metadata store) will refuse to synchronize.
* Check: Check the fe.warn.log for exceeds max permissible delta: 5000 ms.
* Fix: Ensure ntp or chrony is running on all Kubernetes nodes.
──────────
Emergency Recovery: Resetting the Election Group
If you are down to a single FE pod and it won't become Leader because it's waiting for "dead" followers that will never return, you can force it to become the Leader:
1. Edit your FE configuration (ConfigMap or fe.conf).
2. Add: bdbje_reset_election_group = true.
3. Restart the FE pod.
4. Important: Once the FE becomes Leader, remove this line immediately from the config and restart it again, or it will cause issues when adding new followers later.
Recommended Next Step
Check your pod logs for the very first error that appears before the "It took too much time" warning. Specifically, look for EnvironmentFailureException or Master not found.
References
• faq/Deploy_faq.md
• faq/operation_maintenance_faq.mdRocky
06/25/2026, 4:22 AMRumit Jain
06/26/2026, 10:24 AM*************************** 115. row ***************************
ServerName: kube-starrocks-fe-0.kube-starrocks-fe-search.plattest03.svc.cluster.local_9010_1773372562608
Id: 16777406
User: sr_dml_user
Host: 10.0.0.0:36016
Db:
Command: Sleep
ConnectionStartTime: 2026-06-26 09:27:50
Time: 3321
State: ERR
Info: SELECT model_name, model_meta_json FROM ABC.model_meta WHERE model_name = 'QWE:LLLLL';
IsPending: false
Warehouse: default_warehouse
CNGroup:
Catalog: NULL
QueryId: NULL
115 rows in set (0.06 sec)Rocky
06/26/2026, 10:24 AMCommand of Sleep but a State of ERR, it means the query has already finished with an error, but the client connection is still open and idle. The QueryId being NULL indicates the failure happened very early at the Frontend (FE) level (e.g., during parsing, analysis, or permission checks) before the query could be assigned a unique ID or dispatched for execution.
Here is how you can find out exactly what went wrong:
1. Check the fe.audit.log (Fastest)
The audit log records the final status of every query, including the specific error message and error code.
* Location: Usually at fe/log/fe.audit.log on your FE pods.
* How to search: Use grep with the query string or the connection ID:
bash
grep "16777406" fe.audit.log | grep "ERR"
# OR search for the table name
grep "model_meta" fe.audit.log | grep "ERR"
Look for the ErrorCode and ErrorMessage columns in that log line.
2. Query the Audit Table (If AuditLoader is installed)
If you have the AuditLoader plugin enabled, you can query the errors directly using SQL:
sql
SELECT timestamp, user, errorCode, errorMsg, stmt
FROM starrocks_audit_db__.starrocks_audit_tbl__
WHERE stmt LIKE '%model_meta%'
AND state = 'ERR'
ORDER BY timestamp DESC
LIMIT 5;
3. Check fe.log or fe.warn.log
Since the QueryId is NULL, the error is likely a Java exception in the FE. Search these logs around the time the query was initiated (2026-06-26 09:27:50):
bash
grep -C 5 "SELECT model_name, model_meta_json FROM ABC.model_meta" fe.warn.log
Look for common issues like:
* Table ABC.model_meta does not exist
* Access denied for user 'sr_dml_user'
* Syntax error (though this query looks syntactically correct).
4. Run the query manually
Because this is a simple SELECT, you can try running it yourself in a MySQL client. Since the failure happens at the analysis phase, it will likely return an immediate error message:
sql
SELECT model_name, model_meta_json FROM ABC.model_meta WHERE model_name = 'QWE:LLLLL';
Common reasons for QueryId: NULL on this specific query:
* Database/Table Missing: The database ABC or table model_meta might not exist in the current catalog.
* Permissions: The user sr_dml_user might not have SELECT privileges on that specific table.
* FQDN/Connectivity: If ABC is an external catalog (like Iceberg or Glue), the FE might have failed to connect to the external metadata store.
References
• administration/management/logs.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• administration/management/audit_loader.md
References
• administration/management/logs.md
• faq/operation_maintenance_faq.md
• administration/management/audit_loader.md
• faq/resource_isolation_faq.mdRumit Jain
06/26/2026, 10:30 AMRocky
06/26/2026, 10:30 AM16777406 is the Connection ID (or Session ID), not the Query ID.
In StarRocks (and MySQL), there is a distinction between the connection and the actual query running on that connection:
1. Connection ID (Id: 16777406)
* This identifies the session between your client (like a Python script, BI tool, or MySQL CLI) and the StarRocks Frontend.
* As long as your client stays connected, this ID remains the same, even if you run 100 different queries.
* You use this ID if you want to kill the connection entirely: KILL CONNECTION 16777406;.
2. Query ID (QueryId: NULL)
* This is a unique UUID generated for each specific execution of a SQL statement (e.g., 5917865c-3965-11ee-8b43-00163e10863a).
* It is used to track the query across multiple Backend (BE) nodes, view its execution profile, or kill just that specific query: KILL QUERY 'query_id_here';.
Why is QueryId NULL in your output?
When you see State: ERR and QueryId: NULL together, it means the query failed at the very beginning of the process in the Frontend (FE).
The FE follows these steps:
1. Receive Request (Connection ID assigned)
2. Parsing & Analysis (Check syntax, check if table ABC.model_meta exists, check if user sr_dml_user has permission).
3. Plan Generation
4. Query ID Assignment (This happens just before execution starts).
Because your QueryId is NULL, the failure happened during Step 2. The system encountered an error (like "Table not found" or "Access denied") before it even assigned a Query ID to the task.
How to find the error message now?
Since there is no Query ID to look up, you must look at the Connection ID in the FE logs:
1. Log into your FE pod.
2. Search the fe.audit.log for that Connection ID:
bash
grep "16777406" fe.audit.log
3. The log entry will show the ErrorCode and the ErrorMsg explaining why it (e.g., Table 'ABC.model_meta' doesn't exist).
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROC.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_RUNNING_QUERIES.md
• using_starrocks/running_queries.mdRumit Jain
06/26/2026, 11:16 AMRocky
06/26/2026, 11:16 AMsql
CREATE DATABASE starrocks_audit_db__;
-- The schema depends on your StarRocks version.
-- See the official docs for the full CREATE TABLE statement:
-- <https://docs.starrocks.io/docs/administration/management/audit_loader/>
Step 2: Prepare the AuditLoader Package
1. Download the package: auditloader.zip.
2. Unzip it and open plugin.conf.
3. Configure plugin.conf:
* `frontend_host_port`: Set to 127.0.0.1:8030.
* `user`: A user with LOAD_PRIV (usually root).
* `password`: The password for that user.
* `database`: starrocks_audit_db__.
* `table`: starrocks_audit_tbl__.
4. Re-zip the files (auditloader.jar, plugin.conf, plugin.properties) into auditloader.zip.
Step 3: Host the File on EKS/AWS
Since you are on EKS, you have two main options:
Option A: AWS S3 (Recommended)
1. Upload the auditloader.zip to an S3 bucket.
2. Make the file publicly accessible or create a Pre-signed URL that is valid for a long time.
3. Get the MD5 checksum of your zip file: md5sum auditloader.zip.
Option B: Kubernetes ConfigMap (Small files only)
Not recommended for AuditLoader because the zip contains a JAR file which often exceeds ConfigMap size limits.
Step 4: Install the Plugin via SQL
Connect to your StarRocks cluster and run the installation command using the HTTP URL:
sql
INSTALL PLUGIN FROM "<https://your-bucket-name.s3.amazonaws.com/auditloader.zip>"
PROPERTIES("md5sum" = "your_md5_checksum_here");
Step 5: Verify
Check the status of the plugin:
sql
SHOW PLUGINS\G
The status should be INSTALLED. After about 60 seconds (default interval), audit logs will start appearing in starrocks_audit_db*.starrocks_audit_tbl*.
Important Notes for Kubernetes:
* Persistent URL: The URL must remain accessible. If an FE pod restarts, it will attempt to reload the plugin from that source URL.
* Operator Config: There is currently no way to define plugins directly in the StarRocksCluster CRD YAML. You must run the INSTALL PLUGIN SQL command once.
* Logging: If the installation fails, check the FE logs in your pod:
bash
kubectl logs <fe-pod-name> | grep -i audit
References
• administration/management/audit_loader.md
• sql-reference/sql-statements/cluster-management/plugin/INSTALL_PLUGIN.md
• administration/management/logs.md
References
• administration/management/audit_loader.mdRumit Jain
06/26/2026, 11:18 AMRocky
06/26/2026, 11:18 AMauditloader.zip file is very small (< 5MB). Storing this in an S3 bucket for your FE pods to download will cost less than $0.01/month.
* API Requests: S3 GET requests to download the plugin during pod restarts are essentially free (S3 allows thousands of requests for a fraction of a cent).
2. Data Transfer (Free)
* In-Region Transfer: As long as your S3 bucket is in the same AWS Region as your EKS cluster, the data transfer from S3 to your FE pods is free.
* Internal Traffic: The "Stream Load" process where AuditLoader sends logs from the FE to the BEs happens within your VPC. AWS does not charge for data transfer between EKS nodes in the same Availability Zone (and usually, internal VPC traffic for this volume is negligible even across AZs).
3. StarRocks Resource Consumption (Primary Cost)
This is where you will see the actual impact. AuditLoader stores the logs in a standard StarRocks table, which consumes:
* Disk Space (EBS or S3):
* A typical audit log entry is about 1KB - 2KB.
* If you run 1 million queries per day, you will generate roughly 1GB - 2GB of data per day.
* Cost Tip: Use Dynamic Partitioning (set in the table properties) to automatically drop logs older than 7 or 14 days to keep storage costs from growing indefinitely.
* Compute (CPU/Memory):
* FE: The plugin runs as a background thread. For most clusters, it adds < 1-3% CPU overhead to the Frontend.
* BE: The data is ingested via Stream Load. Unless you are running thousands of queries per second, the BE impact is minimal.
How to minimize the cost:
If you are worried about the cost of storing millions of logs, you can use the filter property in the plugin.conf before zipping the plugin:
* Log only slow queries: Set filter=queryTime > 1000 (logs only queries taking > 1 second).
* Exclude specific users: Filter out internal monitoring users or heartbeat checks that spam the logs.
Verdict: For a standard production workload on EKS, the total AWS bill increase is usually less than $5–$10 per month, primarily for the EBS/S3 storage used by the audit table itself.
References
• administration/management/audit_loader.md
• administration/management/logs.md
• best_practices/audit_log_resource_group.md
• sql-reference/sql-statements/data-definition/CREATE_TABLE.md
References
• knowledge/usage/best-practice.md
• administration/management/audit_loader.md
• faq/operation_maintenance_faq.md
• administration/management/FE_configuration.md
• administration/management/logs.md
• best_practices/audit_log_resource_group.mdRumit Jain
06/26/2026, 11:26 AMstarrocks_fe_query_err{app_kubernetes_io_component="fe", app_starrocks_ownerreference_name="kube-starrocks", container="fe", endpoint="http", instance="10.0.0.0:8030", job="kube-starrocks-fe-service", namespace="ABC", pod="kube-starrocks-fe-2", service="kube-starrocks-fe-service"} 44
starrocks_fe_query_err{app_kubernetes_io_component="fe", app_starrocks_ownerreference_name="kube-starrocks", container="fe", endpoint="http", instance="10.0.0.0:8030", job="kube-starrocks-fe-service", namespace="ABC", pod="kube-starrocks-fe-1", service="kube-starrocks-fe-service"} 56
starrocks_fe_query_err{app_kubernetes_io_component="fe", app_starrocks_ownerreference_name="kube-starrocks", container="fe", endpoint="http", instance="10.0.0.0:8030", job="kube-starrocks-fe-service", namespace="ABC", pod="kube-starrocks-fe-0", service="kube-starrocks-fe-service"} 40Rocky
06/26/2026, 11:26 AMrate(starrocks_fe_query_err[5m]). A generally accepted "healthy" threshold for many StarRocks users is a failure rate below 0.05 per second (roughly 3 errors per minute).
* Check the Percentage: Compare it to the total query count:
promql
sum(rate(starrocks_fe_query_err[5m])) / sum(rate(starrocks_fe_query_total[5m]))
If your error rate is < 1% of total traffic, it is often just "noise" (e.g., users making typos in SQL, BI tools probing for tables that don't exist, or expired sessions).
2. Why are the queries failing?
Because these are FE query errors, the reason is recorded in the FE Audit Log. Since you are on EKS, you can check this directly via `kubectl`:
Search for the error messages:
bash
# Replace <fe-pod-name> with kube-starrocks-fe-0, etc.
kubectl logs <fe-pod-name> -c fe | grep "State=ERR"
Common reasons you will find in the logs:
* Syntax Errors: Table 'abc' doesn't exist or You have an error in your SQL syntax.
* Permissions: Access denied for user 'xxx'.
* Timeouts: If a query exceeds the query_timeout session variable.
* Resource Limits: If a query is killed by a Resource Group because it exceeded memory or CPU limits.
* Connection Issues: If the client disconnected before the query finished.
3. If you have AuditLoader installed
If you followed the steps to install the AuditLoader plugin, you don't need to grep logs. You can simply run a SQL query to see exactly which statements are failing and why:
sql
SELECT
user,
clientIp,
errorCode,
errorMsg,
stmt
FROM starrocks_audit_db__.starrocks_audit_tbl__
WHERE state = 'ERR'
ORDER BY timestamp DESC
LIMIT 20;
Summary Recommendation
1. Don't panic about the raw numbers (44, 56, 40) unless they are increasing rapidly (e.g., hundreds of errors per minute).
2. Grep the logs using the command above to see the errorMsg. Most of the time, these are caused by application-level SQL errors rather than a cluster failure.
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/metrics.md
• administration/management/logs.md
• administration/management/audit_loader.md
• administration/management/monitoring/alert.md
References
• faq/Sql_faq.md
• administration/management/logs.md
• faq/Dump_query.md
• administration/management/FE_configuration.mdRumit Jain
06/26/2026, 11:33 AM{
"Warehouse": "default_warehouse",
"User": "sr_dml_user",
"Time": 6,
"Timestamp": 1782467661110,
"ReturnRows": 0,
"IsQuery": true,
"Stmt": "SELECT model_name, model_meta_json FROM ABC.model_meta WHERE model_name = 'AAA:BBB';",
"ScanRows": 0,
"IsForwardToLeader": false,
"PlanCpuCost": 1069.9166666666667,
"QuerySource": "EXTERNAL",
"StmtId": 672,
"Client": "10.0.0.0:55902",
"SessionId": "019f035a-0cc6-7008-b7cf-0e60fed5eed6",
"ResourceGroup": "",
"Db": "",
"ScanBytes": 0,
"Digest": "",
"PlanMemCost": 0,
"AuthorizedUser": "'sr_dml_user'@'%'",
"QueryId": "019f035a-0d36-7fcf-a551-bf8dd6149b0a",
"feIp": "kube-starrocks-fe-0.kube-starrocks-fe-search.plattest03.svc.cluster.local",
"CNGroup": "",
"Catalog": "default_catalog",
"QueryFEAllocatedMemory": 441360,
"State": "ERR",
"ErrorCode": "INTERNAL_ERR",
"TransmittedBytes": 0,
"CustomQueryId": ""
}Rocky
06/26/2026, 11:34 AMState: ERR & ErrorCode: INTERNAL_ERR: This is a generic "Internal Error." Unlike a syntax error or permission issue, this usually means an unhandled exception occurred in the StarRocks Java code during the query setup.
* ScanRows: 0 & ScanBytes: 0: These confirm that the query never actually scanned any data.
* Time: 6: The query failed extremely fast (6ms), which is typical for a planning-stage crash.
* QueryId: 019f035a-0d36-7fcf-a551-bf8dd6149b0a: This is your "fingerprint" to find the exact cause.
Why did this happen?
Common reasons for INTERNAL_ERR during planning include:
1. Metadata Inconsistency: The FE's memory-resident metadata for the table ABC.model_meta might be out of sync or corrupted.
2. Tablet Issues: If the table has corrupted tablets or if the FE cannot find any healthy replicas to plan against.
3. Concurrent Schema Changes: If the table was being modified (ALTER or TRUNCATE) at the exact millisecond the query was planned.
4. Optimizer Bug: A specific edge case in the query (e.g., the string 'AAA:BBB') causing a NullPointerException or similar error in the Java optimizer.
How to see the actual error:
The audit log (which you provided) only shows the "result." To see the "reason" (the Java stack trace), you must check the FE Warning Log on the pod that handled the query (kube-starrocks-fe-0).
Run this command to find the specific error:
bash
kubectl logs kube-starrocks-fe-0 -n ABC | grep "019f035a-0d36-7fcf-a551-bf8dd6149b0a" -A 20
Recommended Next Steps:
1. Check Table Health: Run SHOW BACKENDS; to ensure all nodes are Alive and ADMIN CHECK TABLET (tablet_id); if you suspect data corruption.
2. Retry the Query: If it works now, it was likely a transient metadata lock or a race condition during a schema change.
3. Restart FE (Last Resort): If this query fails consistently with INTERNAL_ERR, there may be a metadata cache issue that a restart of the FE leader would resolve.
If you find a "NullPointerException" or "StackOverflowError" in the logs after running the grep command, please share that stack trace; it likely points to a specific bug in that version of the StarRocks version you are running.
References
• administration/management/logs.md
• faq/Dump_query.md
• administration/management/monitoring/alert.md
• administration/management/FE_configuration.md
• administration/management/audit_loader.md
References
• administration/management/logs.md
• administration/management/FE_configuration.md
• knowledge/trouble_shooting/fe_deadlock_problems.md
• faq/Sql_faq.mdRumit Jain
06/26/2026, 11:38 AMRocky
06/26/2026, 11:38 AMINTERNAL_ERR during the planning phase (notice ScanRows: 0), it never actually reached a specific tablet. Therefore, the audit log won't list a "Tablet ID."
To find which tablets are causing this issue for the table ABC.model_meta, you should check the health of the table's replicas. Use the following commands:
1. Check for Unhealthy Replicas in the Table
This is the most direct way to see if specific tablets in that table are corrupted (IsBad) or missing:
sql
-- Find tablets that are not OK
ADMIN SHOW REPLICA STATUS FROM ABC.model_meta WHERE STATUS != "OK";
* If you see rows here: The TabletId column will tell you exactly which tablets are problematic.
* If IsBad is true: That specific replica is corrupted.
2. Check the Overall Database Health
If the command above returns nothing, check if the database has any "UnhealthyTablets" tracked by the system:
sql
-- 1. Get your Database ID
SHOW DATABASES;
-- 2. Check statistics for that DB ID (e.g., if ABC is 10012)
SHOW PROC '/statistic/10012';
Look at the UnhealthyTablets column. If it's greater than 0, you can drill down further by clicking the link in your SQL client or running:
sql
SHOW PROC '/statistic/10012/unhealthy';
3. List All Tablets for the Table
If you just want to see the full list of tablet IDs belonging to that table to check them one-by-one:
sql
SHOW TABLETS FROM ABC.model_meta;
Why this matters for your INTERNAL_ERR
An INTERNAL_ERR during planning often means the Frontend (FE) knows the table should have tablets, but when it tries to look up the metadata for those tablets (like which BE node they live on), it finds a mismatch or a "null" value.
Recommendation:
If ADMIN SHOW REPLICA STATUS shows all tablets are OK, the issue is likely a metadata cache inconsistency in the FE. Try running:
sql
-- This forces the FE to refresh its internal metadata for this table
ANALYZE TABLE ABC.model_meta;
If that doesn't work and the error persists, a restart of the FE leader is usually the next step to clear the stale metadata.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/cluster-management/tablet_replica/ADMIN_SHOW_REPLICA_STATUS.md
• faq/operation_maintenance_faq.md
• sql-reference/sql-statements/table_bucket_part_index/SHOW_TABLET.md
References
• administration/management/resource_management/Replica.md
• faq/operation_maintenance_faq.mdRumit Jain
06/29/2026, 7:07 AMRocky
06/29/2026, 7:07 AMstarrocks_fe_connection_total
* Protocol: MySQL Protocol (Port 9030).
* Type: Counter (Cumulative).
* Meaning: This is the total number of MySQL client connections established since the FE service last started.
* Usage: You use this to see the historical volume of database connections. In Prometheus, you usually wrap this in a rate() or irate() function to calculate new connections per second.
_ _Example:* rate(starrocks_fe_connection_total[5m]) shows how many new database clients are connecting to your cluster.
2. starrocks_fe_http_connections_num
* Protocol: HTTP Protocol (Port 8030).
* Type: Gauge (Instantaneous).
* Meaning: This is the number of currently active HTTP connections on the FE.
* Usage: This tracks the real-time load on the FE's internal web server (Netty). High values here are typically caused by:
* Stream Loads: Many concurrent data loading tasks.
* API calls: Frequent monitoring scrapes or usage of the HTTP SQL interface.
* Web UI: Users logged into the StarRocks FE web dashboard.
* Routine Load: Communication between FE and BE for job scheduling.
Comparison Summary
Metric | Protocol | Port | Type | Best for...
connection_total | MySQL | 9030 | Counter | Measuring the rate of new client logins.
http_connections_num | HTTP | 8030 | Gauge | Monitoring the current load from Stream Load or APIs.
Pro-tip: If you see starrocks_fe_connection_total increasing rapidly while starrocks_fe_http_connections_num stays flat, your application is likely creating many short-lived MySQL connections (connection churning) and you should consider using a connection pool like HikariCP or ProxySQLProxySQLProxy.
References
• administration/management/monitoring/metrics.md
• administration/http_interface.md
• administration/management/monitoring/Monitor_and_Alert.mdARI or Druid.CP or druid.
References
• administration/management/monitoring/metrics.md
• administration/management/FE_configuration.md
• administration/http_interface.mdRumit Jain
06/29/2026, 7:10 AMRocky
06/29/2026, 7:10 AMstarrocks_fe_connection_total is a Counter.
* What your query shows: The total number of successful logins since the FE service started. If a user connects, stays for 1 second, and disconnects, the value increases and never goes down.
* What you probably want (Rate): To see how many new connections are happening per second, use `irate`:
promql
sum(irate(starrocks_fe_connection_total{namespace="$namespace"}[5m])) by (user)
* What you probably want (Active): To see the number of currently open connections, you should use the metric starrocks_fe_connection_num (which is a Gauge):
promql
sum(starrocks_fe_connection_num{namespace="$namespace"}) by (user)
2. Is the user label available?
By default, StarRocks provides minified metrics for performance. The user label for connection metrics might not appear unless:
1. Metric Exposure: You have enabled detailed metrics. You can verify if the label exists by checking the /metrics endpoint of your FE directly or using the Grafana "Explore" tab to see the available labels for that metric.
2. Authentication: If the label is missing, it’s often because StarRocks aggregates these at the FE level to avoid "label cardinality explosion" (having too many unique labels).
Recommended Queries
Goal | Query
New logins per second | sum(irate(starrocks_fe_connection_total{namespace="$namespace"}[1m])) by (user)
Current active sessions | sum(starrocks_fe_connection_num{namespace="$namespace"}) by (user)
Total historical logins | sum(starrocks_fe_connection_total{namespace="$namespace"}) by (user) (Your current query)
Tip: If you see the chart is empty when grouping by user, it means your Prometheus scrape configuration or your StarRocks version is not exporting the user label for that specific metric. In that case, you can only group by instance or job.
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• sql-reference/information_schema/fe_metrics.md
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• sql-reference/information_schema/fe_metrics.md
-metrics)
References
• administration/management/monitoring/metrics.md
• sql-reference/information_schema/fe_metrics.mdRumit Jain
06/29/2026, 7:13 AMRocky
06/29/2026, 7:13 AMsr_dml_user means:
Since the StarRocks Frontend (FE) service was last started, the user sr_dml_user has successfully established a total of 26 MySQL connections.
Here is the breakdown of why it shows 26 and what it implies:
1. It is a "Counter" (Historical Total)
Because starrocks_fe_connection_total is a cumulative counter, the number never goes down (unless the FE is restarted).
* If the user connects once and stays connected for an hour, the count is 1.
* If the user connects, runs a query, and disconnects—and does this 26 times—the count is 26.
* It does NOT mean there are 26 people logged in right now.
2. What this tells you about sr_dml_user
* Low Frequency/Connection Pooling: A value of 26 is generally very low. This suggests that sr_dml_user is likely using a connection pool. It opened 26 connections when the application started and has been reusing them, rather than creating a new connection for every single query.
* Service Restarts: If you recently restarted your FE, this number represents the activity only since that restart.
3. How to see "Current" connections instead
If you want to know how many connections are actually open right now for that user, you should change your Grafana query to use the Gauge version of this metric:
promql
sum(starrocks_fe_connection_num{namespace="$namespace"}) by (user)
* `connection_total`: Total logins ever (Counter).
* `connection_num`: Currently active sessions (Gauge).
Summary
If your graph shows a flat line at 26, it means sr_dml_user logged in 26 times and hasn't made a new connection attempt since. If the line is trending upwards, it means the user (or the application using that account) is frequently opening new connections.
References
• administration/management/monitoring/metrics.md
• sql-reference/information_schema/fe_metrics.md
References
• administration/management/monitoring/metrics.mdRumit Jain
06/29/2026, 7:16 AMRocky
06/29/2026, 7:17 AMstarrocks_fe_connection_total (MySQL Protocol)
* Type: Counter (Cumulative).
* Meaning: This is the total number of successful MySQL connections (logins) established since the FE service started.
* The "26" Value: This means that since your FE last restarted, the user sr_dml_user has logged in 26 times.
* It does not mean there are 26 active sessions right now.
* If that user connects, runs a query, and disconnects 26 times, the value will be 26.
* Why it's a Counter: StarRocks follows the standard Prometheus pattern for connections where the primary metric is a counter. To see current activity, you typically use irate() to see the new connections per second:
promql
sum(irate(starrocks_fe_connection_total{namespace="$namespace"}[5m])) by (user)
2. starrocks_fe_http_connections_num (HTTP Protocol)
* Type: Gauge (Instantaneous).
* Meaning: This is the current number of active HTTP connections.
* Why it's a Gauge: HTTP connections (used for Stream Load or APIs) are often tracked as an instantaneous load on the internal web server (Netty).
Why don't you see starrocks_fe_connection_num?
In most standard StarRocks versions, there is no Prometheus gauge for active MySQL connections. The FE exports the historical total (connection_total) and the rate (connections_per_second).
If you need to see the actual number of sessions currently open, you have two options:
1. SQL Query (Real-time): Run this in your MySQL client to see the exact count per user right now:
sql
SELECT USER, COUNT(*) FROM information_schema.processlist GROUP BY USER;
2. Monitor "Unfinished Queries": While not exactly the same as sessions, this gauge tells you how many queries are currently running (which is often what people actually care about when monitoring load):
promql
sum(starrocks_fe_unfinished_query{namespace="$namespace"})
Summary of your Grafana Query
Your current query sum(starrocks_fe_connection_total) by (user) is showing a historical audit of how many times that user has successfully connected. If you want to monitor for "connection spikes," change it to use a rate() or irate() function.
Note: Per-user connection tracking in metrics was introduced/refined in versions v3.1.16+, v3.2.12+, and v3.3.4+. If you are on an older version, the user label might not be populated or accurate.
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• sql-reference/sql-statements/administration/SHOW_PROCESSLIST.md
References
• administration/management/monitoring/metrics.md
• administration/management/FE_configuration.mdRumit Jain
06/29/2026, 7:20 AMRocky
06/29/2026, 7:20 AMirate (or rate) in Prometheus, the result is always converted to a per-second value.
The values like 0.4 or 1.5333 represent the number of new connections (logins) established per second during that time window.
How to interpret the numbers:
* 0.4 connections/sec: This means the user is logging in roughly once every 2.5 seconds ($1 / 0.4 = 2.5$).
* In one minute, this would equal 24 new connections ($0.4 \times 60$).
* 1.5333 connections/sec: This means the user is logging in roughly 1.5 times every second.
* In one minute, this would equal about 92 new connections ($1.5333 \times 60$).
Why is it a decimal?
Prometheus calculates the difference between the most recent data points and divides by the time (in seconds) between them. Since connections don't happen exactly on the "tick" of every second, the math results in an average rate over that short window, which is usually a decimal.
What does this tell you about sr_dml_user?
* If the value is low (e.g., 0.01): The user/application is using a connection pool. It logs in once and stays connected for a long time. This is healthy.
* If the value is high or sustained (e.g., > 1.0): The application is likely not using a connection pool. It is opening a brand-new MySQL connection for every single query, then closing it.
_ _Why this matters:* Frequent logins (high connection rate) put unnecessary CPU pressure on the StarRocks Frontend (FE) because each login requires authentication and session initialization.
Summary
* Metric: starrocks_fe_connection_total = Total lifetime logins.
* Your Query: irate(...) = Logins per second right now.
* Goal: You generally want this number to be as close to 0 as possible for established applications, indicating they are reusing existing connections rather than constantly logging in.
References
• administration/management/monitoring/metrics.md
References
• administration/management/monitoring/metrics.md
References
• administration/management/monitoring/metrics.mdRumit Jain
06/29/2026, 9:46 AMRocky
06/29/2026, 9:46 AMlake_get_tablet_metadata_latency
* What it is: Measures the time (latency) it takes for a node to retrieve tablet metadata from the shared storage or the metadata service.
* Significance in FE+CN: In a shared-data architecture, CN nodes do not "own" data locally. To perform a query, they must first fetch the metadata (which tells them which files to read from S3) for the tablets involved.
* What to watch: If this latency is high, your Query Start Time will be slow. It usually indicates issues with your object storage (e.g., S3 throttling) or network congestion between your CNs and the metadata service.
2. lake_put_tablet_metadata_latency
* What it is: Measures how long it takes to write or update tablet metadata to the shared storage.
* Significance in FE+CN: This occurs during Data Ingestion (Load). When a CN finishes writing a new data file (segment) to S3, it must update the tablet metadata to include this new version.
* What to watch: High latency here will cause Ingestion Delays. If this spikes, your INSERT or STREAM LOAD jobs will take longer to commit, even if the actual data transfer to S3 was fast.
3. rpc_server_8060_starrocks_lake_lake_service_abort_txn_concurrency
* What it is: Tracks how many "Abort Transaction" RPC requests are being processed simultaneously by the Lake Service (typically running on port 8060).
* Significance in FE+CN: When a load fails or is canceled, the FE sends an "Abort" signal to the CNs to clean up temporary files and roll back metadata.
* What to watch:
* Normal behavior: Should be near zero or have very brief spikes.
* High values: Suggests a large number of failing/timing-out load jobs or a bottleneck in the cleanup process. If this is high, your cluster might be spending too many resources on "cleaning up" instead of "computing."
Summary for FE+CN Architecture
In the FE+CN (Shared-Data) model:
* The FE manages the transaction logic.
* The CN executes the "Lake Service" (often using port 8060 for internal communication) to interact with the shared storage.
* These metrics are your "vital signs" for the Shared-Data layer. Unlike traditional BE-based clusters, where local disk I/O is the bottleneck, in your architecture, the latency of the Lake Metadata Service (tracked by these metrics) is the most common cause of performance fluctuations.
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• introduction/Architecture.mdRumit Jain
06/29/2026, 9:50 AMRocky
06/29/2026, 9:50 AMlake_metacache_capacity & lake_metacache_usage
* lake_metacache_capacity: The total memory limit (in bytes) allocated for the Lake Metadata Cache.
* lake_metacache_usage: The amount of memory (in bytes) currently being used by this cache.
* What they represent: For "Lake" tables (shared-data tables), the nodes need to cache metadata like segment footers, index blocks, and tablet information. Without this cache, every query would have to fetch these small files from S3, which is very slow.
* Why it matters: If usage is consistently hitting capacity, the node is evicting metadata frequently. This leads to higher query latency because the system has to perform more remote I/O to re-fetch the metadata.
2. lake_delvec_cache_miss_minute
* What it is: The number of times the Delete Vector (DelVec) Cache was missed in the last minute.
* Context: In StarRocks' Primary Key tables (specifically those using the Lake engine), a "Delete Vector" is a bitset that tracks which rows in a segment have been deleted or updated.
* Why it matters:
* Performance: Delete vectors are essential for correct query results in Primary Key tables. If they aren't in the cache, the CN must fetch them from shared storage before it can process the data.
* Troubleshooting: High miss counts usually indicate that your Delete Vectors are larger than the allocated cache, or that you have a very high volume of updates/deletes across many tablets, causing frequent cache churn.
How these fit into your architecture
In a FE+CN setup, these metrics are exported by the CN nodes. They tell you how effective your "hot data" caching strategy is.
* Healthy State: High lake_metacache_usage (near capacity is okay as long as it's not thrashing) and low lake_delvec_cache_miss_minute.
* Warning State: High lake_delvec_cache_miss_minute combined with high CPU on your CN nodes. This often means the nodes are spending too much time downloading and decoding delete vectors from S3 rather than executing queries.
References
• administration/management/monitoring/metrics.md
• introduction/Architecture.md
• administration/management/monitoring/Monitor_and_Alert.md
References
• administration/management/monitoring/metrics.md
• data_source/data_cache_observe.mdRumit Jain
06/29/2026, 10:20 AM- NumDiskAccess: 0
- PeakMemoryUsage: 0
- RowsRead: 0
- RowsReturned: 1
- RowsReturnedRate: 1.78 K/sec
- ScanTime: 337.203us
- ScannerQueueCounter: 1
- ScannerQueueTime: 2.190us
- ScannerThreadsInvoluntaryContextSwitches: 0
- ScannerThreadsTotalWallClockTime: 0.000ns
- MaterializeTupleTime(*): 0.000ns
- ScannerThreadsSysTime: 0.000ns
- ScannerThreadsUserTime: 0.000ns
- ScannerThreadsVoluntaryContextSwitches: 0
- TotalRawReadTime(*): 0.000ns
- TotalReadThroughput: 0.00 /sec
DataSource:
- DataSourceType: FileDataSource
- FileScanner: 0
- CastChunkTime: 14.760us
- CreateChunkTime: 29.991us
- FileReadCount: 2
- FileReadTime: 2.740us
- FillTime: 0.000ns
- MaterializeTime: 6.201us
- ReadTime: 0.000ns
- ScannerTotalTime: 137.182usRocky
06/29/2026, 10:20 AMSELECT count(*) on certain file formats like Parquet where the count is in the footer).
* The query was a constant query (e.g., SELECT 1) that didn't need to scan actual data rows.
* RowsReturnedRate: 1.78 K/sec: A calculated speed based on the tiny fraction of time it took to return that 1 row.
2. Scanner Performance
* ScanTime: 337.203us: The total time the scanner was active. This is incredibly fast (0.3 milliseconds).
* ScannerQueueTime: 2.190us: The time this task spent waiting in the thread pool queue. 2 microseconds is excellent, indicating the CN is not overloaded.
* ScannerThreadsTotalWallClockTime: 0.000ns: Since the task was so fast, the timer didn't capture a measurable duration in nanoseconds for the thread execution itself.
3. DataSource (File Reading)
* DataSourceType: FileDataSource: Confirms this was a file-based scan (external/lake).
* FileReadCount: 2: The node performed 2 read operations. Typically, this is 1 read for the file footer/metadata and 1 read for the actual data block.
* FileReadTime: 2.740us: The actual time spent communicating with the storage (S3/HDFS/Cache) to get the bits.
* MaterializeTime: 6.201us: The time spent converting the raw bytes from the file into StarRocks' internal memory format (Columnar Chunks).
Summary for CN Architecture
If you see many of these logs and your performance is good, it means your CNs are efficiently handling small metadata requests. If ScannerQueueTime were high (e.g., several milliseconds or seconds), it would indicate that your CNs are bottlenecked and you need more scanner_thread_pool_thread_num or more CN nodes.
References
• best_practices/query_tuning/query_profile_operator_metrics.md
• administration/management/logs.md
• data_source/data_cache.md
References
• administration/management/monitoring/metrics.md
• data_source/data_cache.md
• best_practices/query_tuning/query_profile_operator_metrics.md
• unloading/Spark_connector.md
• loading/loading_introduction/troubleshooting_loading.mdRumit Jain
06/29/2026, 12:25 PMRocky
06/29/2026, 12:25 PMstarrocks_fe_query_latency_ms{quantile="0.95"}
* Threshold: > 1000ms (adjust based on your SLA).
* Why: Indicates users are experiencing slow queries. In FE+CN, this is often caused by metadata fetching delays or CN resource exhaustion.
* Query Error Rate:
* Metric: rate(starrocks_fe_query_err_total[5m]) / rate(starrocks_fe_query_total[5m]) * 100
* Threshold: > 5%
* Why: High failure rates usually indicate syntax errors, timeouts, or CN nodes crashing.
* Connection Limit Reach:
* Metric: starrocks_fe_connection_total
* Threshold: > 90% of max_connections
* Why: If the FE reaches its connection limit, new queries will be rejected immediately.
2. Compute Node Execution (CN Level)
These alerts detect bottlenecks in the execution engine.
* Scanner Queue Congestion:
* Metric: starrocks_be_query_scan_queue_len (CNs use BE-prefixed metrics for execution).
* Threshold: > 5 (sustained for 1 minute).
* Why: This means queries are waiting for available threads to read data. It’s a sign that you need to scale out your CN pods or increase thread pool sizes.
* CN CPU/Memory Saturation:
* Metric: starrocks_be_cpu_idle (Alert if < 15%) or starrocks_be_mem_usage_ratio.
* Threshold: Memory > 85%.
* Why: High CPU/Mem on CNs leads to query thrashing or OOM (Out of Memory) restarts.
3. Lakehouse/Shared-Data Specific (Critical for CN)
Since data lives on S3/HDFS, these metrics track the "Shared-Data" overhead.
* High Metadata Fetch Latency:
* Metric: lake_get_tablet_metadata_latency
* Threshold: > 200ms (Avg).
* Why: In an FE+CN setup, the CN must fetch metadata before it can scan data. High latency here directly delays the "Time to First Byte" for every query. It usually points to object storage (e.g., S3) throttling.
* Delete Vector Cache Misses (For Primary Key Tables):
* Metric: lake_delvec_cache_miss_minute
* Threshold: Any significant spike (e.g., > 100 per minute).
* Why: If you use Primary Key tables, a high miss rate means the CN is constantly downloading delete vectors from S3, which kills query performance for updates/deletes.
* Metadata Cache Exhaustion:
* Metric: (lake_metacache_usage / lake_metacache_capacity) * 100
* Threshold: > 95%.
* Why: If the metadata cache is full, StarRocks will start evicting metadata, causing "cache thrashing" where every query has to perform slow remote I/O.
Summary Checklist for Prometheus/Grafana:
Alert Name | Metric Name | Recommended Condition
Query Failure | starrocks_fe_query_err_rate | > 10%
Slow Queries | starrocks_fe_query_latency_ms | P99 > 3000ms
CN Busy | starrocks_be_query_scan_queue_len | > 2 (for 5 min)
S3 Bottleneck | lake_get_tablet_metadata_latency | > 500ms
Metacache Full | lake_metacache_usage | > 90% capacity
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.md
• best_practices/query_tuning/query_profile_operator_metrics.md
ReferencesRocky
06/29/2026, 12:25 PMRumit Jain
06/29/2026, 12:39 PMstarrocks_be_query_scan_queue_lenRocky
06/29/2026, 12:39 PMstarrocks_fe_query_total, it is because StarRocks now categorizes query counts by Resource Group.
* Total Query Count:
Use sum(starrocks_fe_query_resource_group)
_ _Description:* Total number of queries executed across all resource groups.
* Query Error Count:
Use sum(starrocks_fe_query_resource_group_err)
_ _Description:* The total number of failed queries.
* Alternative for Query Failure Rate:
starrocks_fe_query_err_rate (Available in v3.1.15+, v3.2.11+, and v3.3.3+).
* Internal Errors:
starrocks_fe_query_internal_err (Specifically for system-level failures rather than syntax errors).
Recommended Alert (FE Failure Rate):
promql
sum(rate(starrocks_fe_query_resource_group_err[5m])) / sum(rate(starrocks_fe_query_resource_group[5m])) > 0.05
──────────
2. Correct CN (BE) Scan Metrics
The "Scan Queue" metric depends on whether the Pipeline Engine is enabled (it is the default in modern StarRocks).
* Scan Queue Congestion:
Use pipe_scan_executor_queuing
_ _Description:* The current number of pending asynchronous I/O tasks launched by Scan Operators. If this is consistently high (> 0), your CNs are struggling to keep up with data fetching.
* Pipeline Driver Queue:
Use pipe_driver_queue_len
_ _Description:* The number of "ready" drivers waiting to be scheduled on a CPU core. High values here indicate CPU saturation on your CNs.
* Scan Rows Returned:
starrocks_be_files_scan_num_rows_return
_ _Description:* Useful for tracking the volume of data being processed from shared storage (files).
Recommended Alert (CN Congestion):
promql
pipe_scan_executor_queuing > 5
──────────
Revised Recommended Alerts for FE+CN
Alert Goal | Correct Metric Name | Recommended Threshold
High Query Error Rate | sum(starrocks_fe_query_resource_group_err) | > 5% of total queries
CN Scan Bottleneck | pipe_scan_executor_queuing | > 5 (sustained)
CN CPU Saturation | pipe_driver_queue_len | > (Number of CN Cores * 2)
Lake Metadata Delay | lake_get_tablet_metadata_latency | > 200ms
Metacache Efficiency | lake_metacache_usage | > 95% of capacity
_Note: You can find these names by visiting http://<fe_ip>:<fe_http_port>/metrics and http://<cn_ip>:<cn_http_port>/metrics directly in your browser to see the exact strings exported by your specific version._
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/alert.md
• administration/management/resource_management/query_queues.md
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/alert.md
• administration/management/resource_management/query_queues.md
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/BE_configuration.mdRocky
06/29/2026, 12:39 PMRumit Jain
06/29/2026, 1:13 PMRocky
06/29/2026, 1:14 PM0.07 means a 7% failure rate).
* Threshold: It triggers when more than 5% of all queries are failing.
* Scope: The current sum() without a by clause aggregates all FEs together into a single number for the whole namespace.
2. How to get the Pod name as a label
To see which specific FE pod is reporting the errors, you must use the by (pod) or by (instance) aggregator.
Corrected Expression:
promql
sum by (pod) (rate(starrocks_fe_query_resource_group_err{namespace="plattest03"}[5m]))
/
sum by (pod) (rate(starrocks_fe_query_resource_group{namespace="plattest03"}[5m]))
> 0.05
_Note: This assumes your Prometheus discovery adds the pod label. If you are using a standard Prometheus exporter, you might need to use instance or kubernetes_pod_name depending on your relabeling rules._
──────────
3. Runbook: What to do when this alert fires
If this alert fires, it means the system is actively rejecting or failing user requests. Follow these steps:
Step 1: Identify the Error Type
Check the FE logs (fe.log) on the pod identified in the alert. Search for WARN or ERROR levels.
* Syntax Errors: If users are sending bad SQL, the error rate will spike.
* "No nodes available": This means the FE cannot talk to any CN/BE nodes. Check CN status with SHOW BACKENDS; or SHOW COMPUTE NODES;.
* Timeout/RPC Errors: Indicates network congestion or CNs being overloaded.
Step 2: Check Node Health
* OOM Kills: Check if CN pods are restarting (kubectl get pods -n plattest03).
* CPU Throttling: Check if CN/FE pods are hitting CPU limits, causing heartbeats to fail.
Step 3: Check Resource Groups
Since this metric is derived from resource_group metrics, check if a specific group is being throttled:
_ Run SELECT _ FROM information_schema.resource_group_usage; to see if queries are being rejected due to concurrency limits.
Step 4: Storage Connectivity (Shared-Data)
If you are using FE+CN (Shared-Data), ensure the CNs can still talk to the object storage (S3/HDFS). Look for "Lake" or "S3" errors in the CN logs.
──────────
4. Severity: Critical vs. Warning?
Severity | Threshold | Logic
Warning | 5%| Usually covers transient issues, user syntax errors, or minor network blips. It requires investigation but hasn't "broken" the whole system yet. Critical |
20%| Indicates a major sub-system failure (e.g., one whole CN pod is down, or the metadata store is unreachable). This should wake someone up. Recommendation: Keep
> 0.05 as a Warning alert. Create a second alert with > 0.50 (50% failure) as Critical, as that indicates a near-total service outage.
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.md
• administration/management/resource_management/query_queues.md
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.md
• administration/management/resource_management/query_queues.mdRocky
06/29/2026, 1:14 PMRumit Jain
06/29/2026, 1:37 PM2026-06-29 13:35:44.873Z WARN (replayer|108) [ClusterSnapshotMgr.replayLog():429] Invalid Cluster Snapshot Log Type UPDATE_SNAPSHOT_JOBRocky
06/29/2026, 1:37 PMClusterSnapshotMgr is the component responsible for managing automated snapshots of the entire cluster's metadata and data.
* The Error: Invalid Cluster Snapshot Log Type UPDATE_SNAPSHOT_JOB means that the FE node (which is running a "replayer" thread to sync its state with the Leader FE) has encountered an edit log entry labeled UPDATE_SNAPSHOT_JOB. However, this specific FE's code does not recognize that tag.
* The Cause: This is a classic symptom of a version mismatch within your FE cluster.
* One FE (the Leader) is likely running a newer version (or a newer patch) that supports the UPDATE_SNAPSHOT_JOB metadata type.
* The FE reporting the warning (the Follower or Observer) is running an older version that does not yet have this log type defined in its replaying logic.
Is this critical?
* Warning Level: While logged as WARN, it is potentially serious for cluster high availability.
* Risk: If the Follower cannot recognize and replay certain edit logs, its internal memory state will become out of sync with the Leader. If the current Leader fails and this Follower is elected as the new Leader, it may have inconsistent metadata regarding snapshot jobs, which could lead to failures in your backup/DR processes or even FE crashes.
Recommended Actions
1. Check FE Versions: Run SHOW FRONTENDS; in your SQL client and check the Version column for all nodes. Ensure they are all identical.
2. Verify Pod Images: If you are running on Kubernetes (which is common for FE+CN/Shared-data), check your FE Deployment/StatefulSet to ensure all replicas are using the exact same image tag.
3. Upgrade/Sync: If you recently performed a rolling upgrade, ensure it completed successfully on all nodes. If you downgraded, be aware that StarRocks metadata is generally not backward compatible. For example, downgrading from v4.0 to early v3.5 versions is explicitly noted in release notes as causing metadata incompatibility and potential FE crashes.
4. Align Patch Versions: If you are on v3.5.x or v4.0.x, ensure you are at least on a patch version where this feature was stabilized (e.g., v3.5.2+ or v4.0.2+).
Summary: Your FE cluster is in a "mixed-version" state where the follower doesn't understand the new metadata commands the leader is issuing. You should align all FE nodes to the same (latest) version immediately.
References
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.md
• administration/management/logs.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_FRONTENDS.mdRumit Jain
06/29/2026, 1:40 PMshow frontends\G;
*************************** 1. row ***************************
Id: 2
Name: kube-starrocks-fe-1.kube-starrocks-fe-search.plattest03.svc.cluster.local_9010_1773372609823
IP: kube-starrocks-fe-1.kube-starrocks-fe-search.plattest03.svc.cluster.local
EditLogPort: 9010
HttpPort: 8030
QueryPort: 9030
RpcPort: 9020
Role: FOLLOWER
ClusterId: 1758902270
Join: true
Alive: true
ReplayedJournalId: 7920432
LastHeartbeat: 2026-06-29 13:40:03
IsHelper: true
ErrMsg:
StartTime: 2026-06-29 13:33:37
Version: 4.0.1-cd9df36
*************************** 2. row ***************************
Id: 3
Name: kube-starrocks-fe-2.kube-starrocks-fe-search.plattest03.svc.cluster.local_9010_1773372610386
IP: kube-starrocks-fe-2.kube-starrocks-fe-search.plattest03.svc.cluster.local
EditLogPort: 9010
HttpPort: 8030
QueryPort: 9030
RpcPort: 9020
Role: LEADER
ClusterId: 1758902270
Join: true
Alive: true
ReplayedJournalId: 7920433
LastHeartbeat: 2026-06-29 13:40:03
IsHelper: true
ErrMsg:
StartTime: 2026-06-29 08:26:02
Version: 4.0.1-cd9df36
*************************** 3. row ***************************
Id: 1
Name: kube-starrocks-fe-0.kube-starrocks-fe-search.plattest03.svc.cluster.local_9010_1773372562608
IP: kube-starrocks-fe-0.kube-starrocks-fe-search.plattest03.svc.cluster.local
EditLogPort: 9010
HttpPort: 8030
QueryPort: 9030
RpcPort: 9020
Role: FOLLOWER
ClusterId: 1758902270
Join: true
Alive: true
ReplayedJournalId: 7920432
LastHeartbeat: 2026-06-29 13:40:03
IsHelper: true
ErrMsg:
StartTime: 2026-06-29 10:20:31
Version: 4.0.1-cd9df36
3 rows in set (0.02 sec)
ERROR:
No query specifiedRocky
06/29/2026, 1:41 PM4.0.1-cd9df36), this log indicates a metadata replay inconsistency specifically within the Cluster Snapshot feature.
1. What is this log?
The UPDATE_SNAPSHOT_JOB is an internal StarRocks edit log type used to track the status of Automated Cluster Snapshots (a disaster recovery feature for shared-data clusters).
The warning Invalid Cluster Snapshot Log Type means the Follower's replayer thread encountered a log entry in the shared EditLog that its internal "dictionary" doesn't recognize.
2. Why is this happening on the same version?
If all FEs are identical, this is typically caused by one of two things:
* Version 4.0.1 Bug: In early 4.0.x releases, there was a known issue where certain snapshot state transitions (like UPDATE_SNAPSHOT_JOB) were written to the EditLog by the Leader, but the replayer logic in the same version lacked the corresponding case to handle them. This is a "self-inconsistent" bug in that specific build.
* Partial Upgrade/Rollback: If any FE was briefly running a newer version (like a 4.0.x hotfix) and was then downgraded back to 4.0.1, it may have written a log type that 4.0.1 cannot understand. Metadata in StarRocks is generally not backward-compatible.
3. Impact
* Metadata Divergence: Your Follower nodes are failing to replay certain snapshot management tasks. While this might not crash the FE immediately, it means the Followers' view of the snapshot history is now out of sync with the Leader.
* Election Risk: If the Leader (kube-starrocks-fe-2) fails, the Followers might have trouble taking over correctly or might fail to manage future snapshots.
4. Recommended Actions
Immediate Mitigation: Disable Snapshots
If you do not strictly require the Cluster Snapshot feature right now, disable it to stop the Leader from writing these unrecognized log entries:
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT OFF;
Permanent Fix: Upgrade to a Stable Patch
According to the release timeline for your current environment (June 2026), version 4.0.1 is an early release. More stable patches like 4.0.9 or 4.1.x contain the fixes for these metadata replay types.
* Check if you can move to a later 4.0 patch where the ClusterSnapshotMgr logic was stabilized.
* Since you are on Kubernetes, update your StarRocksCluster CRD image tag and perform a rolling restart.
Verify Feature Status
You can check the current state of these jobs to see if any are "stuck" due to this error:
sql
SELECT * FROM information_schema.cluster_snapshot_jobs;
Summary: This is a replayer bug in v4.0.1. Disable the feature via ADMIN SET if not in use, or upgrade to a later patch (e.g., 4.0.9+) to align the replayer logic with the log types being generated by the leader.
References
• administration/cluster_snapshot.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_FRONTENDS.md
References
• administration/cluster_snapshot.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_FRONTENDS.md
• administration/management/logs.md
• administration/management/monitoring/alert.mdRumit Jain
06/29/2026, 1:43 PM|
| automated_cluster_snapshot_1782738926708 | 1977523 | 2026-06-29 13:15:26 | 2026-06-29 13:15:43 | DELETED | | |
| automated_cluster_snapshot_1782739526714 | 1977568 | 2026-06-29 13:25:26 | NULL | ERROR | | checkpoint failed for starMgr image: kube-starrocks-fe-1.kube-starrocks-fe-search.plattest03.svc.cluster.local_9010_1773372609823 |
| automated_cluster_snapshot_1782740126715 | 1977590 | 2026-06-29 13:35:26 | 2026-06-29 13:35:44 | FINISHED | | |
+------------------------------------------+---------+---------------------+---------------------+----------+-------------+-----------------------------------------------------------------------------------------------------------------------------------+
100 rows in set (0.02 sec)Rocky
06/29/2026, 1:44 PMstarrocks_fe_meta_log_count
Since snapshots fail if checkpoints fail, this is the most reliable metric to alert on. By default, a checkpoint occurs every 50,000 log entries. If the count goes significantly higher, it means checkpoints (and thus snapshots) are failing.
* Alert Rule:
promql
starrocks_fe_meta_log_count{job="$job_name"} > 100000
* Severity: Warning (if it stays high for 30m) or Critical (if it exceeds 500,000).
2. Monitoring via SQL (Information Schema)
You can set up a SQL-based alert (using a Prometheus SQL Exporter or a script) to query the internal views. This is the most direct way to catch the ERROR state shown in your logs.
* Query for Errors:
sql
SELECT count(*) FROM information_schema.cluster_snapshot_jobs
WHERE state = 'ERROR' AND created_time > NOW() - INTERVAL 1 HOUR;
* Query for "Stuck" Jobs:
sql
-- Alerts if the latest snapshot is older than your interval (default 10m)
SELECT count(*) FROM information_schema.cluster_snapshots
WHERE created_time < NOW() - INTERVAL 30 MINUTE;
3. Log-based Alerting
The specific error in your log, checkpoint failed for starMgr image, indicates that the Starlet Manager (which manages object storage metadata for shared-data clusters) failed to save its state.
* Log Pattern: checkpoint failed for starMgr image
* Reason: This usually happens due to Object Storage connectivity issues (S3/GCS/Azure) or the FE running out of heap memory (Xmx) during the image-saving process.
──────────
Runbook for Snapshot / Checkpoint Alerts
If starrocks_fe_meta_log_count is high or jobs show `ERROR`:
1. Check FE Memory: Check starrocks_fe_memory_usage. If the FE JVM is near its limit, it may fail to "save image" (the checkpoint process). Increase JAVA_OPTS="-Xmx..." in fe.conf if necessary.
2. Verify Object Storage: Ensure the FE can still write to the Storage Volume used for snapshots. Check for network timeouts or credential expiration in fe.log.
3. Manual Checkpoint Test: Force a checkpoint to see the error in real-time:
sql
ADMIN CHECKPOINT;
Then immediately check fe.log for Exception when generate new image file.
4. Starlet Manager Logs: Specifically look for logs containing Starlet or StarMgr to see why the shared-data metadata component is failing to save its image.
Severity Recommendation
* Warning: If a single snapshot fails but others succeed (as seen in your output where the next one was FINISHED).
* Critical: If starrocks_fe_meta_log_count exceeds 200,000 or no snapshots have finished in over 2 hours. This puts your metadata at risk of corruption or extremely long restart times.
References
• administration/cluster_snapshot.md
• administration/management/monitoring/alert.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/FE_configuration.md
• sql-reference/information_schema/fe_metrics.md
ReferencesRumit Jain
06/30/2026, 6:53 AMup{container="cn"} == 0Rocky
06/30/2026, 6:53 AMup{container="cn"} == 0 is likely not firing due to how Prometheus handles targets that are completely unreachable or pods that have been deleted.
1. Metric Absence vs. Zero Value
The most common reason up == 0 fails to fire in Kubernetes is that when a CN (Compute Node) pod crashes or is terminated, Prometheus can no longer "scrape" it.
* Zero (0): Prometheus successfully connected to the pod, but the exporter (StarRocks) explicitly reported that the service is down.
* Absence (Null): If the pod is gone, the time series for that pod disappears entirely. Prometheus cannot evaluate null == 0, so the alert never triggers.
Solution: Use the absent function or a health check from the Frontend (FE) perspective.
2. Recommended Alert (FE Perspective)
The FE tracks the health of all CN nodes. This is the most reliable way to alert because the FE always exists (as long as the cluster is up) and knows if a CN has heartbeat failures.
Use this metric (exported by the Leader FE):
promql
# Alerts if any CN node is in a 'DEAD' state according to the FE
starrocks_fe_cn_node_num{state="dead"} > 0
Or, if you want to alert when the number of Alive CNs drops below your expected count (e.g., 3):
promql
starrocks_fe_cn_node_num{state="alive"} < 3
3. Fixing your up query
If you must use the up metric, you should combine it with absent to handle cases where the pod is deleted:
promql
# Fires if the target is reported as down OR if the metric is missing entirely
up{job="starrocks-cn"} == 0 or absent(up{job="starrocks-cn"})
Note: Ensure your labels (like job or container) exactly match what you see in the Prometheus "Targets" page. In many StarRocks Operator setups, the job is labeled starrocks-cn rather than just a container label.
4. Summary Checklist
1. Check Labels: Go to your Prometheus UI, search for up, and verify that container="cn" is actually a label on the metric. It is often job="starrocks-cn-cluster".
2. Check FE Metrics: Run SHOW COMPUTE NODES; in StarRocks. If the Alive column says false, the metric starrocks_fe_cn_node_num{state="dead"} will definitely be 1.
3. Check Scrape Interval: If the pod restarts very quickly, Prometheus might miss the "down" state between scrape intervals.
References
• administration/management/monitoring/Monitor_and_Alert.md
• administration/management/monitoring/metrics.md
• administration/management/monitoring/alert.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_COMPUTE_NODES.md
References
• administration/management/monitoring/metrics.md
• deployment/plan_cluster.mdRumit Jain
06/30/2026, 11:36 AMRocky
06/30/2026, 11:36 AM7g series) or Graviton2 (6g series):
Component | Instance Series | Recommendation | Why?
FE | m7g (General) | m7g.2xlarge or 4xlarge | Balanced CPU/Memory for metadata management and query planning.
CN | r7g (Memory) | r7g.4xlarge or 8xlarge | Highly Recommended. OLAP workloads are memory-intensive. r7g provides 8GB RAM per vCPU, which is ideal for complex joins.
CN | c7g (Compute) | c7g.4xlarge | Use only if your workload is purely CPU-bound (e.g., very simple filters/aggregations) and datasets fit easily in memory.
2. Resource Requests and Limits (Kubernetes)
In StarRocks, it is critical to set Requests = Limits. This ensures the Pods are placed in the Guaranteed QoS class, preventing the Kubernetes scheduler from oversubscribing the node and causing performance jitter or unexpected OOM kills.
FE (Frontend)
* CPU: 8 Cores (Request/Limit)
* Memory: 16GB - 32GB (Request/Limit)
* JVM Heap: Set JAVA_OPTS (usually in fe.conf) to roughly 50-70% of the container memory limit (e.g., if Limit is 32GB, set -Xmx22g).
CN (Compute Node)
* CPU: 16 Cores+ (Request/Limit)
* Memory: 64GB - 128GB (Request/Limit)
* StarRocks `mem_limit`: The StarRocks CN process will automatically attempt to use 90% of the available container memory by default. Ensure the container limit matches your instance's available RAM (minus ~2-4GB for system/daemonset overhead).
3. Example YAML Configuration
If using the StarRocks Operator:
yaml
starRocksFESpec:
resources:
requests:
cpu: "8"
memory: "32Gi"
limits:
cpu: "8"
memory: "32Gi"
starRocksCnSpec:
resources:
requests:
cpu: "16"
memory: "128Gi"
limits:
cpu: "16"
memory: "128Gi"
4. Important Graviton/EKS Considerations
* Image Tag: Ensure you use the ARM64-compatible images. These are usually suffixed with -arm64 or are multi-arch images (e.g., starrocks/cn-ubuntu:3.3.0).
* Storage (Shared Data): Since you are using CNs, you are likely in a shared-data architecture. Ensure your S3 bucket is in the same region as your EKS cluster to minimize latency and data transfer costs.
* Node Affinity: Use nodeSelector or affinity in your Kubernetes spec to ensure FE and CN pods land on the correct Graviton node groups.
* Transparent Huge Pages (THP): On EKS nodes, ensure THP is set to madvise or disabled via a DaemonSet or UserData script, as StarRocks manages its own memory allocation.
References
• deployment/plan_cluster.md
• deployment/sr_operator.md
• administration/management/FE_configuration.md
• quick_start/helm.md
References
• deployment/plan_cluster.md
• quick_start/helm.md
• deployment/sr_operator.md
• deployment/environment_configurations.md
• faq/resource_isolation_faq.md
• faq/Others.mdRumit Jain
07/06/2026, 9:56 AMRocky
07/06/2026, 9:56 AMkube-starrocks-initpwd job once it has reached the Completed status.
Why it restarts
As you observed, the initpwd pod is designed to start alongside the FE pods. Because it takes some time for the FE metadata to initialize and the service to become responsive to SQL commands, the initpwd pod will often fail and enter a CrashLoopBackOff or Error state 3–5 times. This is *expected behavior*; it will keep retrying until it can successfully log in and execute the SET PASSWORD command.
Key Points for Deleting the Job:
* Safe to Delete: Once the log says Successfully modified password and the pod status is Completed, the job has finished its task. Deleting the Job or its Pod will not revert the password change.
* Helm State: Deleting the job manually via kubectl will not break your Helm release. However, the next time you run helm upgrade, Helm might try to recreate the job depending on your configuration.
* GitOps (ArgoCD/Flux) Recommendation: If you are using a GitOps tool, it might see the missing job as "out of sync" and recreate it. To prevent the job from running every time you sync, the documentation recommends setting isInstall: false in your values.yaml after the first successful deployment:
yaml
starrocks:
initPassword:
enabled: true
isInstall: false # Set to false after the initial installation
Summary of Statuses
Pod Name | Status | Meaning
kube-starrocks-initpwd-xxxxx | CrashLoopBackOff | Normal; waiting for FE to be ready.
kube-starrocks-initpwd-xxxxx | Completed (0/1) | Success. The password is set.
kube-starrocks-initpwd-xxxxx | Error | Check logs; likely wrong secret name or networking issue.
References
• quick_start/helm.md
• deployment/helm.md
• deployment/sr_operator.md
• administration/management/FE_configuration.md
References
• quick_start/helm.mdRumit Jain
07/06/2026, 9:58 AMRocky
07/06/2026, 9:58 AMbash
kubectl delete job <job-name> -n <namespace>
Important Follow-up
To prevent the job from attempting to run again (and failing because the password is already changed) during your next helm upgrade, update your `values.yaml`:
yaml
initPassword:
enabled: true
isInstall: false # Set this to false now that the initial setup is done
Setting isInstall: false tells the Helm chart that the initialization has already occurred, so it won't trigger the job on future updates.Rumit Jain
07/07/2026, 9:02 AMRocky
07/07/2026, 9:02 AMAlive.
sql
SHOW FRONTENDS;
SHOW COMPUTE NODES; -- or SHOW BACKENDS;
* Version Verification: Ensure every node reports 4.1.1.
* Log Check: Scan FE fe.log and CN <http://be.INFO|be.INFO> for CRITICAL or WARNING messages related to metadata replay or tablet splitting.
2. Functional & Behavior Change Testing
The 4.1.x series introduced specific behavior changes that you should validate:
* Materialized Views (MVs): Behavior for INCREMENTAL and AUTO MVs has changed. Query rewrite is disabled for these types in 4.1.1.
* Test: Manually trigger a refresh of your most critical MVs and verify if queries that previously utilized rewrites still perform as expected.
* Hive Connector (Native Avro): 4.1.1 now uses a native C++ Avro scanner by default instead of JNI.
* Test: If you query Hive tables with Avro format, run a few complex SELECT statements to ensure data correctness and check for performance improvements.
* Timestamp Handling: For Parquet files with isAdjustedToUTC=false, StarRocks no longer shifts values by the session timezone.
* Test: If you load data via FILES() or Broker Load from Parquet, verify that timestamp columns match your expectations.
3. Data Ingestion & Metadata
* Tablet Splitting: 4.1 introduces internal changes to tablet layout.
* Test: Run a small INSERT INTO ... SELECT or STREAM LOAD to ensure the ingestion pipeline is stable.
* Re-enable Balancer: If you disabled the balancer/tablet clone during the upgrade (as recommended), re-enable it now:
sql
ADMIN SET FRONTEND CONFIG ("disable_balance" = "false");
ADMIN SET FRONTEND CONFIG ("disable_colocate_balance" = "false");
4. Performance Benchmarking
* Semi-Structured Data: 4.1 includes major optimizations for JSON and Iceberg Variant types.
* Test: If you use the VARIANT type or large JSON blobs, run performance tests. You should see significant improvements in scan speed compared to 4.0.1.
* Memory Usage: CN nodes in 4.1 have improved scan-range memory estimation. Monitor the mem_pool metrics in your EKS/Prometheus dashboard to ensure no unexpected spikes under load.
5. Critical Downgrade Note
Caution: Once you upgrade to 4.1.1, you cannot downgrade to any 4.0.x version lower than v4.0.6. The metadata layout changes in 4.1 are not backward compatible with early 4.0 releases. If you encounter issues, ensure your rollback target is at least 4.0.6.
References
• release_notes/release-4.1.md
• deployment/upgrade.md
• administration/management/resource_management/compute_node.md
_node)
References
• release_notes/release-4.0.md
• deployment/upgrade.mdRumit Jain
07/07/2026, 9:13 AMsql
ADMIN SET FRONTEND CONFIG ("disable_balance" = "false");
ADMIN SET FRONTEND CONFIG ("disable_colocate_balance" = "false"Rocky
07/07/2026, 9:13 AMdisable_balance and tablet_sched_max_scheduling_tablets = 0) is to prevent unnecessary data movement during a rolling upgrade.
* When you restart a node, the FE might think that node is "dead."
* If the balancer is on, the FE might immediately start "fixing" the cluster by copying data (tablets) from the "dead" node to other live nodes.
* When the node comes back up (upgraded), the FE then has to move data back or delete the extra copies.
* Result: This creates a lot of unnecessary Disk I/O and Network traffic during the upgrade.
2. Why it matters less for your CN setup
Since you are using CN (Compute Nodes) via Helm (likely a Shared-Data architecture on EKS):
* CNs are stateless: They do not store persistent data replicas (tablets). They only cache data from object storage (S3/GCS).
* No "Replicas" to balance: In a pure CN/Shared-Data setup, the traditional "tablet balancer" has almost nothing to do because there are no local replicas to move around.
* Conclusion: If you only have CNs and no BEs, skipping these commands likely had zero impact on your upgrade.
3. What to check now
Since you've already completed the upgrade, instead of running those commands now, you should verify the health of the cluster:
1. Check Node Health: Ensure all nodes are Alive.
sql
SHOW FRONTENDS;
SHOW COMPUTE NODES; -- or SHOW BACKENDS;
2. Check Tablet Health: (Only relevant if you have some Shared-Nothing/BE tables). Ensure there are no "Unhealthy" tablets.
sql
SHOW PROC '/statistic';
Look for the UnhealthyTabletNum column. It should be 0.
3. Check Background Tasks: Verify no massive tablet scheduling is stuck.
sql
ADMIN SHOW REPLICA STATUS FROM <your_database>.<your_table>;
Summary
You do not need to run the "re-enable" commands if you never disabled them in the first place. Your cluster defaults to false (enabled), which is the state you want for normal operation. You are good to go!
References
• deployment/upgrade.md
• administration/management/resource_management/Replica.md
• administration/management/Scale_up_down.md
• administration/management/FE_configuration.md
References
• deployment/upgrade.md
• administration/management/resource_management/Replica.md
• administration/management/Scale_up_down.md
• administration/management/FE_configuration.md
References
• deployment/upgrade.md
• administration/management/Scale_up_down.mdRumit Jain
07/07/2026, 9:50 AMRocky
07/07/2026, 9:50 AMsql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON;
Note: If you want to use a specific storage volume instead of the default one, you can specify it like this:
sql
ADMIN SET AUTOMATED CLUSTER SNAPSHOT ON STORAGE VOLUME <storage_volume_name>;
2. Set a New Interval
The snapshot interval is controlled by the FE configuration parameter automated_cluster_snapshot_interval_seconds. The default is 600 seconds (10 minutes).
To update the interval (for example, to 1 hour / 3600 seconds), run:
sql
ADMIN SET FRONTEND CONFIG ("automated_cluster_snapshot_interval_seconds" = "3600");
Verification
You can verify the current status and the snapshots being generated by querying the information schema:
sql
SELECT * FROM information_schema.cluster_snapshots;
Key Things to Know
* Trigger Mechanism: A snapshot is automatically triggered every time the FE completes a metadata checkpoint AND the specified interval has passed.
* Retention: StarRocks currently only retains one automated snapshot at a time. When a new one is successfully created, the old one is automatically purged.
* Compatibility: This feature is available starting from v3.4.2 and is only supported on Shared-Data clusters.
References
• administration/cluster_snapshot.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.mdRumit Jain
07/12/2026, 4:04 PMRocky
07/12/2026, 4:04 PM-Xmx) is set to 11g. The JVM will attempt to allocate more memory than the container is allowed to use, causing Kubernetes to kill the process.
For an FE with a limit of 8Gi, here is the recommended configuration:
1. Recommended Xmx Value
The general rule for StarRocks FE is to set Xmx to 70% of the available memory if the total memory is less than 32GB.
* Calculation: 8Gi * 0.70 ≈ 5.6Gi
* Recommendation: Set -Xmx5g or -Xmx5600m.
2. Optimized JAVA_OPTS
You should also set -Xms (starting heap) to the same value as -Xmx to avoid resizing overhead.
Updated JAVA_OPTS:
bash
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx5600m -Xms5600m -XX:+UseG1GC -Xlog:gc*:${LOG_DIR}/fe.gc.log.$DATE:time"
3. Important Additional Settings
* MALLOC_ARENA_MAX: It is highly recommended to set this environment variable in your FE container/deployment. It limits the memory arenas used by glibc, which prevents the "off-heap" memory from growing uncontrollably.
yaml
env:
• name: MALLOC_ARENA_MAX
value: "1"
* Memory Headroom: The remaining 30% (~2.4Gi) is used by the JVM for thread stacks, Direct Byte Buffers (off-heap), and the operating system/container overhead.
4. Sizing Warning
While 8Gi is functional for testing or very small clusters, StarRocks officially recommends at least 16GB of RAM for production FEs (especially if you have close to or more than 1 million tablets).
* If your metadata grows (many tables, partitions, or tablets), an 8Gi FE may experience frequent Full GCs or OOMs.
* Monitor your FE metrics: Keep an eye on jvm_heap_size_bytes vs jvm_heap_max_bytes. If usage consistently stays above 75%, you should increase the container limits to 16Gi and adjust Xmx to ~11g.
References
• faq/Others.md
• knowledge/trouble_shooting/fe_memory_problems.md
• deployment/plan_cluster.md
• administration/management/FE_configuration.md
References
• faq/Others.md
• faq/operation_maintenance_faq.md
• knowledge/trouble_shooting/fe_memory_problems.md
• deployment/plan_cluster.md
• faq/fe_mem_faq.md
• administration/management/FE_configuration.md
• quick_start/helm.mdRumit Jain
07/12/2026, 4:06 PMRocky
07/12/2026, 4:06 PMJAVA_OPTS (including -Xmx) in a running StarRocks cluster without a restart.
Because Xmx is a JVM startup parameter, it is only read when the Java process first starts. It is not a dynamic "StarRocks configuration" that can be updated via the ADMIN SET FRONTEND CONFIG command.
How to apply the change safely
Depending on how you deployed StarRocks, follow these steps to ensure no downtime:
1. Kubernetes / Helm (Highly Recommended)
Since you previously mentioned CPU/Memory "requests" and "limits," you are likely using Kubernetes.
* Action: Update your values.yaml (if using Helm) or your Deployment/StatefulSet YAML with the correct memory values.
* Result: Kubernetes will perform a rolling restart. it will terminate and restart one FE pod at a time. The cluster will remain available as long as you have at least 2 or 3 FEs.
2. Manual Deployment (Linux)
If you are running directly on virtual machines:
1. Edit fe.conf on each FE node to update the JAVA_OPTS line.
2. Restart FEs one by one:
* Start with the Follower FEs.
* Stop the FE: ./bin/stop_fe.sh
* Start the FE: ./bin/start_fe.sh --daemon
* Wait for the Follower to rejoin the cluster (check SHOW FRONTENDS).
3. Restart the Leader last: When you stop the Leader, the cluster will automatically elect one of the already-upgraded Followers as the new Leader.
Why you must restart
The JVM allocates its memory heap at the moment of initialization. There is no mechanism in Java to change the maximum heap size (-Xmx) once the process is already running.
References
• administration/management/FE_configuration.md
• faq/Others.md
• deployment/upgrade.md
• faq/Deploy_faq.md
• administration/management/BE_configuration.md
• quick_start/helm.md
References
• administration/management/FE_configuration.md
• faq/Deploy_faq.mdRumit Jain
07/12/2026, 4:15 PMRocky
07/12/2026, 4:15 PM-Xmx11g (and 8Gi limit)
You will observe an OOMKilled crash the moment the "Resident Set Size" (RSS) of the Java process exceeds the 8Gi limit.
This usually happens when:
1. Metadata Grows: As you create more tables, partitions, or tablets, the FE must keep more metadata in memory.
2. Heavy Query Planning: If you run complex queries with many joins or large metadata lookups, the FE's heap usage will spike.
3. Checkpointing: Every time the FE performs a metadata checkpoint (writing an image file), memory usage spikes as it serializes the metadata.
4. Statistics Collection: Automatic statistics collection tasks can consume significant heap memory.
Why hasn't it crashed yet?
Java only requests physical memory from the OS as needed. If your cluster is currently idle or has very little data, the FE might only be using 2-4Gi of physical RAM, even though its "limit" in the eyes of the JVM is 11Gi. It will continue running until it attempts to cross the ~7.5Gi-8Gi threshold of actual physical usage.
Scenario B: You edited the config but haven't restarted/applied it
If you only edited fe.conf or your Kubernetes YAML but did not restart the pod, the FE is still running with its old -Xmx value.
_ In this case, you won't see a crash _now*.
* However, the next time the pod restarts (e.g., a node failure, a manual restart, or an automated update), it will attempt to start with -Xmx11g.
* The danger: It might fail to start entirely (failing the cgroup memory check) or crash shortly after starting as it initializes its metadata.
How to check your current risk
Run this command on your FE node (or inside the pod) to see how much memory it is actually using right now:
bash
# Check physical memory usage (RSS)
ps -eo pid,rss,command | grep StarRocksFE
* If RSS is close to 8,000,000 (8GB), a crash is imminent.
* If RSS is low (e.g., 2GB), you are safe for the moment, but you are still in a "ticking time bomb" state.
Monitoring Metrics to watch
If you use Prometheus/Grafana, monitor these metrics:
* `jvm_heap_size_bytes`: Current heap in use.
* `starrocks_fe_residentsetsize`: Total physical memory used by the process.
Recommendation: You should plan a rolling restart during a low-traffic window. In a multi-FE cluster, a rolling restart (one by one) will not cause downtime for your users and will fix this "invisible" danger.
References
• knowledge/trouble_shooting/fe_memory_problems.md
• faq/Others.md
• administration/management/monitoring/metrics.md
• faq/fe_mem_faq.md
• administration/Meta_recovery.md
• administration/management/FE_configuration.md
• quick_start/helm.md
• deployment/plan_cluster.md
• deployment/upgrade.md
• faq/Deploy_faq.md
• knowledge/trouble_shooting/fe_memory_problems.md
• faq/fe_mem_faq.md
• administration/management/monitoring/metrics.md
• administration/Meta_recovery.mdRumit Jain
07/12/2026, 4:20 PMps -eo pid,rss,command | grep StarRocksFE
98 5181928 /lib/jvm/java-17-openjdk/bin/java -Dlog4j2.formatMsgNoLookups=true -Xmx11g -XX:+UseG1GC -Xlog:gc*:/opt/starrocks/fe/log/fe.gc.log.:time com.starrocks.StarRocksFE --host_type FQDN
1559642 1428 grep StarRocksFERocky
07/12/2026, 4:20 PMps output, here is the exact state of your "ticking time bomb":
1. Current Status: Yellow Alert
* Current Usage (RSS): 5,181,928 KB ≈ 4.94 GB
* Container Limit: 8.00 GB
* Headroom Remaining: ≈ 3.06 GB
You are currently safe because your actual data and metadata haven't forced the JVM to grow yet. However, because you told the JVM it can use up to 11 GB (-Xmx11g), it will not try to save memory or perform aggressive Garbage Collection until it's far too late.
2. When will you see the crash?
You will observe an OOMKilled crash when one of the following happens:
* Metadata Checkpoints: Every 50,000 journal entries (default), the FE creates an image of its metadata. This process involves serializing large objects and can cause a temporary memory spike of several GBs.
* Statistics Collection: StarRocks automatically collects column statistics. If you have many tables or large schemas, the "Full Statistics" collection (enabled by default) can spike heap usage during the analysis phase.
* High Query Concurrency: Each query plan requires a small amount of heap. If you hit a peak in concurrent users, the sum of these small allocations can push you over the 3GB margin.
* Schema Growth: If you perform a massive ALTER TABLE or add thousands of new partitions/tablets, the permanent memory floor will rise until it hits 8GB.
3. How to monitor the "Cliff"
Since you don't want to restart yet, you should monitor how close you are to the limit using jstat. This shows you what the JVM wants to use inside its heap:
bash
# Replace 98 with your PID
jstat -gcutil 98 1000 5
Look at the O (Old Gen) and E (Eden) columns.
* If (O + E) starts approaching 70-80%, the JVM is about to expand its physical memory footprint (RSS).
* Because your -Xmx is higher than your container limit, the JVM will request more memory from the OS/Kubernetes, and Kubernetes will instantly kill the pod without warning.
Summary
You are using 62% of your allowed memory right now. You are effectively "driving toward a cliff" with a car that thinks the road is 11 miles long, but the road actually ends at 8 miles.
Recommendation: You don't have to restart right this second, but you should perform a rolling restart (one FE at a time) during your next maintenance window or low-traffic period to change -Xmx to 5600m. This ensures the JVM "knows" where the limit is and will clean up memory before it crashes.
References
• knowledge/trouble_shooting/fe_memory_problems.md
• faq/fe_mem_faq.md
• administration/management/monitoring/metrics.md
• administration/Meta_recovery.md
• administration/management/FE_configuration.md
• faq/Deploy_faq.md
• faq/Others.md
References
• knowledge/trouble_shooting/fe_memory_problems.md
• faq/fe_mem_faq.md
• administration/management/FE_configuration.md
• administration/Meta_recovery.md
• faq/operation_maintenance_faq.md
• faq/Deploy_faq.mdRumit Jain
07/12/2026, 4:31 PMRocky
07/12/2026, 4:31 PM-Xmx to 5.6GB, you are effectively switching from a "Container Crash" (K8s OOMKill) to a "Java Crash" (JVM OutOfMemoryError).
Here is the breakdown of what will happen:
1. Will it give an error immediately?
Possibly. Your current physical usage (RSS) is 4.94 GB.
* RSS = Java Heap + Metaspace + Code Cache + Thread Stacks + Off-heap memory.
* If your Java Heap portion of that 4.94 GB is already near 4 GB, then setting a max limit of 5.6 GB gives you almost no "breathing room."
* StarRocks FE stores all metadata in the JVM heap. If your metadata (tablets, partitions, schemas) is large enough to require 5 GB of heap, then a 5.6 GB limit will cause the FE to fail to start or crash with a java.lang.OutOfMemoryError: Java heap space shortly after.
2. The "Tight Spot" Analysis
StarRocks officially recommends a minimum of 16 GB of RAM for an FE node. By running with 8 GB, you are significantly below the recommended production specs.
* Current State: You have a "fake" 11 GB heap on an 8 GB machine. As soon as the FE tries to use >8 GB, Kubernetes kills it instantly. This is bad because the FE has no time to shut down gracefully.
* Proposed State (5.6 GB): You have a "real" limit. If the FE hits 5.6 GB, the Java process will start performing "Full Garbage Collections." This will make the FE very slow (high latency), but it will not crash immediately until it truly cannot free any more memory. This is "safer" for data integrity than a hard K8s kill.
3. How to know if 5.6 GB is enough
Before you restart, check your actual heap usage (not just the RSS) using the PID 98 from your previous message:
bash
# Check GC stats (Eden + Old Gen usage)
jstat -gcutil 98 1000 3
* Look at the O column (Old Gen percentage).
* If O is 70%, then 5.6 GB is likely too small for your current metadata. Reducing the limit will cause immediate JVM OOM errors. * If O is < 40%, you can safely reduce the limit to 5.6 GB for now. Final Recommendation Reducing to 5.6 GB is a "band-aid." It prevents the dangerous K8s OOMKill, but it might reveal that your metadata is simply too big for an 8 GB container. The real fix: If
jstat shows high heap usage, you should increase the Container Memory to 16 GB and set -Xmx12g. 8 GB of RAM is extremely tight for a StarRocks FE in any production or semi-production environment.
References
• knowledge/trouble_shooting/fe_memory_problems.md
• faq/Others.md
• deployment/plan_cluster.md
• faq/fe_mem_faq.md
• administration/management/FE_configuration.md
• administration/Meta_recovery.md
• faq/operation_maintenance_faq.md
References
• knowledge/trouble_shooting/fe_memory_problems.md
• administration/Meta_recovery.md
• faq/fe_mem_faq.md
• administration/management/monitoring/metrics.md
• administration/management/resource_management/Memory_management.md
• administration/management/monitoring/Monitor_and_Alert.mdRumit Jain
07/12/2026, 4:43 PMjstat -gcutil 306 1000 3
S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT
0.00 62.46 16.67 75.10 99.40 96.95 4615 20.222 0 0.000 3040 4.429 24.651
0.00 62.46 17.36 75.10 99.40 96.95 4615 20.222 0 0.000 3040 4.429 24.651
0.00 62.46 17.36 75.10 99.40 96.95 4615 20.222 0 0.000 3040 4.429 24.651Rocky
07/12/2026, 4:43 PMjstat output, yes, reducing the heap to 5.6G will almost certainly cause immediate errors or a crash.
Here is the breakdown of why, based on your numbers:
1. The Math: Why 5.6G is too small
* Current Setting: You have -Xmx11g.
* Old Gen Usage (O): 75.10%.
* In G1GC (which you are using), this means about 75% of your currently allocated heap capacity is full of "long-lived" data (your StarRocks metadata).
* Even if we assume your JVM hasn't fully expanded to 11GB yet (since your RSS is ~5GB), your live metadata is already taking up a significant portion of that 5GB.
* If you cap the total heap at 5.6GB, after the JVM takes its share for "Survivor" spaces, "Eden" (new objects), and "Metaspace" (class data), you will likely have less than 4GB available for the Old Gen.
Result: Your 5GB+ of existing data won't fit into a 4GB space. The FE will either:
1. Fail to start (Unable to load the image file into memory).
2. Enter a "GC Death Spiral": It will spend 99% of its time doing "Full GC" to try and save space, making the FE completely unresponsive, before finally crashing with java.lang.OutOfMemoryError: GC overhead limit exceeded.
2. The Verdict: You are "Over-provisioned"
You are in a situation where your metadata is too large for an 8GB container.
_ Your metadata _needs* more than 5GB to live comfortably.
* But your Kubernetes limit is 8GB.
* The JVM -Xmx11g is "lying" to the system, allowing the FE to stay alive for now by using memory that isn't officially yours.
3. What should you do?
Do not simply lower the -Xmx to 5.6G. You will break the cluster. You have two real options:
Option A: Increase Container Memory (Recommended)
You need to give the FE more room.
1. Increase the Kubernetes memory limit to 12GB or 16GB.
2. Set -Xmx to 8G (if 12GB limit) or 12G (if 16GB limit).
3. This is the only way to support your current volume of metadata safely.
Option B: Clean up Metadata (If you can't increase RAM)
If you absolutely cannot give the FE more RAM, you must reduce what it is storing:
* Drop unused tables or partitions.
* Lower the partition retention: If you have tables with thousands of daily partitions, drop the oldest ones.
* Reduce `tablet_sched_max_scheduling_tablets`: (Though this is a minor saving).
Summary: Your jstat shows that your FE is "heavy." It is currently surviving only because it is "stealing" memory beyond your 8GB limit. If you force it to respect a 5.6GB limit, it will run out of space and fail.
References
• knowledge/trouble_shooting/fe_memory_problems.md
• faq/fe_mem_faq.md
• administration/management/FE_configuration.md
• administration/Meta_recovery.md
• deployment/plan_cluster.md
• administration/management/monitoring/metrics.md
• faq/Others.md
• administration/management/resource_management/Memory_management.md
References
• knowledge/trouble_shooting/fe_memory_problems.md
• faq/fe_mem_faq.md
• administration/management/FE_configuration.md
• deployment/plan_cluster.md
• administration/Meta_recovery.mdRumit Jain
07/13/2026, 4:59 AMRocky
07/13/2026, 4:59 AMVariant type, allowing for much faster queries on semi-structured data compared to the standard JSON-as-string approach in 4.0.
* FE Improvements:
* Fast Schema Evolution V2: More robust and faster schema change operations.
* UDF Performance: Java and Python UDFs now support more types and include optimizations like UDAF reuse across queries, reducing initialization overhead.
* Stability & Diagnostics:
* Execution Plan Dumps: If a query fails with an exception, the FE can now dump the execution plan automatically to the logs, making it much easier to debug why a query failed in 4.1.1 compared to 4.0.1.
──────────
2. How to Compare Performance
To verify these improvements in your own environment, use the following methodology:
A. Query Profile Comparison (The "Micro" View)
The most accurate way to see what improved at the engine level is to compare the Query Profile for your most critical queries.
1. Enable profiles: SET enable_profile = true;
2. Run the same query in both versions and look at:
* Scan Time: Check the HdfsScanNode or LakeScanNode. In 4.1.1, the AvroScanner or ParquetScanner should show lower CPU usage and higher throughput.
* Exchange Node: Look for reductions in data shuffling if you are using the new tablet splitting/distribution features.
* CPU/Memory Per Node: Compare the PeakMemoryUsage and CpuTime for the CN nodes.
B. Audit Log Analysis (The "Macro" View)
Compare the fe/log/fe.audit.log from before and after the upgrade.
* Metric: Average QueryTime and CPUTime.
* Tool: You can load these logs into a StarRocks table using the AuditLoader and run a SQL query to compare the 95th percentile latency of specific query patterns between the two versions.
C. Monitoring Metrics (The "Resource" View)
Check your Prometheus/Grafana dashboard for:
* FE Memory Usage: v4.1.1 includes several fixes for memory leaks (e.g., MV plan context leaks). Compare the "FE Heap Usage" over a 24-hour period.
* CN CPU Saturation: With the native scanners, you may see lower CPU utilization for the same volume of data lake queries.
* Tablet Count: If using auto-splitting, monitor the tablet_num metric to see how the cluster is rebalancing data.
3. Summary of Methodology
Goal | Method | Tool
Speed | Compare QueryTime for specific SQLs | Query Profile (enable_profile=true)
Throughput | Queries Per Second (QPS) | Grafana / Prometheus
Efficiency | CPU/Memory per million rows scanned | fe.audit.log or Grafana
Stability | Error rates and memory growth | fe.log and fe.warn.logRocky
07/13/2026, 4:59 AMRumit Jain
07/13/2026, 5:28 AMRocky
07/13/2026, 5:29 AMvalues.yaml of your Helm chart.
Pre-Upgrade Checklist
1. Metadata Backup: It is highly recommended to back up your FE metadata (specifically the image and editlog directories) before a minor version upgrade.
2. Disable Tablet Balancing: To prevent the cluster from trying to rebalance data while pods are restarting, run these SQL commands:
sql
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_scheduling_tablets" = "0");
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_balancing_tablets" = "0");
ADMIN SET FRONTEND CONFIG ("disable_balance" = "true");
ADMIN SET FRONTEND CONFIG ("disable_colocate_balance" = "true");
Upgrade Steps
1. Update the Operator (Recommended)
Before upgrading the database, ensure your StarRocks Operator is up to date to support newer engine features.
bash
helm repo update starrocks
helm upgrade starrocks-operator starrocks/operator
2. Perform the Rolling Upgrade
StarRocks requires a specific sequence: Upgrade CN nodes first, then FE nodes. The Operator handles the rolling restart once you update the image tags.
Option A: Using Helm (Recommended for GitOps/Config management)
Update your values.yaml with the new image tags:
yaml
starrocksCluster:
starRocksFeSpec:
image: "starrocks/fe-ubuntu:4.1.1" # Update tag
starRocksCnSpec:
image: "starrocks/cn-ubuntu:4.1.1" # Update tag
Then run:
bash
helm upgrade <release_name> starrocks/starrocks -f values.yaml
Option B: Using Kubectl Patch (For quick manual upgrades)
Apply the changes directly to the CR. Upgrade CNs first:
bash
# Upgrade CNs
kubectl patch starrockscluster <cluster_name> --type='merge' -p '{"spec":{"starRocksCnSpec":{"image":"starrocks/cn-ubuntu:4.1.1"}}}'
# After CNs are "Running", upgrade FEs
kubectl patch starrockscluster <cluster_name> --type='merge' -p '{"spec":{"starRocksFeSpec":{"image":"starrocks/fe-ubuntu:4.1.1"}}}'
3. Monitor the Progress
The Operator will restart pods one by one. For FEs, it will upgrade followers before the leader to maintain availability.
bash
# Monitor pod status
kubectl get pods -w
# Check StarRocks internal version status
# Run this in your SQL client:
SHOW FRONTENDS;
SHOW COMPUTE NODES;
Post-Upgrade Tasks
1. Re-enable Tablet Balancing:
Once all pods are Running and Alive in the SHOW commands:
sql
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_scheduling_tablets" = "10000");
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_balancing_tablets" = "500");
ADMIN SET FRONTEND CONFIG ("disable_balance" = "false");
ADMIN SET FRONTEND CONFIG ("disable_colocate_balance" = "false");
2. Verify Features: Version 4.1.1 introduces a native C++ Avro scanner for Hive and improved tablet splitting. Test a few external table queries to ensure the new engine is performing as expected.
Note on Downgrades: Per the v4.1 release notes, if you need to downgrade back to v4.0 later, you must use v4.0.6 or higher. Older v4.0.x versions are not compatible with the metadata changes introduced in v4.1.
References
• deployment/sr_operator.md
• deployment/upgrade.md
• quick_start/helm.md
• administration/management/FE_configuration.md
• administration/Meta_recovery.md
• administration/management/BE_configuration.mdRocky
07/13/2026, 5:29 AMRumit Jain
07/13/2026, 5:30 AMRocky
07/13/2026, 5:30 AMpodManagementPolicy field to the CRD. Since you are already on 1.11.3, your CRDs are already prepared for this architectural change.
* Minor Engine Support: StarRocks 4.1 introduces major new features like Auto Tablet Splitting and Native Avro Scanners. While the operator primarily manages pod lifecycles (image tags and restarts), newer versions of the operator (like 1.11.5) often include refined logic to handle 4.1-specific configurations or edge cases during rolling upgrades.
2. Why you should upgrade to 1.11.5
* Bug Fixes: Newer patch releases (1.11.4, 1.11.5) include stability fixes for service monitors and helm chart templating that make monitoring the new 4.1 features easier.
* Safe Path: Upgrading from 1.11.3 to 1.11.5 is a low-risk "patch" upgrade. It ensures that if the StarRocks 4.1.1 engine requires any specific pod-level environment variables or health check adjustments, the operator is aware of them.
Recommended Upgrade Sequence
If you choose to upgrade the operator, do it before you change the engine version:
1. Update Operator Helm Repo:
bash
helm repo update starrocks
2. Upgrade Operator:
bash
# This will move you from 1.11.3 to the latest (e.g., 1.11.5)
helm upgrade starrocks-operator starrocks/operator
3. Upgrade StarRocks Cluster:
Follow the steps provided previously to update your StarRocksCluster CR with the 4.1.1 image tags.
Summary: You aren't required to upgrade the operator to get 4.1.1 running (since you are already on the 1.11 line), but it is a best practice to ensure the management layer is as modern as the database engine it controls.
References
• deployment/sr_operator.md
• deployment/upgrade.md
• quick_start/helm.md
• administration/management/FE_configuration.md
• administration/Meta_recovery.md
• administration/management/BE_configuration.md
• administration/management/resource_management/Memory_management.md
• faq/fe_mem_faq.md
• faq/Deploy_faq.md
• deployment/plan_cluster.mdRumit Jain
07/13/2026, 5:40 AMRocky
07/13/2026, 5:40 AMfe-proxy component is not a custom StarRocks binary but a standardized NGINX deployment configured to act as a reverse proxy for your FE nodes.
According to the latest Helm chart (kube-starrocks 1.11.x) and the StarRocks Operator specifications:
* Default Image: nginx:1.24.0
* Recommended Update: nginx:1.27.2 (Several recent bug fixes in the StarRocks Helm chart and community issues have noted that version 1.27.2 provides better stability for DNS resolution and header handling in newer Kubernetes environments).
Recommended values.yaml Configuration
When updating your cluster to 4.1.1, your feProxy configuration should look like this:
yaml
starrocksFeProxySpec:
enabled: true
replicas: 1
image:
repository: "nginx"
tag: "1.27.2" # Recommended for stability with Operator 1.11.5
resources:
requests:
cpu: 100m
memory: 200Mi
limits:
cpu: 1
memory: 1Gi
Key Considerations for 4.1.1
1. Shared-Data Mode: If you are running in shared-data mode (using CN nodes), the fe-proxy is critical because it ensures that the Stream Load and Query requests are routed to the current FE Leader.
2. Operator 1.11.5 Compatibility: This version of the operator improved how the proxy handles DNS resolution (resolver field). If you have a custom DNS setup in your EKS cluster, ensure the resolver in your values.yaml is quoted correctly (e.g., resolver: "kube-dns.kube-system.svc.cluster.local").
3. Upgrade Sequence: Since you are already upgrading the Operator and the main engine, you can update the fe-proxy image at the same time as your FE nodes in your Helm upgrade command. The Operator will recreate the proxy pod to point to the new FE versions.
Summary: There is no "4.1.1" version of the proxy itself. Use nginx:1.27.2 for the best compatibility with your updated StarRocks 4.1.1 features.
References
• faq/operation_maintenance_faq.md
• administration/management/resource_management/Load_balance.md
• deployment/deploy_manually.md
• deployment/downgrade.md
• deployment/sr_operator.mdRumit Jain
07/13/2026, 5:44 AMRocky
07/13/2026, 5:44 AMfe-proxy component (e.g., nginx:1.28.0 or bitnami/nginx:1.28.0).
If your fe-proxy is already on 1.28.0, you are in a good position:
1. Keep 1.28.0: There is no need to change or "downgrade" your proxy version to 1.27.x. NGINX 1.28.0 is a stable release that is fully compatible with StarRocks 4.1.1. It includes important performance and security updates that work well with the Operator 1.11.5.
2. Focus on the Engine: You should still proceed with updating the FE and CN images from 4.0.1 to 4.1.1. The proxy component is versioned independently of the database engine.
3. Operator 1.11.5: This version of the operator is designed to manage exactly this kind of setup. It will correctly handle the routing from your 1.28.0 proxy pods to the new 4.1.1 FE pods.
Updated values.yaml snippet for your case:
You can leave your proxy tag as is while updating the others:
yaml
starrocksCluster:
starRocksFeSpec:
image: "starrocks/fe-ubuntu:4.1.1" # Update this
starRocksCnSpec:
image: "starrocks/cn-ubuntu:4.1.1" # Update this
starRocksFeProxySpec:
enabled: true
image:
repository: "nginx" # or your specific registry
tag: "1.28.0" # Keep your current version
Pro-tip for EKS
Since you are on EKS, if you experience any 502 Bad Gateway errors after the FE pods restart with the new version, check that the resolver in your proxy configuration is explicitly set to the Kubernetes DNS service:
yaml
starRocksFeProxySpec:
resolver: "kube-dns.kube-system.svc.cluster.local"
This ensures NGINX can re-resolve the FE service IPs immediately as the rolling upgrade completes.
References
• deployment/sr_operator.md
• deployment/upgrade.md
• quick_start/helm.md
• administration/management/FE_configuration.md
• administration/Meta_recovery.md
• administration/management/BE_configuration.md
• administration/management/resource_management/Memory_management.md
• faq/fe_mem_faq.md
• faq/Deploy_faq.md
• deployment/plan_cluster.md
References
• faq/operation_maintenance_faq.md
• quick_start/helm.md
• administration/management/resource_management/Load_balance.md
• deployment/downgrade.mdRumit Jain
07/13/2026, 8:37 AMRumit Jain
07/13/2026, 8:37 AMRocky
07/13/2026, 8:38 AMbash
helm repo update starrocks
helm upgrade starrocks-operator starrocks/operator --version 1.11.5
2. Upgrade the Compute Nodes (CN)
Why: You must upgrade the data-processing layer (BE or CN) before the control layer (FE). This ensures that when the FE is upgraded and starts sending new types of requests or metadata, the CNs already understand them.
* Action: Update the image field for starRocksCnSpec in your StarRocksCluster CR.
* Monitoring: Wait for all CN pods to reach the Ready state and for kubectl get starrockscluster to show the CN component as Running.
3. Upgrade the Frontend Nodes (FE)
Why: Once the processing layer is updated, you can safely upgrade the FEs. The operator will automatically perform a rolling upgrade, starting with Follower FEs and ending with the Leader FE to maintain cluster availability.
* Action: Update the image field for starRocksFeSpec in your StarRocksCluster CR.
* Monitoring: Monitor the pods. The Leader FE will be the last to restart.
4. Verify the Upgrade
Once all pods are back up, log into StarRocks and verify the versions:
sql
SELECT * FROM information_schema.be_nodes; -- Check CN versions
SHOW FRONTENDS; -- Check FE versions
Summary of Best Practices
* Sequential Patching: Even if you use a single helm upgrade for the whole cluster, it is safer to update the CN image first, wait for completion, and then update the FE image in a second step.
* Proxy Node: The fe-proxy (NGINX) can be updated at any time, but it is typically updated alongside the FEs.
* Metadata Backup: Before starting, it is a general best practice to ensure you have a backup or snapshot of your FE metadata (the meta directory), though the operator handles rolling upgrades gracefully.
References
• deployment/sr_operator.md
• deployment/upgrade.md
• administration/management/graceful_exit.md
• faq/Deploy_faq.md
• administration/management/resource_management/Load_balance.md
• deployment/deploy_manually.md
• deployment/downgrade.md
• faq/operation_maintenance_faq.md
References
• loading/s3.md
• loading/Loading_data_template.md
• sql-reference/sql-functions/table-functions/files.mdRumit Jain
07/13/2026, 8:45 AMRocky
07/13/2026, 8:45 AMfe-proxy.
* Leader Last: The Leader FE is upgraded last. When the Leader shuts down, a Leader Election occurs.
* If you have 3+ FEs: One of the already-upgraded Followers will become the new Leader. There is a very brief window (usually a few seconds) where write operations (like INSERT or LOAD) might fail or time out while the new Leader is elected.
* Read Traffic: If you are using the fe-proxy (NGINX), it will automatically detect the FE health status and route traffic away from the node being restarted, maintaining read availability.
Summary: Is there Downtime?
* With 3 FEs and 2+ CNs: No downtime for reads; a few seconds of "write pause" during the Leader election.
* With 1 FE: Yes, there will be downtime. Since there is no other node to take over the Leader role, the cluster will be unavailable while the single FE pod restarts.
Best Practices to Ensure Zero Downtime:
1. Check Replicas: Ensure starRocksFeSpec.replicas is at least 3 and starRocksCnSpec.replicas is at least 2.
2. Graceful Shutdown: Ensure you haven't disabled graceful shutdown. The default settings in Operator 1.11.5 are optimized for this.
3. Upgrade Sequence: As mentioned before, always do CN first, then FE. If you apply both changes to the YAML at the same time, the Operator is smart enough to sequence them, but doing them one by one allows you to verify stability at each step.
References
• administration/management/graceful_exit.md
• deployment/upgrade.md
• deployment/sr_operator.md
• administration/management/resource_management/Load_balance.md
• faq/operation_maintenance_faq.md
• deployment/downgrade.md
• faq/Deploy_faq.md
• administration/Meta_recovery.md
• deployment/deploy_manually.md
References
• administration/management/graceful_exit.md
• deployment/upgrade.md
• deployment/sr_operator.mdRocky
07/13/2026, 8:45 AMRumit Jain
07/13/2026, 9:18 AMADMIN SET FRONTEND CONFIG ("tablet_sched_max_scheduling_tablets" = "0");
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_balancing_tablets" = "0");
ADMIN SET FRONTEND CONFIG ("disable_balance" = "true");
ADMIN SET FRONTEND CONFIG ("disable_colocate_balance" = "true");Rocky
07/13/2026, 9:18 AMdisable_balance & `disable_colocate_balance`: Stop StarRocks from moving data between nodes to "even out" the disk usage.
* tablet_sched_max_scheduling_tablets = "0": Stops the FE from scheduling any new tablet repair or replica-creation tasks.
Why you should run them before upgrading
When you perform a rolling upgrade, you are taking nodes (CNs/BEs) offline one by one.
1. Without these commands, when a CN pod restarts, the Leader FE might think the node has failed.
2. The FE would then try to "repair" the cluster by copying all the data from that "missing" node to other nodes.
3. This creates a massive amount of unnecessary network and disk I/O (IOPS), which can slow down your actual queries.
By setting these to 0 or true, you tell the FE: "I know nodes are going offline; please don't try to move data around right now."
Is there any risk?
* No Read/Write Impact: These commands do not stop users from querying or loading data.
* Transient State: The only "risk" is that if a node actually fails during the upgrade, the cluster won't automatically repair its replicas until you turn these settings back on. Since you are actively monitoring the upgrade, this is acceptable.
Important: Remember to Reverse Them
Once the upgrade is finished and all your pods (FE and CN) are Running and Alive, you must set them back to their defaults so that the cluster can resume healthy background maintenance.
Post-Upgrade Commands:
sql
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_scheduling_tablets" = "10000");
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_balancing_tablets" = "500");
ADMIN SET FRONTEND CONFIG ("disable_balance" = "false");
ADMIN SET FRONTEND CONFIG ("disable_colocate_balance" = "false");
References
• deployment/upgrade.md
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.md
• administration/management/resource_management/Load_balance.md
• deployment/sr_operator.md
• administration/management/resource_management/Replica.md
• administration/management/Scale_up_down.md
• faq/Deploy_faq.md
• deployment/downgrade.md
References
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.mdRumit Jain
07/13/2026, 9:26 AMERROR 1064 (HY000): couldn't deserialize thrift msg:
invalid TType backend [id=10023] [Rocky
07/13/2026, 9:26 AMcouldn't deserialize thrift msg: invalid TType backend [id=10023] indicates a Thrift protocol mismatch between your FE and the upgraded CN. This is happening because StarRocks 4.1.1 introduced internal changes to the communication protocol and metadata structures (specifically related to new features like Multi-tenant Range-based Tablet Auto-splitting) that the StarRocks 4.0.1 Frontend (FE) does not recognize.
Why this is happening
While StarRocks generally supports rolling upgrades (BE/CN first, then FE), some minor version jumps contain "breaking" changes in the internal Thrift serialization.
According to the StarRocks 4.1 Release Notes:
* Version 4.1 contains significant changes to data layout and tablet distribution metadata.
* Compatibility Requirement: A "bridge" version is required. Specifically, StarRocks 4.1 is only backward compatible with v4.0.6 or later.
* Because you are coming from 4.0.1, the FE lacks the necessary logic to "ignore" or correctly parse the new fields (like id=10023) being sent by the 4.1.1 CN.
How to Resolve This
Option 1: Complete the FE Upgrade (Fastest Fix)
Since you have already upgraded the CNs to 4.1.1, your cluster is currently in a "split-brain" protocol state. The most direct way to fix the deserialization error is to upgrade your FE pods to 4.1.1 immediately. Once the FE is on 4.1.1, it will understand the new Thrift message format used by the CNs.
* Action: Update your StarRocksCluster CR to change the FE image to 4.1.1.
* Note: You may see some query failures until the Leader FE has finished its restart.
Option 2: The "Safe" Upgrade Path (Recommended for future)
If you were to restart the process or if Option 1 fails, the documented safe path for this specific jump is:
1. Upgrade 4.0.1 $\to$ 4.0.9 (or the latest 4.0.x patch). This version contains the compatibility "shims" for the 4.1 metadata.
2. Verify the cluster is stable.
3. Upgrade 4.0.9 $\to$ 4.1.1 (CNs first, then FEs).
Critical Warning: Do Not Downgrade
Do not attempt to downgrade the CNs back to 4.0.1. The 4.1.1 nodes may have already initialized or modified metadata/storage structures that are incompatible with 4.0.1. Downgrading to any version below 4.0.6 from 4.1.1 is explicitly unsupported and can lead to metadata corruption or FE crashes.
Summary: Your 4.0.1 FE is simply too old to "talk" to a 4.1.1 CN. Proceed with upgrading your FE nodes to 4.1.1 to restore communication.
References
• deployment/upgrade.md
• release_notes/release-4.1.md (Draft/Internal reference for v4.1 compatibility)
• faq/operation_maintenance_faq.md
• administration/Meta_recovery.md
• deployment/downgrade.md
References
• deployment/upgrade.md
• faq/operation_maintenance_faq.md
• administration/Meta_recovery.md
• deployment/downgrade.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.md
• developers/type_checker_xml_configuration.md
• faq/Deploy_faq.md
• release_notes/release-4.0.md
References
• deployment/upgrade.mdRocky
07/13/2026, 9:26 AMRumit Jain
07/14/2026, 5:02 AMRocky
07/14/2026, 5:03 AMALTER TABLE.
* You want to simplify Table Design: You no longer have to guess the number of BUCKETS at table creation. The system manages it dynamically.
3. How to enable it
This feature is opt-in (it is false by default in most 4.1.x deployments to ensure backward compatibility). To use it, you must set the following configurations:
Global/Session Variable:
sql
-- Enables the range-based distribution logic
SET GLOBAL enable_range_distribution = true;
Table Creation:
When creating a table, you use DISTRIBUTED BY RANGE instead of HASH.
sql
CREATE TABLE my_table ( ... )
DISTRIBUTED BY RANGE(tenant_id) -- New syntax in 4.1
PROPERTIES ("replication_num" = "3");
4. Key Parameters to Watch
If you do enable it, these FE configurations control the behavior:
* tablet_reshard_target_size: (Default 10GB) The size at which a tablet will trigger an automatic split.
* enable_tablet_merge: (Default false) Whether to merge small tablets back together if data is deleted. This is usually kept off unless you have significant data churn.
* tablet_reshard_max_parallel_tablets: Limits how many split operations can happen at once to prevent overloading the FE.
Summary Recommendation
* For existing tables: Keep your current configuration. Enabling this would require recreating the table or a major ALTER.
* For new tables (Shared-data): Enable it. It solves the "fixed bucket count" problem that often causes performance degradation as data grows.
* For Shared-nothing (Local Disk): This feature is primarily optimized for the Shared-data architecture; check your specific build's documentation if you are not on Cloud-Native.
References
• release_notes/release-4.1.md
• table_design/data_distribution/Data_distribution.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/data-definition/CREATE_TABLE.md
References
• administration/management/FE_configuration.md
• sql-reference/System_variable.md
• administration/management/BE_configuration.md
• administration/management/compaction.mdRumit Jain
07/14/2026, 5:08 AMRocky
07/14/2026, 5:08 AMBUCKETS guessing)
In older versions, you had to manually estimate the number of BUCKETS at table creation.
* Without Auto-splitting: If you guessed 10 buckets and your data grew 100x, those 10 tablets would become massive, leading to slow queries and compaction "deaths."
* With Auto-splitting: You can stop worrying about the bucket count. StarRocks will start with a small number of tablets and automatically split them as they reach a target size (typically 10GB–100GB). This is ideal for EKS, where you want the system to handle growth automatically.
2. Elimination of Data Skew & Hotspots
In EKS, if one CN pod is handling a "whale" tenant (a massive amount of data in one hash bucket), that specific pod will see high CPU and memory usage while others sit idle.
* Benefit: Range-based distribution detects these "hot" tablets and splits them. This redistributes the work across your other CN pods, ensuring all EKS nodes are utilized evenly.
3. Optimized for Multi-tenancy
If you host multiple customers/tenants in one table:
* Small Tenants: Stay within a single tablet. This provides Data Locality, making queries for small customers lightning-fast because the CN doesn't have to talk to other nodes.
* Large Tenants: Their data is automatically spread across multiple tablets and multiple CNs, providing the parallel processing power needed for large-scale scans.
4. Reduced FE & EKS Resource Pressure
Legacy StarRocks aimed for 1GB tablets. A 100TB cluster would result in 100,000+ tablets, which puts massive memory pressure on your FE pods and slows down EKS rolling updates.
* Benefit: 4.1.1 supports Large-Capacity Tablets (targeting 100GB). By having fewer, larger tablets:
* The FE metadata stays small and fast.
* Ingestion is more stable because there are fewer memtables to manage in CN memory.
* Compaction overhead on your CN pods is significantly reduced.
5. Perfect for KEDA/Autoscaling
Since you are on EKS, you likely want to scale CNs up and down based on load (e.g., using KEDA).
* Benefit: Range-based distribution makes the "Compute-Storage separation" even more effective. When you add new CN pods, the system can more intelligently balance the newly split tablets to those pods, ensuring your new capacity is put to work immediately without manual REOPTIMIZE commands.
How to use it on 4.1.1
To take advantage of this, ensure your FE config enable_range_distribution is true, and define your new tables using the range syntax:
sql
-- Enable the feature
ADMIN SET FRONTEND CONFIG ("enable_range_distribution" = "true");
-- Create a table that auto-manages its own buckets
CREATE TABLE orders (
order_id BIGINT,
tenant_id INT,
...
)
DUPLICATE KEY(order_id)
DISTRIBUTED BY RANGE(order_id); -- This triggers the auto-splitting logic
Recommendation: For your EKS cluster, this feature reduces the operational "to-do" list for your platform team and makes the cluster much more resilient to unpredictable data growth.
References
• release_notes/release-4.1.md
• table_design/data_distribution/Data_distribution.md
• deployment/shared_data/s3.md
• administration/management/FE_configuration.md
ReferencesRumit Jain
07/14/2026, 5:16 AMRocky
07/14/2026, 5:16 AMsql
-- Enables the range-based distribution feature globally
ADMIN SET FRONTEND CONFIG ("enable_range_distribution" = "true");
-- (Optional) Adjust the target size for splitting.
-- The default is 10GB, which is a good balance for EKS.
ADMIN SET FRONTEND CONFIG ("tablet_reshard_target_size" = "10737418240");
Phase B: Table Adoption
The impact on your existing tables depends on how you want them to behave:
* For New Tables: You can simply omit the DISTRIBUTED BY clause. If enable_range_distribution is true, StarRocks will automatically use Range-based distribution using the table's Key columns.
* For Existing Hash Tables:
* Automatic Split: One of the major "hidden" benefits of 4.1.x in shared-data mode is that the system can now split existing large tablets into smaller ones to improve parallel processing, even if they were originally HASH distributed.
* Full Migration: To get the full multi-tenant range benefits (where data is physically ordered by a specific key across tablets), you typically need to recreate the table with DISTRIBUTED BY RANGE(column_name). However, for most users, simply enabling the feature and letting the system manage tablet sizes is enough.
──────────
2. Impact on Your Cluster
Resource Consumption (CN Pods)
* Background Load: Tablet splitting is a background task. When a tablet exceeds the target size (e.g., 10GB), the CN will split it. In a shared-data (EKS) architecture, this is very efficient because the data stays in S3; the CN only needs to rewrite small amounts of metadata and some data files.
* CPU/Memory: You may see a temporary 10–15% spike in CN CPU usage when a massive "whale" tablet is being split. On EKS, ensure your resources.requests are high enough so these background tasks don't cause OOM kills during heavy ingestion.
Query Performance
* Short-term: During a split, there is no downtime. The old tablet remains readable until the new "child" tablets are ready.
* Long-term: You will see improved query performance, especially for large scans, because your data will be more evenly spread across your EKS pods.
FE Metadata Memory
* Memory Growth: If you have 100TB of data and move from 100GB tablets to 10GB tablets, you will have 10x more tablets. Each tablet adds a small amount of memory overhead to the FE. Since you are on EKS, monitor your FE pod memory usage after enabling this.
Summary Checklist for EKS
1. Upgrade FE and CN to 4.1.1 (already done).
2. Enable enable_range_distribution via ADMIN SET FRONTEND CONFIG.
3. Monitor FE Memory: Ensure your FE pods have enough headroom for a potential increase in tablet count.
4. Test on one table: If you have a particularly "skewed" table, try recreating it as DISTRIBUTED BY RANGE to see the performance difference.
Caution: While the 4.1 release notes mention "automatic splitting without re-ingestion," this specifically refers to the shared-data (Lake) backend's ability to reshard. For shared-nothing (local disk), you still generally need an ALTER or `INSERT INTO`INSERT INTO ... `INSERT INTO`REOPTIMIZE operation. Since you are on CN/EKS (Shared-data), you are in the best position to use this feature with minimal effort.
References
• table_design/data_distribution/Data_distribution.mdRocky
07/14/2026, 5:16 AMRumit Jain
07/14/2026, 5:26 AMRocky
07/14/2026, 5:26 AMenable_range_distribution = true) in StarRocks 4.1.1 but do not alter your existing tables or create new ones, the immediate impact is minimal, but there are important "under-the-hood" changes to be aware of:
1. No Immediate Change for Balanced Tables
If your existing tables have healthy tablet sizes (typically under 10GB) and no significant data skew, nothing will happen immediately. Your tables will continue to function exactly as they do now using their existing HASH or RANDOM distribution.
2. Automatic "Rescue" for Oversized Tablets
The most significant part of the 4.1.1 update for existing users is that this feature allows the system to split oversized tablets in the background, even on existing tables.
* What happens: If you have an existing HASH-distributed table where one "bucket" has grown to 50GB or 100GB, StarRocks now has the permission to split that single tablet into two or more smaller tablets.
* The Benefit: This happens without any SQL changes or re-ingestion. It helps "rescue" old tables that were created with too few buckets, improving their query parallelism and preventing compaction bottlenecks.
* The Cost: This is a background task. You might see a slight increase in CN CPU and I/O during the split, but it is designed to be low-impact.
3. "Auto-Bucket" Logic for Altered Partitions
If you have existing partitioned tables and you add new partitions (e.g., a new day's worth of data), the system will use the new range-based logic for those new partitions if the table was originally set to use "Auto-Bucketing."
* If your existing table has a fixed bucket count (e.g., DISTRIBUTED BY HASH(id) BUCKETS 10), new partitions will still respect that fixed count of 10.
* If the table was created without a bucket count (using the system default), new partitions will now benefit from the more intelligent range-splitting logic.
4. Background Metadata Overhead
Once enabled, the Frontend (FE) will start monitoring tablet sizes against the tablet_reshard_target_size (default 10GB).
* Impact: There is a very slight increase in FE metadata management overhead as it now has to evaluate whether tablets need splitting. For a standard cluster, this is negligible.
Summary: What if you do nothing?
* If your data is "healthy": You won't notice anything. The feature sits dormant as a safety net.
* If you have "whale" tablets (oversized): The system will start splitting them into smaller, more manageable pieces. This is generally a positive impact because it fixes performance issues you might not have realized you had.
* Risk: The only risk is if your FE pods are already at 95%+ memory utilization. Splitting tablets creates more tablet metadata, which consumes FE memory. If you have millions of tablets, monitor FE memory after enabling the flag.
Recommendation: If your cluster is running well, you don't need to do anything. However, enabling the flag is a "set and forget" way to ensure that as your data grows, StarRocks will automatically prevent your tablets from becoming too large to process-heavy.
References
• table_design/data_distribution/Data_distribution.md
• release_notes/release-4.1.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/table_bucket_part_index/ALTER_TABLE.md
References
• best_practices/query_tuning/schema_tuning.md
• table_design/data_distribution/dynamic_partitioning.mdRocky
07/14/2026, 5:26 AMRumit Jain
07/14/2026, 5:29 AMIf your existing table has a fixed bucket count (e.g., DISTRIBUTED BY HASH(id) BUCKETS 10), new partitions will still respect that fixed count of 10.Rocky
07/14/2026, 5:29 AMCREATE TABLE statement.
sql
SHOW CREATE TABLE your_table_name;
* Fixed Buckets: You will see BUCKETS followed by a specific number.
_ _Example:* DISTRIBUTED BY HASH(id) BUCKETS 20
* Impact: New partitions will always have exactly 20 buckets.
* Auto-Bucketing: You will see the DISTRIBUTED BY clause without the BUCKETS keyword, or you might see a dynamic distribution.
_ _Example:* DISTRIBUTED BY HASH(id) (No BUCKETS keyword)
* Impact: StarRocks will automatically calculate the number of buckets for new partitions based on the data volume.
──────────
Method 2: Check Existing Partitions
If you have a partitioned table, you can check if different partitions have different bucket counts. If they vary, it is a clear sign that auto-bucketing is active.
sql
SHOW PARTITIONS FROM your_table_name;
Look at the Buckets column in the output:
* If all rows have the exact same number (e.g., 32, 32, 32...), the table likely has a fixed bucket count.
* If the numbers vary (e.g., 5, 10, 40...), the table is using auto-bucketing.
──────────
How it relates to the 4.1.1 "Auto-splitting"
In version 4.1.1, the Range-based Tablet Auto-splitting feature changes how the system handles the distribution:
1. If you have BUCKETS 10 (Fixed): The system is "locked" into 10 buckets for every new partition. Even if you enable the 4.1.1 feature, it will respect your manual setting of 10.
2. If you have no BUCKETS (Auto): With the 4.1.1 feature enabled, StarRocks will use the new "Range Distribution" logic. Instead of just picking a starting bucket count, it will actively split tablets as they grow past your target size (e.g., 10GB).
Recommendation: If you see a fixed number in SHOW CREATE TABLE but want the benefits of auto-splitting, you can modify the table to remove the fixed bucket constraint (supported in later versions via ALTER TABLE) or simply omit the BUCKETS clause when creating new tables.
References
• table_design/data_distribution/Data_distribution.md
• table_design/StarRocks_table_design.mdRumit Jain
07/14/2026, 6:25 AMSHOW CREATE TABLE b2bopusmetricstransactionlifecycle\G;
*************************** 1. row ***************************
Table: b2bopusmetricstransactionlifecycle
Create Table: CREATE TABLE `ABC_TABLE` (
`_schemaversion` int(11) NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`_schemaversion`, `_dataversion`, `_createdbyuserid`)
COMMENT "OLAP"
DISTRIBUTED BY RANDOM
PROPERTIES (
"bucket_size" = "1073741824",
"cloud_native_fast_schema_evolution_v2" = "false",
"compression" = "LZ4",
"datacache.enable" = "true",
"enable_async_write_back" = "false",
"file_bundling" = "true",
"replication_num" = "1",
"storage_volume" = "builtin_storage_volume"
);
1 row in set (0.04 sec)Rocky
07/14/2026, 6:25 AMSHOW CREATE TABLE output:
1. Proof of Auto-Bucketing
* Missing BUCKETS keyword: In your DISTRIBUTED BY RANDOM clause, there is no specific number (like BUCKETS 10). This tells StarRocks to manage the bucket count itself.
* bucket_size Property: You have "bucket_size" = "1073741824" (which is exactly 1 GB). This property explicitly tells StarRocks: "Every time this table gets ~1GB of new data, automatically create a new bucket/tablet."
2. What this means for your existing table
Since this table is already "Auto," enabling the new 4.1.1 features will have the following effect:
* Existing Behavior: Currently, StarRocks adds new buckets primarily during data loading. If a single load is very large, it adds more buckets to handle that load.
* New 4.1.1 Behavior (The Impact): With the new feature enabled, StarRocks becomes even more aggressive. If an existing tablet (bucket) grows too large over time (e.g., due to many small loads or background compaction), the system can now split that tablet into two in the background.
* The "Random" Factor: Because your table is DISTRIBUTED BY RANDOM, it doesn't have a specific key to "split" by. StarRocks handles this internally by just dividing the data files. This makes your table very resilient to data skew.
3. Summary of your Setup
Feature | Your Table's Status
Fixed Buckets? | No. (It is dynamic)
Manual Intervention needed? | No. You have already followed best practices by using bucket_size.
Distribution Method | Random. (Ideal for log-style data in Duplicate Key tables, but doesn't support things like Colocate Joins).
Conclusion: Your table is already set up to be "hands-off." You don't need to change anything in the schema for this table to benefit from 4.1.1; the system will simply gain more "intelligence" on when and how to split these 1GB buckets if they become inefficient.
References
• table_design/data_distribution/Data_distribution.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
References
• table_design/data_distribution/Data_distribution.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.mdRumit Jain
07/14/2026, 6:59 AMenable_range_distribution during the 4.1.1 upgrade, but it will only apply to newly created tables. Existing tables will not automatically gain tablet splitting. If we want existing tables to use the new tablet resharding capability, we'll need a separate migration plan to recreate those tables using the new distribution model.Rocky
07/14/2026, 7:00 AMenable_range_distribution is turned on (specifically tables where you don't define a DISTRIBUTED BY clause).
Existing tables that were created with DISTRIBUTED BY HASH or DISTRIBUTED BY RANDOM will not automatically switch their underlying distribution logic to "Range-based."
What is FALSE: "Existing Tables will not gain Tablet Splitting"
This is the part that is actually more flexible than your statement suggests. StarRocks 4.1.1 introduces Background Tablet Resharding for shared-data clusters.
1. Automatic Splitting for Existing Tables: The release notes and documentation for 4.1 state that once the feature is enabled, the system can automatically split tablets that exceed the tablet_reshard_target_size (default 10GB) without requiring data re-ingestion or SQL modifications.
2. The Catch: While the system can split tablets on existing tables, the efficiency and behavior depend on the distribution type. Range-based tables (the new ones) are the "first-class citizens" of this feature and split most naturally. However, the system is designed to help "rescue" existing oversized tablets regardless of their original creation date.
How this affects your specific table (DISTRIBUTED BY RANDOM)
Since your table already uses DISTRIBUTED BY RANDOM with a bucket_size property:
* You do NOT need a migration plan. Your table is already using a form of "Auto-Bucketing."
* New Partitions: If you add new data/partitions, StarRocks already calculates the bucket count for you.
* Splitting: The new 4.1.1 logic will simply monitor your existing "Random" tablets. If one grows to 50GB (exceeding the 10GB target), the system can split it in the background into smaller tablets to maintain performance. You do not need to recreate the table to get this protection.
Summary Verdict
* Do you need to recreate tables? Generally, No. The system is designed to handle splitting on existing tables to avoid exactly the "migration headache" you are describing.
* Do you need to alter tables? Only if you want to switch an old "Fixed Bucket" table (e.g., BUCKETS 10) to use the new auto-logic. Since your table is already RANDOM (not fixed), you are already set.
Recommendation: You can safely enable the flag during the upgrade. Your existing tables will gain the "safety net" of background tablet splitting if they grow too large, without you having to lift a finger or move any data.
References
• release_notes/release-4.1.md
• table_design/data_distribution/Data_distribution.md
• administration/management/FE_configuration.md
• table_design/StarRocks_table_design.md
References
• table_design/data_distribution/Data_distribution.mdRumit Jain
07/14/2026, 7:09 AMtablet_reshard_target_size (or temporarily lower the threshold in a test cluster) and verify that a split job is created. That gives you concrete evidence that the feature is working before rolling it out in production.Rocky
07/14/2026, 7:10 AMtablet_reshard_target_size and verify that the auto-splitting feature is working in StarRocks 4.1.1, follow these steps:
1. How to check tablet_reshard_target_size
This is a Frontend (FE) configuration parameter. You can view its current value using the ADMIN SHOW CONFIG command:
sql
ADMIN SHOW CONFIG LIKE 'tablet_reshard_target_size';
* Default Value: 10,737,418,240 (which is 10 GB).
* Other relevant configs:
* `tablet_reshard_max_parallel_tablets`: Controls how many split/merge tasks can run at once.
* `tablet_reshard_enable_tablet_merge`: Controls whether the system will also merge small tablets (often default false).
──────────
2. How to verify that a split job is created
You can verify the feature is working by temporarily lowering the threshold in a test environment and monitoring the background jobs.
Step A: Lower the threshold (for testing)
If you don't want to wait for a tablet to reach 10GB, you can lower the threshold to something very small (e.g., 100MB) to trigger it quickly:
sql
ADMIN SET FRONTEND CONFIG ("tablet_reshard_target_size" = "104857600");
Step B: Monitor the Jobs
StarRocks treats automatic resharding/splitting as an "Optimize" type of Alter task. You can check the progress of these background jobs with:
sql
SHOW ALTER TABLE OPTIMIZE;
Look for tasks where the State is RUNNING or FINISHED. The Msg or Type column will indicate if it was a tablet resharding/split operation.
Step C: Observe Tablet Counts
You can also see the "evidence" by looking at the partition metadata before and after your data load:
sql
-- Check the 'Buckets' column
SHOW PARTITIONS FROM your_table_name;
-- Count the actual tablets
SHOW TABLET FROM your_table_name;
If the feature is working, you will see the Buckets count for a partition increase automatically once the data volume exceeds your configured tablet_reshard_target_size.
──────────
Summary Checklist for your 4.1.1 Upgrade:
1. Shared-Data Cluster: Since your table uses storage_volume, you are on a shared-data cluster where this feature is most powerful (it performs background resharding without moving data on local disks).
2. No Manual Migration: You do not need to recreate your table. Because you are already using DISTRIBUTED BY RANDOM with a bucket_size property, the 4.1.1 FE will simply take over the management of those tablets and split them if they grow too large.
3. Audit: If you want to see exactly when a split happened, you can also check the FE leader logs (fe.log) for keywords like TabletReshard or SplitTablet.
References
• sql-reference/sql-statements/table_bucket_part_index/SHOW_ALTER.md
• release_notes/release-4.1.md
• administration/management/FE_configuration.md
References
• sql-reference/sql-statements/table_bucket_part_index/SHOW_ALTER.md
• sql-reference/sql-statements/table_bucket_part_index/ALTER_TABLE.md
• sql-reference/sql-statements/table_bucket_part_index/SHOW_PARTITIONS.md
• sql-reference/sql-statements/table_bucket_part_index/SHOW_TABLET.mdRumit Jain
07/14/2026, 7:12 AMADMIN SHOW CONFIG LIKE 'tablet_reshard_target_size';
ERROR 1064 (HY000): Getting syntax error at line 1, column 11. Detail message: No viable statement for input 'ADMIN SHOW CONFIG'.Rocky
07/14/2026, 7:12 AMFRONTEND was missing from the command. In StarRocks, configuration commands distinguish between Frontend (FE) and Backend (BE) levels.
1. Correct Syntax to Check Configuration
Use the following command to check the resharding parameters in StarRocks 4.1.1:
sql
ADMIN SHOW FRONTEND CONFIG LIKE 'tablet_reshard_target_size';
Relevant parameters you will see:
* tablet_reshard_target_size: The size threshold (default 10GB) that triggers a tablet split.
* tablet_reshard_max_parallel_tablets: The maximum number of concurrent split/merge tasks allowed in the cluster (default 10240).
* tablet_reshard_enable_tablet_merge: Whether the system is allowed to merge small tablets (usually false by default in 4.1.1).
──────────
2. Verified Test Plan for 4.1.1
Your proposed test plan is the recommended way to verify the feature. Here is the exact sequence to run in a test environment:
Step 1: Lower the threshold to 100MB (so you don't have to wait for 10GB)
sql
ADMIN SET FRONTEND CONFIG ("tablet_reshard_target_size" = "104857600");
Step 2: Ingest data into your table
Perform a STREAM LOAD or INSERT INTO that puts more than 100MB of data into a single partition/tablet.
Step 3: Monitor for background resharding jobs
StarRocks runs these as OPTIMIZE tasks. You can see them with:
sql
SHOW ALTER TABLE OPTIMIZE;
Look for a task where the Type or State indicates a tablet resharding operation.
Step 4: Verify the bucket count increase
sql
SHOW PARTITIONS FROM b2bopusmetricstransactionlifecycle;
If the partition originally had 1 bucket and now shows 2 or more, the background resharding has successfully completed.
Important Note on Upgrade Compatibility
As noted in the 4.1 release documentation, because 4.1 introduces these fundamental changes to tablet layout and metadata, you cannot downgrade to any version earlier than v4.0.6 once you have upgraded to 4.1. Ensure your backup/rollback plan accounts for this.
References
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
• sql-reference/sql-statements/table_bucket_part_index/ALTER_TABLE.md
• release_notes/release-4.1.md
References
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
• sql-reference/sql-statements/table_bucket_part_index/ALTER_TABLE.md
• release_notes/release-4.1.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SET_CONFIG.md
• sql-reference/sql-statements/table_bucket_part_index/SHOW_ALTER.md
• sql-reference/sql-statements/table_bucket_part_index/SHOW_PARTITIONS.md
References
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• deployment/shared_data/s3.md
• deployment/shared_data/hdfs.mdRumit Jain
07/14/2026, 7:16 AMAccording to the 4.1 release notes, oversized tablets can be automatically split without schema changes or data migration. Therefore, our existing tables should also benefit from automatic tablet splitting after the upgrade, while new tables can additionally take advantage of the new range-based distribution semantics. Can this be tested in any lower environment with one of your larger tables and see that after the upgrade, tablet resharding is actually triggered when a tablet exceeds the configured tablet_reshard_target_size(10GB default), and that the tablet count increases automatically without any manual intervention. This will give us confidence that the feature behaves as expected before enabling it in production.Rocky
07/14/2026, 7:17 AMDISTRIBUTED BY RANDOM, your expectation is correct. In StarRocks 4.1.x (shared-data), tablets that grow too large will be automatically split by the background resharding process without you needing to run manual ALTER commands or recreate tables.
The "Hash" Caveat:
If you have other existing tables that use DISTRIBUTED BY HASH(key), those will not automatically split. Hash distribution relies on a fixed number of buckets to determine where data lives. To change the bucket count of a Hash table, StarRocks still requires a manual ALTER TABLE ... DISTRIBUTED BY HASH(...) BUCKETS <new_number> command because the data must be re-hashed.
2. Can this be tested as described?
Yes, and your proposed test plan is the "gold standard" for verification.
Running this in a lower environment is the best way to prove the feature is active. Here is how the "evidence" will look:
1. Lower the threshold: ADMIN SET FRONTEND CONFIG ("tablet_reshard_target_size" = "104857600"); (100MB).
2. Trigger the split: Ingest data into a single partition until it exceeds 100MB.
3. Watch the "Audit Trail":
* The Job: Run SHOW ALTER TABLE OPTIMIZE;. You should see a job appear with a state like RUNNING or FINISHED.
* The Metadata: Run SHOW PARTITIONS FROM <table_name>;. You will see the Buckets column for that partition increase (e.g., from 1 to 2) automatically.
* The Physical Tablets: Run SHOW TABLET FROM <table_name>;. You will see new Tablet IDs created that correspond to the split.
3. Summary of Expectations vs. Reality
Feature | Existing RANDOM Table | Existing HASH Table | New Table (4.1 default)
Auto-Splitting | YES (Enabled in 4.1) | NO (Fixed by Hash) | YES (Range-based)
Manual Migration Needed? | No | Yes (if buckets are too few) | No
Manual Schema Change? | No | No | No
Important Note on Upgrade/Downgrade
Because StarRocks 4.1 makes "internal changes to data layout" to support this background resharding, the release notes explicitly warn that you cannot downgrade to any version earlier than v4.0.6 once the upgrade to 4.1 is complete. Ensure your test cluster reflects this state before moving to production.
References
• release_notes/release-4.1.md
• table_design/data_distribution/Data_distribution.md
• sql-reference/sql-statements/table_bucket_part_index/SHOW_ALTER.md
• administration/management/FE_configuration.md
References
• release_notes/release-4.1.md
• table_design/data_distribution/Data_distribution.md
• sql-reference/sql-statements/table_bucket_part_index/SHOW_ALTER.md
• sql-reference/sql-statements/table_bucket_part_index/SHOW_PARTITIONS.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
ReferencesRocky
07/14/2026, 7:17 AMRumit Jain
07/14/2026, 7:22 AMADMIN SET FRONTEND CONFIG ("enable_range_distribution" = "true");Rocky
07/14/2026, 7:23 AMvalues.yaml file. There are two primary ways to do this depending on which version of the chart you are using, but the most common method for the kube-starrocks chart is modifying the config block.
Option 1: Modifying the config block (Recommended)
The config block is a multiline string that essentially acts as your fe.conf file. You can append your setting to the existing defaults.
In your `values.yaml`:
yaml
starrocks:
starrocksFESpec:
config: |
# Keep your existing configs (ports, JAVA_OPTS, etc.)
# ...
# Add your custom setting here:
enable_range_distribution = true
Option 2: Using configyaml (Key-Value Map)
Modern versions of the chart also support a configyaml field. Note that in many chart versions, if you use configyaml, it will override everything in the config string, so you would need to define all your ports and options here.
yaml
starrocks:
starrocksFESpec:
configyaml:
enable_range_distribution: "true"
# You must also include mandatory configs if config is discarded:
http_port: "8030"
rpc_port: "9020"
query_port: "9030"
edit_log_port: "9010"
Applying the Change
Once you have updated your values.yaml, apply the changes using `helm upgrade`:
bash
helm upgrade <release_name> starrocks/kube-starrocks -f values.yaml
Verification
After the FE pods have restarted and reached the Running state, verify the setting via your SQL client:
sql
ADMIN SHOW FRONTEND CONFIG LIKE 'enable_range_distribution';
Note: If you are testing this in StarRocks 4.1.x, setting this to true allows new tables to use the new range-based distribution semantics by default, which is the foundation for the automatic tablet splitting/resharding feature.
References
• administration/management/FE_configuration.md
• quick_start/helm.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
References
• administration/management/FE_configuration.md
• quick_start/helm.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
• deployment/helm.md
• deployment/operator.md
• release_notes/release-4.1.md
References
• quick_start/helm.md
• administration/management/FE_configuration.mdRumit Jain
07/15/2026, 3:32 AMRocky
07/15/2026, 3:32 AMsum(starrocks_fe_connection_total) — This shows the total connections of the whole cluster. If this query is repeated for multiple legend items, every line will look the same.
* Correct Query: sum(starrocks_fe_connection_total) by (user) — This explicitly splits the metric by the user label.
2. Check Live Connections (SQL)
Run the following command while your application is active to see the real-time breakdown of who is connected:
sql
-- Shows all active connections across the cluster (if run as root/admin)
SHOW PROCESSLIST;
Look at the User column. If you only see one of your two users (or only root), then your application or connection pooler is not actually using the credentials you expect.
3. Verify via Audit Logs
The fe.audit.log is the source of truth. Every time a user connects or runs a query, it is logged here.
* Location: fe/log/fe.audit.log
* What to look for: Search for the string |user=sr_admin| and |user=sr_dml|.
* Comparison: If one user appears thousands of times and the other only a few, the "identical trend" in your dashboard is definitely a monitoring display bug.
4. Common Application Reasons
If the SQL results also show identical numbers, check these common architectural "traps":
* Connection Poolers: If you use a proxy, the proxy might be authenticating to StarRocks using a single "service user" regardless of which logical user the application thinks it is using.
* Hardcoded Credentials: Double-check your application environment variables. It’s common for a "copy-paste" error to result in the DML_USER variable being set to the same value as the ADMIN_USER.
* Shared JDBC Pool: If your Java/Python app uses a single static connection pool for all tasks, it will only ever use the user defined at the pool's initialization.
Summary Checklist for Troubleshooting:
1. Run SHOW PROCESSLIST; — If the user counts differ here, your Grafana/Prometheus query is wrong.
2. Check fe.audit.log — If only one user appears in the logs, your Application is only using one set of credentials.
3. Check User Properties: Run SHOW PROPERTY FOR 'sr_admin'; and SHOW PROPERTY FOR 'sr_dml'; to ensure neither has a restrictive max_user_connections limit that might be forcing them to behave similarly.
References
• administration/management/monitoring/alert.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• administration/management/logs.md
• administration/management/resource_management/Query_management.md
• using_starrocks/running_queries.md
References
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• administration/management/resource_management/Query_management.mdRumit Jain
07/15/2026, 3:36 AMRocky
07/15/2026, 3:36 AMstarrocks_fe_connection_total exists in both version 4.0.1 and 4.1.1, but there is a specific nuance regarding its labels that explains why you are seeing identical trends for different users.
1. Has the metric changed?
Technically, the metric name is the same, but there have been reports and internal changes regarding the user label in the 4.1.x release cycle.
* In 4.0.1: The metric was designed to include a user label, allowing you to run sum(starrocks_fe_connection_total) by (user) to see individual connection counts per user.
* In 4.1.1: There is a known issue (tracked in the community as a bug/regression, e.g., Issue #73611) where the user label may be missing or incorrectly populated in the Prometheus exporter. If the label is missing, any query attempting to split "by user" will essentially return the cluster total for every user-specific line in your dashboard. This is why your sr_admin and sr_dml trends look identical—they are both just displaying the total FE connections.
2. How to check for the issue
To verify if your version is missing the label:
1. Check the raw metrics endpoint:
Open a browser or use curl to view the metrics directly from your FE:
bash
curl http://<fe_ip>:<http_port>/metrics | grep starrocks_fe_connection_total
* If you see: starrocks_fe_connection_total{user="sr_admin"} 5 — the labels are working.
* If you see: starrocks_fe_connection_total 10 (with no user label) — the labels are missing in this version.
2. Verify via SQL:
If the Prometheus metric is failing you, the absolute source of truth remains the `information_schema`:
sql
-- Check current connections by user
SELECT USER, COUNT(*)
FROM information_schema.be_threads -- Or use SHOW PROCESSLIST
GROUP BY USER;
If the SQL shows different numbers (e.g., admin=2, dml=50) but your graph shows them as identical, it confirms the Prometheus exporter in 4.1.1 is not properly segmenting the metric by the user label.
3. Recommendation
If you find the user label is missing in 4.1.1:
* Workaround: Use a different metric like starrocks_fe_query_resource_group_running_queries_count if you have resource groups bound to these users, as those metrics tend to be more stable across versions.
* Upgrade: Check for a patch release (like 4.1.2 or 4.1.3) where the regression on the connection metric labels is addressed.
* Audit Logs: For historical trending, you can rely on the Audit Loader to sync fe.audit.log into a StarRocks table, which provides a much more granular view of user activity than Prometheus metrics.
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/alert.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
• administration/management/resource_management/resource_group.md
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/alert.mdRumit Jain
07/15/2026, 3:42 AMRocky
07/15/2026, 3:42 AMuser label being missing or empty in the Prometheus output for that specific version.
Why the trends look the same
If the user label is missing from the starrocks_fe_connection_total metric, your Grafana or PromQL query (e.g., sum(starrocks_fe_connection_total) by (user)) will aggregate all connections into a single bucket. If your dashboard is configured to show "Multiple Series" based on that label, and the label is missing, Prometheus effectively returns the cluster total for every series.
How to verify if there is an issue in v4.1.1
To confirm if the metric labels are broken in your version, perform these two checks:
1. Check the raw metrics endpoint:
Run this command against one of your FE nodes:
bash
curl http://<FE_IP>:<FE_HTTP_PORT>/metrics | grep starrocks_fe_connection_total
* If you see: starrocks_fe_connection_total{user="sr_admin"} 10 — The label exists.
* If you see: starrocks_fe_connection_total 20 (with no {user="..."} brackets) — The label is missing in v4.1.1, which is a regression.
2. Compare with the System View:
The information_schema is the internal source of truth and is independent of the Prometheus exporter. Run:
sql
SELECT USER, COUNT(*)
FROM information_schema.fe_threads
WHERE TYPE = 'MYSQL'
GROUP BY USER;
If this SQL query shows different numbers (e.g., sr_admin has 2 and sr_dml has 20), then the database is tracking them correctly, and the issue is strictly with the Prometheus metrics exporter in v4.1.1.
Recommended Action
* Check for Regression: There are recent reports (including the one you mentioned, which has been seen appearing in later branches) indicating the user label can sometimes go missing in certain 4.x builds.
* Workaround: If you need to monitor user-level activity while this metric is broken, use the Audit Loader. It logs every query with the associated user into a table, allowing you to build a connection/query trend dashboard using standard SQL.
* Monitor Resource Groups: If you have assigned these users to different Resource Groups, you can use the starrocks_fe_query_resource_group_running_queries_count metric instead, which typically has more reliable labeling.
References
• administration/management/monitoring/metrics.md
• sql-reference/information_schema/fe_threads.md
• administration/management/monitoring/alert.md
• sql-reference/sql-statements/cluster-management/nodes_processes/SHOW_PROCESSLIST.md
References
• administration/management/monitoring/metrics.md
• sql-reference/information_schema/fe_metrics.mdRumit Jain
07/15/2026, 3:43 AMRocky
07/15/2026, 3:43 AMuser label is indeed missing from the starrocks_fe_connection_total metric. This is a known regression (tracked in GitHub Issue #73611).
* What happened: The logic that segments connections by user was inadvertently dropped or bypassed in the exporter.
* Result: When you try to group by user in Grafana, the label doesn't exist, so you only see a single aggregate line, or multiple lines that all reflect the total cluster count.
2. Version 4.0.1: Identical Trends (Implementation Bug)
In version 4.0.1, the user label exists, but you are seeing the "same trend" for every user.
* Why this happens: In this specific version's implementation, the FE exporter correctly attaches the user label to the metric, but it incorrectly assigns the total cluster connection count to every single user label.
* Example: If sr_admin has 2 connections and sr_dml has 10 (Total = 12), the metric mistakenly reports:
* starrocks_fe_connection_total{user="sr_admin"} 12
* starrocks_fe_connection_total{user="sr_dml"} 12
* This makes the lines on your graph overlap perfectly, making them look like a single trend.
How to Verify the "Raw" Truth
To see exactly what the FE is reporting vs. what is actually happening:
1. Check Raw Metrics: Run this from your terminal to see the labels and values:
bash
curl http://<FE_IP>:<FE_HTTP_PORT>/metrics | grep starrocks_fe_connection_total
In 4.1.1, you'll see no {user=...}. In 4.0.1, you'll see multiple users all showing the same high number.
2. Check Internal Threads: Use the internal system view which is not affected by the Prometheus bug:
sql
SELECT USER, COUNT(*)
FROM information_schema.fe_threads
WHERE TYPE = 'MYSQL'
GROUP BY USER;
Recommendation
* For 4.1.1: You will need to wait for a patch release (e.g., 4.1.2+) where Issue #73611 is resolved to get the labels back.
* Temporary Workaround: If you have these users mapped to different Resource Groups, use the resource group metrics instead:
starrocks_fe_query_resource_group_running_queries_count
These metrics generally provide better segmentation and did not suffer the same regression in the 4.x branch.
* Long-term Monitoring: For accurate per-user connection auditing, it is highly recommended to use the Audit Loader to sync your FE audit logs into a StarRocks table, which provides a perfect history of which user connected when.
References
• administration/management/monitoring/metrics.md
• sql-reference/information_schema/fe_threads.md
• administration/management/monitoring/alert.md
References
• administration/management/monitoring/metrics.md
• administration/management/monitoring/alert.md
• administration/management/FE_configuration.mdRumit Jain
07/15/2026, 5:32 AMenable_range_distribution , i see in v4.0.1 tables are having this,
DISTRIBUTED BY RANDOM
PROPERTIES (
"bucket_size" = "1073741824"
)
But while creating the table I am not giving these properties. Is this something default as per Starrocks v4.0.1?Rocky
07/15/2026, 5:32 AMDISTRIBUTED BY RANDOM
Since version 3.1, if you create a Duplicate Key table and do not explicitly provide a DISTRIBUTED BY clause, StarRocks defaults to Random Bucketing.
* Why: It ensures even data distribution across the cluster without requiring you to pick a bucketing key (which can cause data skew if picked poorly).
2. Automatic Bucket Sizing (bucket_size)
The property "bucket_size" = "1073741824" (which is exactly 1 GB) is also a default in v4.0.1.
* The Change in 4.0: Starting with StarRocks v4.0.0, the default bucket size for tables with automatic bucketing was changed from 4 GB down to 1 GB.
* Function: This property enables "Elastic Growth." Instead of fixing the number of buckets at creation time, StarRocks will dynamically add more buckets as your data grows, aiming to keep each bucket (tablet) around 1 GB.
* FE Configuration: This is controlled by the FE parameter enable_auto_tablet_distribution, which is true by default.
3. Regarding enable_range_distribution
While you mentioned enable_range_distribution, this specific parameter is actually a new feature introduced in v4.1 (and is typically disabled by default).
* In v4.0.1, the system relies on the Automatic Tablet Distribution logic described above.
* If you see "Range-based Distribution" in your research, it is likely referring to the v4.1+ feature which allows data to be sequenced by range rather than random/hash, but what you are seeing in your SHOW CREATE TABLE is the Automatic Random Bucketing system standard for the 4.0 branch.
Summary
You do not need to specify these properties because StarRocks now considers 1 GB tablets and Random Distribution to be the "best practice" starting point for most Duplicate Key tables. It allows the table to scale its bucket count automatically as you load more data.
References
• table_design/data_distribution/Data_distribution.md
• release_notes/release-4.0.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
References
• administration/management/FE_configuration.md
• table_design/data_distribution/Data_distribution.mdRumit Jain
07/20/2026, 5:51 AMWhen reading INT64 timestamps from Parquet files written with isAdjustedToUTC=false (timezone-naive), SELECT FROM FILES() and broker/stream LOAD no longer shift the values by the session timezone offset. Such timestamps are now read as wall-clock values, consistent with Trino, Spark, and Impala. Previously the values drifted whenever the session timezone was not UTC.
Explain this with some example.Rocky
07/20/2026, 5:51 AMisAdjustedToUTC
In Parquet, a timestamp can have a flag called `isAdjustedToUTC`:
* True (Timezone-aware): The value represents a specific "instant" in time (usually stored as UTC). It should be shifted to the observer's local time.
* False (Timezone-naive/Wall-clock): The value represents a "wall-clock" time (like a birthday or a store's opening hour). It should look the same to everyone, whether they are in New York or Tokyo.
──────────
The Example
Imagine you have a Parquet file generated by an external tool (like Spark) containing the following data:
* Value in file: 2024-10-01 12:00:00
* Metadata: isAdjustedToUTC = false (The writer intended this to be exactly Noon, no matter what).
Old Behavior (Before v4.0.12)
If your StarRocks session timezone was set to Asia/Shanghai (UTC+8), StarRocks would "helpfully" apply an offset during the read:
1. StarRocks reads 12:00:00.
2. It sees your session is UTC+8.
3. It assumes the file value needs adjustment and might shift it, resulting in 2024-10-01 20:00:00.
* Result: The data "drifts" away from the original value because of your session settings.
New Behavior (v4.0.12+)
StarRocks now respects the isAdjustedToUTC=false flag and treats it as a wall-clock value:
1. StarRocks reads 12:00:00.
2. It ignores your session timezone for this specific calculation.
3. It returns 2024-10-01 12:00:00.
* Result: The value is consistent with how other big data tools (Trino, Spark, Impala) read the same file.
Why this matters
Before this change, if two different users in two different timezones queried the same Parquet file using SELECT * FROM FILES(), they would see different hours for the same row. Now, they will both see the same "wall-clock" time, which is the industry standard for naive timestamps.
Summary of change
Scenario (isAdjustedToUTC=false) | Pre-v4.0.12 | v4.0.12+
Reading the file | Value is shifted by session timezone | Value is read exactly as-is ("Wall-clock")
Consistency | Changes based on SET time_zone | Consistent regardless of time_zone
Compatibility | Diverged from Spark/Trino | Aligns with Spark/Trino
References
• release_notes/release-4.0.md
• sql-reference/sql-functions/date-time-functions/from_unixtime.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/data-loading/INSERT.md
References
• release_notes/release-4.0.mdRumit Jain
07/20/2026, 7:24 AMJobId: 476630
Label: ABC_LOADJOAB
State: FINISHED
Progress: ETL:100%; LOAD:100%
Type: BROKER
Priority: NORMAL
ScanRows: 1
FilteredRows: 0
UnselectedRows: 0
SinkRows: 1
EtlInfo: NULL
TaskInfo: resource:N/A; timeout(s):14400; max_filter_ratio:0.0
ErrorMsg: NULL
CreateTime: 2026-07-20 06:46:20
EtlStartTime: 2026-07-20 06:46:22
EtlFinishTime: 2026-07-20 06:46:22
LoadStartTime: 2026-07-20 06:46:22
LoadFinishTime: 2026-07-20 06:46:23
TrackingSQL:
JobDetails: {"All backends":{"019f7e46-94da-75e8-8a90-b85eb7c8729d":[10033]},"FileNumber":1,"FileSize":10786,"InternalTableLoadBytes":764,"InternalTableLoadRows":1,"ScanBytes":10786,"ScanRows":1,"TaskNumber":1,"Unfinished backends":{"019f7e46-94da-75e8-8a90-b85eb7c8729d":[]}}
Warehouse: default_warehouse
whereas in 4.1.1, same code with creattime in singapore timezone:
JobId: 2189221
Label: PQR_LOADJOB
State: CANCELLED
Progress: ETL:N/A; LOAD:N/A
Type: BROKER
Priority: NORMAL
ScanRows: 0
FilteredRows: 0
UnselectedRows: 0
SinkRows: 0
EtlInfo: NULL
TaskInfo: resource:N/A; timeout(s):14400; max_filter_ratio:0.0
ErrorMsg: type:LOAD_RUN_FAIL; msg:Column: subtype_subdata is not found in file: <s3://ABC.parquet>: BE:10023
CreateTime: 2026-07-20 14:30:25
EtlStartTime: 2026-07-20 14:30:25
EtlFinishTime: 2026-07-20 14:30:25
LoadStartTime: 2026-07-20 14:30:25
LoadFinishTime: 2026-07-20 14:30:25
TrackingSQL:
JobDetails: {"All backends":{"019f7e37-f98f-7b76-a78f-476d3bd6850c":[10023]},"FileNumber":1,"FileSize":10786,"InternalTableLoadBytes":0,"InternalTableLoadRows":0,"ScanBytes":0,"ScanRows":0,"TaskNumber":1,"Unfinished backends":{"019f7e37-f98f-7b76-a78f-476d3bd6850c":[]}}
Warehouse: default_warehouse
I checked , in both
SHOW VARIABLES LIKE '%time_zone%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| system_time_zone | UTC |
| time_zone | UTC |
+------------------+-------+
How to get time in UTC in v4.1.1 as well?Rocky
07/20/2026, 7:25 AMSHOW LOAD.
The Cause: Session Timezone vs. Job Timezone
In older versions (like 4.0.1), SHOW LOAD typically formatted the CreateTime and LoadFinishTime based on your current session time_zone. Since your session was set to UTC, the output was shifted to UTC.
In newer versions (specifically starting around the 4.1.x branch), SHOW LOAD has been updated to display timestamps according to the Load Job's internal timezone rather than the viewer's session timezone.
1. Default Job Timezone: When you submit a load job without explicitly specifying a timezone in the PROPERTIES block, StarRocks defaults the job's internal timezone to Asia/Shanghai (UTC+8).
2. Display Behavior: Even if your session is UTC, the metadata for that job is stored and now displayed using its "native" timezone (Asia/Shanghai), which explains why you see the +8 hour difference (Singapore and Shanghai share the same offset).
How to get UTC in v4.1.1
To ensure the CreateTime appears in UTC, you must explicitly set the timezone during the load job creation.
For Broker Load
Add the timezone property to your LOAD statement:
sql
LOAD LABEL your_db.your_label
...
PROPERTIES (
"timezone" = "UTC"
);
For Stream Load
Pass the timezone header:
bash
curl --location-trusted -u user:passwd \
-H "timezone: UTC" \
-T data.csv \
<http://fe_host:http_port/api/db/table/_stream_load>
Why does time_zone = UTC not help for SHOW LOAD anymore?
Starting in the 4.x series, StarRocks moved toward making load metadata "absolute" to the job. This prevents confusion when users in different global locations view the same job status; the times displayed now consistently reflect the job's execution context rather than the viewer's clock.
Recommended Checks
1. Verify the Job Property: Check your load script. If the PROPERTIES block is missing "timezone" = "UTC", it is falling back to the system default (Asia/Shanghai).
2. System-wide Change: While you cannot change the system_time_zone variable (it is read from the OS), you can try setting the global default for new jobs by ensuring your Global variable is set, though explicitly defining it in the Load command is the most reliable method:
sql
SET GLOBAL time_zone = 'UTC';
Note: This affects new sessions, but individual load commands may still require the explicit property if they are generated by tools that hardcode a default.
Summary
* v4.0.1: Displayed based on Session timezone.
* v4.1.1: Displayed based on Job timezone (Defaults to `Asia/Shanghai`/UTC+8).
* Fix: Add "timezone" = "UTC" to your Load Job properties.
References
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.md
• administration/management/timezone.md
• sql-reference/sql-statements/loading_unloading/SHOW_LOAD.md
• sql-reference/sql-statements/loading_unloading/routine_load/CREATE_ROUTINE_LOAD.md
References
• administration/management/timezone.md
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.md
• sql-reference/sql-statements/loading_unloading/SHOW_LOAD.md
• faq/loading/Broker_load_faq.md
ReferencesRocky
07/20/2026, 7:25 AMRumit Jain
07/20/2026, 7:34 AMCheck your load script. If the PROPERTIES block is missing "timezone" = "UTC", it is falling back to the system default (Asia/Shanghai).Rocky
07/20/2026, 7:35 AMPROPERTIES block. If the timezone key is missing, StarRocks automatically applies the default Asia/Shanghai.
Example of what to look for:
sql
LOAD LABEL my_db.label_1
...
PROPERTIES (
"timeout" = "3600",
"timezone" = "UTC" -- <--- Check if this line exists
);
2. Why it doesn't show in SHOW LOAD
Currently, the SHOW LOAD command (as seen in your previous message) displays basic metadata like timeout and max_filter_ratio in the TaskInfo column, but it does not explicitly list the timezone property used during submission.
Since you cannot see it in the SHOW LOAD output, you have two ways to confirm it:
* Check your application/client logs: If you use a tool or a script (Python, Java, Bash) to trigger the load, verify the SQL string being sent to StarRocks.
* Check StarRocks FE Logs: Search the fe.log on your Leader FE node for the JobId or Label. The log often records the full parameters received during the job creation.
3. Verify the "Default" for New Jobs
If you haven't specified a timezone and want to know what StarRocks is using by default, you can check the session variables. However, be aware that for Broker Load, the internal engine often defaults to Asia/Shanghai unless specifically overridden in the PROPERTIES block.
To see your current session defaults:
sql
SHOW VARIABLES LIKE '%time_zone%';
How to "Fix" it for future jobs
To ensure all future jobs are in UTC and appear as such in SHOW LOAD (v4.1.1+ behavior), you should explicitly include it in your property block:
* For Broker Load: Always include "timezone" = "UTC" in PROPERTIES.
* For Stream Load: Include the HTTP header -H "timezone: UTC".
* For Routine Load: Include "timezone" = "UTC" in the PROPERTIES of the CREATE ROUTINE LOAD statement.
References
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.md
• administration/management/timezone.md
• sql-reference/sql-statements/loading_unloading/SHOW_LOAD.md
• faq/loading/Broker_load_faq.md
References
• sql-reference/sql-statements/loading_unloading/SHOW_LOAD.mdRumit Jain
07/20/2026, 7:46 AM2026-07-20 07:37:32.969Z INFO (AuditEventProcessor|69) [AuditLog.log():73] {"Warehouse":"default_warehouse","CustomSessionName":"","User":"sr_admin_user","Time":6,"Timestamp":1784533052962,"ReturnRows":0,"IsQuery":false,"Stmt":"LOAD LABEL FILE_NAME (\n DATA INFILE(\"<s3://ABC-PQR-dnp-AAA/ephemeral/default/LLL/ownerid=00000000-0000-0000-0000-000000000000/failures/FILE_NAME.parquet>\")\n INTO TABLE TTT\n)\nWITH BROKER (\n \"aws.s3.use_instance_profile\" = \"true\",\n \"aws.s3.use_aws_sdk_default_behavior\" = \"true\",\n \"aws.s3.region\" = \"us-east-1\"\n)\nPROPERTIES (\n \"timeout\" = \"3600\",\n \"timezone\" = \"UTC\"\n)","ScanRows":0,"IsForwardToLeader":false,"QuerySource":"EXTERNAL","StmtId":4237,"Client":"10.218.96.245:57428","SessionId":"019f7e73-fdc6-75de-ae6f-5e23e8472502","ResourceGroup":"","Db":"","ScanBytes":0,"Digest":"","AuthorizedUser":"'sr_admin_user'@'%'","QueryId":"019f7e75-6e22-75d8-b3df-d78d1ce47098","feIp":"kube-starrocks-fe-2.kube-starrocks-fe-search.plattest03.svc.cluster.local","CNGroup":"","Catalog":"default_catalog","QueryFEAllocatedMemory":0,"Command":"MySQL.Query","State":"OK","ErrorCode":"","TransmittedBytes":0,"CustomQueryId":""}
But when I run show load, it is giving me 0 rows found.Rocky
07/20/2026, 7:47 AMSHOW LOAD returns 0 rows, even though your audit log shows a successful submission ("State":"OK"), is almost certainly due to Database Context.
1. The "Empty DB" Problem
In your audit log, notice the field: "Db": "".
This indicates that the LOAD command was executed in a session where no default database was selected (i.e., no USE <db_name> was run), and the label itself was not qualified with a database name (e.g., LOAD LABEL my_db.FILE_NAME).
In StarRocks, SHOW LOAD is a database-level command. By default, it only shows load jobs for the current database of your session.
* If you are currently in a database (e.g., USE test_db;), SHOW LOAD will only look for jobs associated with test_db.
* If the job was submitted with an empty database context (as shown in your log), it might have failed immediately after the audit log was written, or it might be associated with a different context than you expect.
2. How to find the job
Instead of SHOW LOAD, which is context-sensitive, use the global system view in StarRocks 4.x to find exactly where that job is:
sql
SELECT * FROM information_schema.loads
WHERE LABEL = 'FILE_NAME'
ORDER BY CREATE_TIME DESC;
This view is global across the cluster. Look specifically at the DB_NAME column in the results. That will tell you which database the job actually belongs to.
3. Likely Scenarios & Fixes
* Case A: You are in the wrong database.
If information_schema.loads shows the job belongs to my_actual_db, switch to it before running show load:
sql
USE my_actual_db;
SHOW LOAD WHERE LABEL = 'FILE_NAME';
* Case B: The Label is case-sensitive.
Ensure you are searching for FILE_NAME exactly as it appears in the log.
sql
SHOW LOAD WHERE LABEL = 'FILE_NAME'; -- Not 'file_name'
* Case C: Qualification.
To avoid this in the future, always qualify your load label with the database name in your script:
sql
-- Best Practice
LOAD LABEL my_database.FILE_NAME ( ... )
Summary Recommendation
Run SELECT DB_NAME, LABEL, STATE, ERROR_MSG FROM information_schema.loads WHERE LABEL = 'FILE_NAME' to identify the database and current status of the job.
References
• loading/loading_introduction/troubleshooting_loading.md
• sql-reference/sql-statements/loading_unloading/SHOW_LOAD.md
• administration/management/audit_loader.md
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.md
References
• loading/loading_introduction/troubleshooting_loading.md
• sql-reference/sql-statements/loading_unloading/SHOW_LOAD.md
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.md
• administration/management/audit_loader.md
• faq/loading/Broker_load_faq.md
• sql-reference/sql-statements/loading_unloading/routine_load/SHOW_ROUTINE_LOAD.md
• sql-reference/sql-statements/loading_unloading/STREAM_LOAD.md
• loading/InsertInto.mdRocky
07/20/2026, 7:47 AMRocky
07/20/2026, 7:47 AMRocky
07/20/2026, 7:47 AMRocky
07/20/2026, 7:47 AMRocky
07/20/2026, 7:47 AMRocky
07/20/2026, 7:47 AMRocky
07/20/2026, 7:47 AMRocky
07/20/2026, 7:47 AMRocky
07/20/2026, 7:47 AMRumit Jain
07/20/2026, 7:51 AMJobId: 2190085
Label: FILE_NAME
State: CANCELLED
Progress: ETL:N/A; LOAD:N/A
Type: BROKER
Priority: NORMAL
ScanRows: 0
FilteredRows: 0
UnselectedRows: 0
SinkRows: 0
EtlInfo: NULL
TaskInfo: resource:N/A; timeout(s):3600; max_filter_ratio:0.0
ErrorMsg: type:LOAD_RUN_FAIL; msg:Column: subtype_subdata is not found in file: <s3://ABC-PQR-dnp-AAA/ephemeral/default/LLL/ownerid=00000000-0000-0000-0000-000000000000/failures/FILE_NAME.parquet.parquet>: BE:10023
CreateTime: 2026-07-20 15:37:35
EtlStartTime: 2026-07-20 15:37:35
EtlFinishTime: 2026-07-20 15:37:35
LoadStartTime: 2026-07-20 15:37:35
LoadFinishTime: 2026-07-20 15:37:35
TrackingSQL:
JobDetails: {"All backends":{"019f7e75-77f7-7879-af8f-a0cfba9c40a9":[10023]},"FileNumber":1,"FileSize":10787,"InternalTableLoadBytes":0,"InternalTableLoadRows":0,"ScanBytes":0,"ScanRows":0,"TaskNumber":1,"Unfinished backends":{"019f7e75-77f7-7879-af8f-a0cfba9c40a9":[]}}
Warehouse: default_warehouse
1 row in set (0.00 sec)Rocky
07/20/2026, 7:52 AMCreateTime remains in UTC+8 (Singapore/Shanghai time) even when your session and system variables are set to UTC—is due to a change in how StarRocks handles and displays load metadata in recent versions.
1. Why SHOW LOAD shows Singapore time
In StarRocks 4.x, the metadata for load jobs (such as CreateTime and LoadFinishTime) is stored internally using the cluster's default timezone, which is Asia/Shanghai (UTC+8).
While older versions (like 4.0.1) often dynamically converted these timestamps to your current time_zone session variable, newer versions have moved toward a "fixed" display for SHOW LOAD metadata to ensure consistency across different users and tools. In many 4.x sub-versions, the SHOW LOAD command outputs these wall-clock strings based on the internal cluster default, regardless of the viewer's session settings.
2. The Solution: Use information_schema.loads
Starting with StarRocks v3.1, the recommended way to view load status is via the information_schema database. Unlike the older SHOW LOAD command, this system view is designed to be more compatible with standard SQL tools and session variables.
To get your load times in UTC, run:
sql
SELECT
LABEL,
STATE,
CREATE_TIME,
LOAD_START_TIME,
LOAD_FINISH_TIME
FROM information_schema.loads
WHERE LABEL = 'FILE_NAME';
If your session time_zone is set to UTC, the DATETIME values returned by this query should respect your session offset.
3. Why SHOW LOAD gave "0 rows found"
In your audit log, the field "Db": "" is empty. This means the load was submitted without a specific database context (e.g., you didn't run USE my_db or specify my_db.FILE_NAME).
* SHOW LOAD is context-sensitive; it only shows jobs for the currently selected database.
* information_schema.loads is *global*; it will show you all jobs across the cluster, which is why it is the better tool for troubleshooting.
4. How to ensure UTC is used for Data
Even if the display of the metadata is in Shanghai time, the data processing (converting strings to dates in your files) will correctly use UTC because you passed "timezone" = "UTC" in the PROPERTIES block.
Summary Checklist
1. To view in UTC: Query information_schema.loads instead of using SHOW LOAD.
2. Verify Global Default: Ensure you have set the global timezone (this requires a reconnect to take effect):
sql
SET GLOBAL time_zone = 'UTC';
3. Check FE Configuration: If you want the entire cluster to default to UTC for all metadata and logs, you must set the timezone parameter in your fe.conf file (e.g., timezone = UTC) and restart the FE. Without this, the internal Java default for the FE process often remains Asia/Shanghai.
References
• sql-reference/sql-statements/loading_unloading/SHOW_LOAD.md
• administration/management/timezone.md
• administration/management/Information_Schema.md
• loading/loading_introduction/troubleshooting_loading.md
References
• administration/management/FE_configuration.md
• administration/management/timezone.mdRumit Jain
07/20/2026, 7:56 AMselect label, state, CREATE_TIME, LOAD_START_TIME, LOAD_FINISH_TIME from information_schema.loads where LABEL = 'sampledatameshdb__testdatameshlakehouseobject__messagebasedbundle__f84f4448__c7kg6__1__1784276718221_BMTestedUTCTZ'\G;
*************************** 1. row ***************************
label: sampledatameshdb__testdatameshlakehouseobject__messagebasedbundle__f84f4448__c7kg6__1__1784276718221_BMTestedUTCTZ
state: CANCELLED
CREATE_TIME: 2026-07-20 15:37:35
LOAD_START_TIME: 2026-07-20 15:37:35
LOAD_FINISH_TIME: 2026-07-20 15:37:35
1 row in set (0.02 sec)
ERROR:
No query specifiedRocky
07/20/2026, 7:56 AMPROPERTIES ("timezone" = "UTC") in your script: This only tells StarRocks how to interpret the data inside your files. For example, if your Parquet file has a column with an integer timestamp, StarRocks uses this property to convert it to a DATETIME during the load process.
* The CREATE_TIME in Logs/Metadata: This is System Metadata. It records when the StarRocks Frontend (FE) received the request. This timestamp is always determined by the FE's internal clock and the cluster's system_time_zone. It is not affected by the PROPERTIES block of a specific load job.
2. Why it shows UTC+8 (15:37 instead of 07:37)
In StarRocks, the default internal timezone for the FE process is Asia/Shanghai (UTC+8). Even if you set your session variable time_zone = 'UTC', the values stored in information_schema.loads are often returned as the raw "wall-clock" time of the FE server.
You can verify your cluster's system timezone by running:
sql
SHOW VARIABLES LIKE 'system_time_zone';
If this returns CST or Asia/Shanghai, then all job metadata (CreateTime, FinishTime) will be recorded and displayed in that timezone by default.
3. How to see it in UTC
If you want the metadata from information_schema.loads to display in UTC, you must explicitly convert it in your query:
sql
SELECT
label,
state,
CONVERT_TZ(CREATE_TIME, 'Asia/Shanghai', 'UTC') AS CREATE_TIME_UTC,
ERROR_MSG
FROM information_schema.loads
WHERE LABEL = '...your_label...';
4. Important: Your Load actually failed
While you are investigating the timezone, please note that your job state is CANCELLED. The timezone isn't the cause of the failure. The ErrorMsg in your output shows the real issue:
The fix for your load: Your StarRocks table expects a column namedmsg:Column: subtype_subdata is not found in file: <s3://.../FILE_NAME.parquet>
subtype_subdata, but that column does not exist inside the Parquet file you are pointing to. You need to either:
1. Update the table schema.
2. Update the Parquet file to include that column.
3. Use a (column_list) mapping in your LOAD statement to skip that column or map it to a different field.
How to change the cluster default to UTC
If you want the metadata to be recorded in UTC globally so you don't have to use `CONVERT_TZ`:
1. You must change the timezone of the host machine (or the Docker container/Pod) where the FE is running to UTC.
2. Alternatively, add -Duser.timezone=UTC to the JAVA_OPTS in your fe.conf and restart the FE.
References
• administration/management/timezone.md
• sql-reference/information_schema/loads.md
• loading/loading_introduction/troubleshooting_loading.md
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.md
References
• administration/management/FE_configuration.md
• administration/management/timezone.mdRumit Jain
07/20/2026, 7:58 AMSHOW VARIABLES LIKE 'system_time_zone';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| system_time_zone | UTC |
+------------------+-------+
1 row in set (0.01 sec)Rocky
07/20/2026, 7:58 AMLOAD statement, you passed PROPERTIES ("timezone" = "UTC").
* What this does: It tells StarRocks how to interpret date/time strings inside your Parquet files during the ingestion process.
* What it does NOT do: It has no effect on the CreateTime or LoadFinishTime of the load job itself. These are system metadata timestamps managed by the StarRocks Frontend (FE).
2. Why it shows Singapore Time (UTC+8)
Even though your system_time_zone is set to UTC, StarRocks uses a different variable called time_zone to format the output of commands like SHOW LOAD and queries to information_schema.loads.
The default value for time_zone in StarRocks is Asia/Shanghai (UTC+8). When you run SHOW LOAD, StarRocks takes the internal UTC timestamp of the job and converts it to your session's time_zone for display.
To verify your current display timezone, run:
sql
SHOW VARIABLES LIKE 'time_zone';
3. How to fix the display
If you want to see the load metadata in UTC to match your logs, you must set your session or global timezone variable to UTC:
* For your current session:
sql
SET time_zone = 'UTC';
* For all future sessions (Global):
sql
SET GLOBAL time_zone = 'UTC';
(Note: After setting it globally, you may need to reconnect to see the change in your current client.)
4. Important: The Load is Failing
Aside from the timezone issue, your SHOW LOAD output reveals the reason why your data isn't loading:
This means your StarRocks tableErrorMsg: type:LOAD_RUN_FAIL; msg:Column: subtype_subdata is not found in file
TTT expects a column named subtype_subdata, but that specific field is missing from the Parquet file in S3. To fix this:
1. Check if the column name in the Parquet file matches exactly (including case).
2. If the file doesn't have that column, you must explicitly define the column mapping in your LOAD statement to handle the missing field (e.g., by skipping it or setting it to NULL).
Summary
The 8-hour shift is a display conversion caused by the time_zone session variable. Setting SET time_zone = 'UTC'; will align your SHOW LOAD output with your audit logs.
References
• administration/management/timezone.md
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.md
• loading/loading_introduction/troubleshooting_loading.md
• faq/loading/Broker_load_faq.md
References
• administration/management/timezone.md
• faq/loading/Broker_load_faq.md
• loading/Spark-connector-starrocks.md
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.md
• integrations/loading_tools/DataX-starrocks-writer.md
• sql-reference/sql-statements/loading_unloading/routine_load/CREATE_ROUTINE_LOAD.md
• loading/loading_introduction/feature-support-loading-and-unloading.mdRocky
07/20/2026, 7:58 AMRumit Jain
07/20/2026, 7:59 AMSHOW VARIABLES LIKE 'time_zone';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| time_zone | UTC |
+---------------+-------+
1 row in set (0.00 sec)Rocky
07/20/2026, 8:00 AMCreateTime you see in SHOW LOAD or information_schema.loads is system metadata, which is handled differently than the data you are loading.
The fact that you are seeing a time 8 hours ahead (e.g., 15:37 instead of 07:37) despite having your session and system variables set to UTC is usually due to the following reasons:
1. Data Timezone vs. Metadata Timezone
The "timezone" = "UTC" property you pass in the LOAD statement only tells StarRocks how to interpret the data inside your files (e.g., converting a Parquet timestamp to a table column). It does not affect the metadata timestamps like CreateTime or LoadFinishTime. These are recorded by the Frontend (FE) using the FE's internal process clock.
2. FE Process Internal Timezone
Even if system_time_zone is UTC (meaning the OS is UTC), the StarRocks FE (a Java process) might still be using a default timezone of Asia/Shanghai (UTC+8) for its internal logging and metadata formatting if it wasn't explicitly overridden.
To fix this globally:
You must ensure the Java Virtual Machine (JVM) running the FE is explicitly set to UTC.
1. Open your fe/conf/fe.conf file.
2. Find the JAVA_OPTS line.
3. Add or ensure the following property is present:
bash
-Duser.timezone=UTC
4. Restart the FE.
3. Known Behavior/Bug in Metadata Display
There is a documented behavior change and a known bug (fixed in very recent 3.2.x and 4.0+ versions) where:
• Prior behavior: StarRocks often exchanged load times as "naive wall-clock strings" between the BE and FE. This could cause the FE to display timestamps in its own default timezone (Asia/Shanghai) regardless of the session's time_zone setting.
• Verification: Check if SELECT NOW(); returns the correct UTC time. If NOW() is correct but SHOW LOAD is not, it confirms that the metadata rendering is ignoring your session variable.
4. Why information_schema.loads still shows Singapore time
Since information_schema.loads is a system view that reads directly from the FE's metadata memory, it inherits the same internal representation as SHOW LOAD. If the FE recorded the job "wall-clock" time as 15:37 internally, the view will show 15:37.
Summary Recommendation
1. To align your metadata with UTC: You must set -Duser.timezone=UTC in your fe.conf and restart. This is the only way to change the "internal clock" that records job metadata.
2. Immediate Workaround: You can manually convert the metadata in your queries:
sql
SELECT
LABEL,
CONVERT_TZ(CREATE_TIME, '+08:00', '+00:00') AS CREATE_TIME_UTC
FROM information_schema.loads
WHERE LABEL = '...';
3. Fix the Load Error: Note that your job is failing with Column: subtype_subdata is not found in file. This is a schema mismatch between your StarRocks table and the Parquet file, which is independent of the timezone issue.
Related Documentation:
• Configure a time zone
• FE Configuration
• Broker Load Reference
References
• administration/management/timezone.md
• administration/management/FE_configuration.md
• faq/Deploy_faq.mdRumit Jain
07/20/2026, 8:02 AMselect now();
+---------------------+
| now() |
+---------------------+
| 2026-07-20 08:02:08 |
+---------------------+
1 row in set (0.01 sec)Rocky
07/20/2026, 8:02 AMtime_zone variable and defaults to Asia/Shanghai (UTC+8).
Even though your system_time_zone, session time_zone, and SELECT NOW() all correctly show UTC, the Frontend (FE) often handles load metadata timestamps as "naive strings" or uses an internal default for the information_schema.loads and SHOW LOAD outputs.
Why this is happening:
1. Internal Metadata Storage: StarRocks historically records load job metadata using the FE's internal process clock. If the FE process wasn't explicitly forced to UTC at the JVM level, it may record or render these specific timestamps in its default timezone (Asia/Shanghai).
2. Rendering Bug: There is a known issue (tracked in StarRocks GitHub as #73365) where load times were exchanged as naive wall-clock strings between components. This causes the display to remain at UTC+8 even when the session is set to UTC.
3. Data vs. Metadata: The PROPERTIES ("timezone" = "UTC") in your LOAD script only tells StarRocks how to parse the data inside your Parquet/CSV files. It has no influence on the system's own "Create Time" log for that job.
How to see the correct UTC time:
Since your session is already UTC but the view is returning +8 values, you can manually adjust the query to `information_schema.loads`:
sql
SELECT
label,
state,
-- Manually convert from the forced +8 display to UTC
CONVERT_TZ(CREATE_TIME, '+08:00', '+00:00') AS CREATE_TIME_UTC,
CONVERT_TZ(LOAD_FINISH_TIME, '+08:00', '+00:00') AS LOAD_FINISH_TIME_UTC
FROM information_schema.loads
WHERE LABEL = '...';
To fix this globally (requires restart):
To force the FE's internal metadata clock to UTC, you should add the timezone property to the FE's JVM startup options:
1. Edit fe/conf/fe.conf.
2. Add -Duser.timezone=UTC to the JAVA_OPTS variable.
3. Restart the FE.
Reminder on the Load Failure
While the timezone is confusing, your load job is actually failing (CANCELLED) because of a schema mismatch:
msg:Column: subtype_subdata is not found in file
This means the Parquet file you are loading does not contain the column subtype_subdata that your StarRocks table expects. You will need to fix your column mapping or the source file to resolve the error.
References
• administration/management/timezone.md
• sql-reference/information_schema/loads.md
• administration/management/FE_configuration.md
• loading/loading_introduction/troubleshooting_loading.md
References
• administration/management/timezone.md
• faq/loading/Broker_load_faq.md
• integrations/loading_tools/DataX-starrocks-writer.md
• loading/Spark-connector-starrocks.md
• faq/Sql_faq.md
• loading/loading_introduction/feature-support-loading-and-unloading.md
• sql-reference/sql-statements/loading_unloading/routine_load/CREATE_ROUTINE_LOAD.md
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.mdRumit Jain
07/20/2026, 8:04 AMRocky
07/20/2026, 8:04 AMCreateTime) were often exchanged between the Backend (BE) and Frontend (FE) as "naive" wall-clock strings. This caused the system to often default to Asia/Shanghai (UTC+8) when displaying metadata, even if your session variable was set to UTC.
Starting with the 4.0.x series, StarRocks improved the thrift communication between components to ensure timestamps are handled with proper timezone awareness. This allows the output of SHOW LOAD and information_schema.loads to finally respect your session's time_zone variable correctly.
2. Improved time_zone Respect
While the documentation has long stated that time_zone affects SHOW LOAD, the implementation in version 4.0.1 is much more consistent. Since your session time_zone is set to UTC, the system now correctly performs the conversion from the internal UTC storage to your display session.
3. Consistency with SELECT NOW()
The fact that your SELECT NOW() and SHOW LOAD both show UTC confirms that your version 4.0.1 cluster is fully synchronized. In older versions, it was common to see NOW() show UTC while SHOW LOAD remained stuck at +8 due to the metadata rendering issue mentioned above.
Summary of why it works now:
* Version 3.x: Metadata was often treated as a fixed string (often +8) that ignored the session time_zone.
* Version 4.0.1: Metadata display is now session-aware. Because your time_zone variable is UTC, StarRocks 4.0.1 correctly displays your load history in UTC.
Note: If you ever see a discrepancy again, it is usually because the FE's internal JVM timezone (-Duser.timezone) differs from your session's time_zone, but in 4.0.1, the session variable should be the source of truth for your display.
References
• administration/management/timezone.md
• release_notes/release-4.0.md
• sql-reference/information_schema/loads.md
• sql-reference/sql-statements/loading_unloading/BROKER_LOAD.md
References
• administration/management/timezone.md
• release_notes/release-4.0.mdRumit Jain
07/20/2026, 8:59 AMRocky
07/20/2026, 8:59 AMinformation_schema.loads when the session timezone differed from Asia/Shanghai.
Why it might look "wrong" in 4.1.1
If you are seeing a +8 hour offset in 4.1.1 despite having a UTC session, it usually indicates one of two things:
1. FE JVM Default Timezone: Even if your session time_zone is UTC, the new metadata logic in 4.1.1 might be falling back to the FE's internal JVM timezone for the "rendering" of the information_schema views if the session variable isn't being propagated correctly to that specific system view.
* Fix: Ensure your fe/conf/fe.conf has -Duser.timezone=UTC in the JAVA_OPTS and restart the FE. This forces the underlying Java process to treat the "system" as UTC.
2. Display Regression: There is a known pattern where StarRocks system views (information_schema) occasionally lag behind in respecting session-level time_zone variables compared to standard table queries. In 4.0.1, you were seeing the "raw" string (which happened to be UTC); in 4.1.1, you are seeing a "processed" timestamp that might be defaulting to Asia/Shanghai (the StarRocks hardcoded default) during the display phase.
How to Verify and Workaround
To confirm if 4.1.1 is ignoring your session variable for this specific view, try:
sql
-- Check if Global vs Session makes a difference
SET GLOBAL time_zone = 'UTC';
-- Reconnect your terminal and check:
SELECT * FROM information_schema.loads WHERE LABEL = 'your_label';
If it still shows the wrong time, you can explicitly cast it in your monitoring queries:
sql
SELECT
LABEL,
CONVERT_TZ(CREATE_TIME, '+08:00', '+00:00') AS CREATE_TIME_UTC
FROM information_schema.loads;
Recommendation:
Because 4.1.1 changed the underlying communication protocol for these timestamps (#73365), it is highly recommended to explicitly set -Duser.timezone=UTC in your fe.conf. This ensures that even the internal "naive" conversions default to UTC instead of Asia/Shanghai.
References
• administration/management/timezone.md
• release_notes/release-4.1.md
• administration/management/FE_configuration.md
References
• administration/management/timezone.md
• loading/Spark-connector-starrocks.md
• faq/loading/Broker_load_faq.md
• release_notes/release-3.3.md
• release_notes/release-2.1.mdRumit Jain
07/20/2026, 10:28 AMRumit Jain
07/21/2026, 5:02 AMKevin Cai
07/21/2026, 5:05 AMRumit Jain
07/21/2026, 5:40 AM[2026-07-21T05:34:04.456Z] time="2026-07-21T05:34:04Z" level=warning msg="No matching tags found" allow="[^4\\.1\\.2$]" available="[2.5-latest 2.5.0 2.5.10 2.5.11 2.5.12 2.5.13 2.5.14 2.5.15 2.5.16 2.5.17 2.5.18 2.5.19 2.5.2 2.5.20 2.5.21 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 3.0-latest 3.0.0 3.0.0-rc01 3.0.0-rc02 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1-latest 3.1.0 3.1.0-rc01 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2-latest 3.2.0-rc01 3.2.1 3.2.10 3.2.11 3.2.12 3.2.13 3.2.14 3.2.15 3.2.16 3.2.2 3.2.3 3.2.4 3.2.6 3.2.7 3.2.8 3.2.9 3.3-latest 3.3.0 3.3.0-rc01 3.3.0-rc02 3.3.1 3.3.10 3.3.11 3.3.12 3.3.13 3.3.14 3.3.15 3.3.16 3.3.17 3.3.18 3.3.19 3.3.2 3.3.20 3.3.21 3.3.22 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9 3.4-latest 3.4.0 3.4.0-rc01 3.4.1 3.4.10 3.4.2 3.4.3 3.4.4 3.4.5 3.4.6 3.4.7 3.4.8 3.4.9 3.5-latest 3.5.0 3.5.0-rc01 3.5.1 3.5.10 3.5.11 3.5.12 3.5.12-patchmv 3.5.13 3.5.14 3.5.15 3.5.16 3.5.17 3.5.18 3.5.19 3.5.2 3.5.3 3.5.4 3.5.5 3.5.6 3.5.7 3.5.8 3.5.9 4.0-latest 4.0.0 4.0.0-decimal0625-4cf2aba 4.0.0-rc01 4.0.0-rc02 4.0.1 4.0.10 4.0.11 4.0.12 4.0.13 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.0.9 4.1-latest 4.1.0 4.1.0-rc01 4.1.1 4.1.3 branch-3.2-tpcds-ebc85c4 branch-3.3-37f93d8 branch-3.4-4b80ea0 branch-3.5.3-a-0821-c30ed5e ipv6-for-ydy-0403-4f1e3e5 latest main-5eb9db4 pr46742-d4b5c76 pr47226 pr49012-b73ae44 pr50817-512ed85 pr50982-668eddb pr51572-dccc2a5 pr51597-196dbbf pr51597-f17da96 pr52219-34ff295 pr52260-4e4904c pr52298-69cfc23 pr52992-34553d2 pr53734-c07f7b6 pr53865-d96a2fe pr54727-8343c16 pr54727-b80559d pr56964-2b81501 pr57046-be962c3 v324-patch-partition-key-8a78186]" deny="[]" source="<http://docker.io/starrocks/fe-ubuntu:latest|docker.io/starrocks/fe-ubuntu:latest>"Rumit Jain
07/21/2026, 5:41 AMKevin Cai
07/21/2026, 5:42 AMKevin Cai
07/21/2026, 5:42 AMRumit Jain
07/21/2026, 8:50 AMKevin Cai
07/21/2026, 12:53 PM