RonJay
06/02/2026, 9:22 AMRocky
06/02/2026, 9:22 AMfe.conf for negative DNS TTL (failed lookups), unlike the dns_cache_ttl_seconds parameter which handles positive lookups.
To configure the negative DNS TTL for a StarRocks FE pod, you must use standard JVM properties. Since the FE is a Java process, you can set this via the JAVA_OPTS environment variable in your Kubernetes deployment or fe.conf.
Recommended Method: JAVA_OPTS
Add the following system property to your `JAVA_OPTS`:
bash
-Dsun.net.inetaddr.negative.ttl=<seconds>
Example: -Dsun.net.inetaddr.negative.ttl=0 disables negative caching entirely.
Alternative: java.security
You can also modify the java.security file within the FE container (typically found in $JAVA_HOME/conf/security/java.security), though this is less convenient in Kubernetes than using environment variables:
properties
networkaddress.cache.negative.ttl=<seconds>
Summary of DNS Settings
Type | FE Configuration | JVM Property Equivalent
Positive TTL | dns_cache_ttl_seconds (v3.1.13+, v3.2.9+, v3.3.3+) | networkaddress.cache.ttl
Negative TTL | None | networkaddress.cache.negative.ttl
Note: If you are using the StarRocks Operator, you can add these to the spec.fe.env section of your StarRocksCluster YAML` (or StarRocksCluster) custom`) custom resource.
References
• administration/management/FE_configuration.md
• administration/management/BE_configuration.mdFrancisco Silva
06/03/2026, 10:39 AMRocky
06/03/2026, 10:39 AMwrite_quorum setting is a per-table property, not a cluster-wide configuration.
While StarRocks has a cluster-wide default behavior of MAJORITY for all tables, there is no global configuration parameter (like default_write_quorum in fe.conf) to change this default for the entire cluster at once.
Key Details:
* Default Behavior: If not specified, all tables use MAJORITY.
* Table Level: You specify it during table creation or modify it later:
sql
-- Specify during creation
CREATE TABLE my_table (
...
) PROPERTIES (
"write_quorum" = "ONE"
);
-- Modify existing table
ALTER TABLE my_table SET ("write_quorum" = "ALL");
* Supported Values:
* MAJORITY (Default): Succeeds when the majority of replicas acknowledge.
* `ONE`: Succeeds as soon as one replica acknowledges.
* `ALL`: Succeeds only when all replicas acknowledge.
Note: If you are looking for a way to change the default number of replicas cluster-wide, you can use the FE configuration default_replication_num. However, for the write acknowledgement logic (write_quorum), it must be handled at the table level.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/management/FE_configuration.mdFrancisco Silva
06/03/2026, 10:40 AMdefault_write_quorum exists?Rocky
06/03/2026, 10:41 AMdefault_write_quorum does NOT exist as a configuration parameter in StarRocks.
In my previous response, I used it as a hypothetical example—a "if this existed, it would look like this"—to illustrate that there is no global setting to change the default write quorum for the entire cluster.
Here is the definitive status:
* Is there an FE config default_write_quorum? No.
* Is there a session variable for it? No.
* How is it managed? It is hardcoded to MAJORITY at the system level. If you want a different behavior (like ONE or ALL), you must specify the "write_quorum" property per table during CREATE TABLE or ALTER TABLE.
If you were to try adding default_write_quorum to your fe.conf, the FE would simply ignore it or fail to recognize it as a valid configuration key metadata.
References
• administration/management/resource_management/Replica.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.mdFrancisco Silva
06/03/2026, 11:46 AMrocksdb iterate timeout, try to compact
what does this meanRocky
06/03/2026, 11:46 AMload tablets from rocksdb timeout, try to compact meta and retry (or similar variants involving "rocksdb iterate timeout") indicates that the StarRocks Backend (BE) is struggling to read its local tablet metadata within the expected time.
What it means
1. Local Metadata Storage: Each BE maintains a local RocksDB database (usually in the /meta subdirectory of your storage root) to store "tablet headers." These headers contain critical information about rowsets, versions, and tablet states.
2. The Timeout: During BE startup or certain background tasks, the BE must iterate through all keys in this RocksDB instance. If this iteration takes too long (hitting a internal timeout, often because of too many "tombstones" or stale metadata entries), the process triggers this warning.
3. Self-Healing: The BE is programmed to recognize this timeout, trigger a manual RocksDB Compaction on the metadata store to clean up deleted entries and optimize the data layout, and then retry the operation.
Common Causes
* High Metadata Churn: Frequently creating and deleting many tables or partitions generates a high volume of metadata tombstones in RocksDB.
* Slow Disk I/O: If the BE's metadata is stored on slow storage (like HDDs or heavily throttled cloud disks), the iteration may naturally exceed the timeout.
* Known Bug (#65146): In some versions, a bug caused the BE to incorrectly handle these timeouts during startup, potentially leading to incomplete tablet loading (tablets appearing "lost" or in an error state until another restart).
Recommendations
* Monitor Completion: Check the BE logs (<http://be.INFO|be.INFO> or be.WARNING) to see if the "retry" eventually succeeds. If you see a subsequent message like load tablet from meta finished, the self-healing worked.
* Upgrade: If you encounter this frequently or if tablets fail to load after a restart, ensure you are on a version where the metadata loading logic was improved (Fixes are included in v3.1.13+, v3.2.9+, v3.3.3+, and v4.0+).
* Storage Type: Ensure the BE storage_root (specifically the one hosting the metadata) is on high-performance storage like NVMe or SSD.
References
• administration/management/BE_configuration.md
• administration/management/compaction.md
• GitHub Issue #65146: Tablet metadata load error due to RocksDB iteration timeout
References
• administration/management/BE_configuration.md
• administration/management/FE_configuration.mdFrancisco Silva
06/04/2026, 2:16 PMRocky
06/04/2026, 2:17 PMFrancisco Silva
06/04/2026, 2:17 PMRocky
06/04/2026, 2:18 PMreplication_num = 3 with a MAJORITY quorum follows the same math:
1. Replication Count ($N$): 3.
2. Write Quorum (MAJORITY): For 3 replicas, the majority is 2 ($3/2 + 1$).
3. The Scenario: One node goes down.
* For any tablet with 3 replicas, 1 replica is now offline and 2 replicas remain online.
4. Result: Since 2 replicas are still available and 2 are required to reach a majority, the write operation will succeed.
Important Behavior Details:
* Wait Time: Even if the majority is reached quickly, StarRocks typically waits for all replicas to report a status (success, failure, or timeout) before finalized the transaction status to the user. If a node is completely down, the system will eventually treat those specific replica writes as "failed" due to timeout, but as long as the other 2 succeeded, the overall transaction is marked as a Success.
* Data Safety: You are now at the limit. If a second node goes down, you would only have 1 replica left. Since 1 is less than the majority (2), writes would then fail to prevent data inconsistency.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/management/FE_configuration.md
• knowledge/usage/best-practice.md
• faq/Sql_faq.mdFrancisco Silva
06/04/2026, 2:18 PMRocky
06/04/2026, 2:18 PMMAJORITY write quorum is calculated based on the configured replication_num of the table, not the number of nodes currently alive in the cluster.
If a node goes down due to an unexpected incident (and is not cleanly decommissioned), the math stays exactly the same because the system still expects the number of replicas you defined in the table properties.
The Calculation Logic
The formula for MAJORITY is:
Quorum = floor(replication_num / 2) + 1
Configured replication_num | "Majority" Quorum Needed
1 | 1
2 | 2
3 (Default) | 2
4 | 3
5 | 3
Why an incident doesn't change the quorum
If the quorum shifted based on how many nodes were "alive" during an incident, the system would lose its consistency guarantees. For example:
* If you have replication_num = 3 and 2 nodes go down, only 1 replica remains.
* If StarRocks recalculated the majority based on "alive" nodes, it would accept the write to that 1 remaining replica as a "success" (since 1 is the majority of 1).
* StarRocks does NOT do this. It still requires 2 successful writes (the majority of the configured 3). If only 1 node is up, the write will fail.
Summary for your scenarios:
* 5 Nodes, 4 Replicas: If 1 node goes down, you have 3 replicas left. The quorum is 3. Writes succeed.
* 5 Nodes, 3 Replicas: If 1 node goes down, you have 2 replicas left. The quorum is 2. Writes succeed.
Note on "Wait Time": When a node is down from an incident, the "Coordinator BE" will try to send data to all intended replicas. It will receive immediate "connection refused" or eventual timeouts from the down node. As soon as it has the 2 (for 3-replica) or 3 (for 4-replica) successful acknowledgments it needs, it considers the write successful and proceeds.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.mdFrancisco Silva
06/04/2026, 2:19 PMRocky
06/04/2026, 2:19 PMMAJORITY requirement is calculated using the replication_num value defined in your table settings. It does not change dynamically based on how many nodes are currently alive.
2. The Math: For replication_num = 3, the Majority Quorum is 2 ($3/2 + 1$).
3. The Incident: If one BE node goes down unexpectedly:
_ The table still has a _target* of 3 replicas.
* Two replicas are on healthy nodes, and one is on the failed node.
* When you write, the Coordinator BE sends data to all three.
* The two healthy nodes acknowledge the write; the failed node does not.
* Because 2 (Successes) $\ge$ 2 (Majority Quorum), the write is immediately marked as a Success.
Why it doesn't wait for repair:
If StarRocks blocked writes until the "repair" (cloning) was finished, the system would lose its High Availability. The primary purpose of having 3 replicas is so that you can lose one node and keep operating (both reads and writes) without any downtime.
The "Repair/Clone" process happens in the background to restore your redundancy back to 3, but it does not block writes to the surviving 2 replicas in the meantime.
Summary for your 5-node cluster:
* Target Replicas: 3
* Write Quorum: 2
* Nodes Down: 1 (leaving 2 replicas reachable)
* Result: Writes succeed.
If you were to lose a second node (leaving only 1 replica reachable), then writes would fail, because 1 is not a majority of 3.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/management/FE_configuration.md
• faq/Sql_faq.md
• knowledge/usage/best-practice.mdFrancisco Silva
06/04/2026, 2:20 PMRocky
06/04/2026, 2:21 PMthrift_rpc_timeout_ms or stream_load_default_timeout_second) before it can officially mark that specific replica's write as "failed."
* Only after that timeout is hit does StarRocks check the quorum. Since 2 succeeded, it finally returns "Success" to you. This "hang" during the timeout period makes the system appear stopped.
2. Single Leader Replication (replicated_storage)
In StarRocks v3.0 and later, the default is replicated_storage = true. This uses Single Leader Replication:
* Data is written to a Primary replica first, which then pushes it to the secondaries.
* If the node that went down happened to host the Primary replica for a tablet, that tablet is effectively "leaderless" for a short window.
* The Load cannot proceed for that tablet until the FE detects the node is down (via heartbeat timeout, default 30s) and elects a new Primary among the surviving 2 replicas.
* During this election/detection window, your stream_load will fail or block because the "Write Leader" is missing.
3. Tablet Health Checks
If the FE's Tablet Checker marks a tablet as "Unhealthy" (because it has only 2 copies and the 3rd is missing), some internal scheduling logic may prioritize repair before allowing new version commits to prevent the tablet from falling too far behind.
Summary of why it "stops":
1. Heartbeat Lag: It takes ~30 seconds for the FE to realize the node is dead and stop trying to use it.
2. Primary Re-election: Tablets whose "Leader" was on the dead node must wait for the FE to assign a new leader.
3. RPC Timeouts: The Stream Load waits for the missing node to "timeout" on every single write request before it realizes it only has 2 responses.
How to make it faster?
If you want the system to recover faster from a node failure:
* Lower the heartbeat timeout: This allows the FE to mark the node as DEAD sooner.
* Check `write_quorum`: Ensure it is explicitly set to MAJORITY (it is the default, but if someone set it to ALL, writes will strictly fail until the node is back or repaired).
* Wait for the "Dead" state: Once the FE shows the node as Alive: false, the "stuck" feeling usually disappears because the system stops trying to talk to that node.
You are right: In practice, an incident causes a visible "stall" in loading. It is not an "instant" failover; it is a "wait-for-timeout-and-reelect" failover.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/operation_maintenance_faq.md
• loading/StreamLoad.md
• table_design/table_types/primary_key_table.mdRocky
06/04/2026, 2:21 PMFrancisco Silva
06/04/2026, 2:22 PMRocky
06/04/2026, 2:22 PMDead. Once the node is officially Dead, StarRocks stops waiting for it, and writes resume using the surviving replicas.
References
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/management/resource_management/Replica.md
• faq/operation_maintenance_faq.md
References
• administration/management/BE_configuration.md
• faq/operation_maintenance_faq.md
• administration/management/resource_management/Replica.md
• loading/Stream_Load_transaction_interface.mdFrancisco Silva
06/04/2026, 2:23 PMRocky
06/04/2026, 2:24 PMreplication_num=2
When you set replication_num=2 and write_quorum=MAJORITY, the math works like this:
* Formula: $\text{Majority} = (\text{Total Replicas} / 2) + 1$
* Result: $(2 / 2) + 1 = \mathbf{2}$
Because the majority of 2 is 2, you must have both replicas alive to succeed. If one node goes down, you only have 1 replica left. Since 1 is not a majority of 2, writes will fail by design. They will only start working again once the FE completes the "Repair" (cloning the missing replica to a new node) because only then can the system reach 2 successful writes again.
2. What "Leader" means for a BE
Even though you are talking about a BE node, StarRocks manages data in Tablets.
* Every tablet is a group of replicas (in your case, 2).
* If you use Primary Key tables or have replicated_storage=true, one of those replicas is designated as the Primary (Leader).
* All writes must go to the Primary replica first.
* If the BE node that goes down was the one hosting the "Primary" replica for a tablet, that tablet is effectively "dead" for writes until the FE detects the failure and promotes the other surviving replica to be the new Primary.
Summary of why your test failed:
1. Quorum Failure: With replication_num=2, "Majority" means "All". Losing 1 node makes it impossible to hit a majority.
2. Recovery Window: Writes "stop" until the FE marks the node as Dead and clones the data to a 5th node to restore the count to 2.
Solution: If you want to survive 1 node failure and keep writing, you must use replication_num=3. In that case, Majority is 2, so writes will continue on the 2 surviving nodes even before the repair starts.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/operation_maintenance_faq.md
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/loading/Routine_load_faq.md
• loading/Spark-connector-starrocks.md
• quick_start/shared-nothing.md
• quick_start/shared-data.mdFrancisco Silva
06/04/2026, 2:24 PMRocky
06/04/2026, 2:25 PMDEAD.
Summary: 4 vs 2 Replicas
* With 2 Replicas (Majority=2): Losing 1 node makes it impossible to write. You must wait for the repair (cloning) to finish to get back to 2 replicas.
* With 4 Replicas (Majority=3): Losing 1 node still allows for a majority. However, you will experience a temporary "stall" (timeout) until the FE officially marks the node as Dead. Once the node is marked Dead, the system stops trying to talk to it, and your 3/4 writes will become fast again—*even before the 4th replica is repaired.*
Verdict: In a 4-replica setup, you don't have to wait for the "repair" (cloning) to finish for writes to work, but you do have to wait for the "failure detection" (timeout) to finish.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/operation_maintenance_faq.md
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/operation_maintenance_faq.mdFrancisco Silva
06/04/2026, 2:25 PMRocky
06/04/2026, 2:25 PMreplication_num=2 and write_quorum=MAJORITY, writes will fail and stay failed until the missing replica is cloned/repaired.
The reason I may have sounded like I was contradicting you is that I was trying to explain how it fails (the timeout), but I missed the critical point that with $N=2$, the math makes success impossible. Here is the breakdown of why both points are true:
1. The Math (Why it Fails)
* For replication_num=2, the MAJORITY is calculated as 2.
* If 1 node goes down, you only have 1 replica left.
* Because 1 is less than 2, the system cannot reach a majority. Therefore, the load must fail. It will continue to fail until StarRocks clones the data to a new node and brings the healthy count back to 2.
2. The "Stop" (Why it Hangs before failing)
* Even though the system logically cannot reach a majority (1/2), StarRocks waits for the dead node to timeout before it officially declares the load a failure.
* This is why you see the system "stop" or hang for a few minutes. It is waiting for the RPC (network) timeout of the missing node.
* Once the timeout hits, it says "I only have 1 success and 1 timeout; 1 is not a majority," and then it returns the error to you.
Summary
* Your observation is correct: With 2 replicas, you lose write availability immediately when 1 node goes down. It only recovers once the "Repair/Clone" process finishes.
* The solution: To survive a node failure and keep writing, you must use replication_num=3. In that case, Majority is 2, so the 2 surviving nodes can still accept writes while the 3rd is being repaired.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/operation_maintenance_faq.md
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/operation_maintenance_faq.md
• faq/Sql_faq.md
• knowledge/usage/best-practice.md
• administration/management/FE_configuration.mdFrancisco Silva
06/04/2026, 2:26 PMRocky
06/04/2026, 2:26 PMreplication_num=3, write_quorum=MAJORITY
* Quorum Required: 2 (Majority of 3 is 2).
* If 1 node goes down: You have 2 replicas left.
* Write Result: SUCCESS. Since 2 replicas are still alive, you meet the quorum.
* Behavior: Writes may hang briefly for the RPC timeout or during Primary replica re-election (approx. 30s), but they will succeed without waiting for a repair/clone.
Scenario 2: replication_num=4, write_quorum=MAJORITY
* Quorum Required: 3 (Majority of 4 is 3).
* If 1 node goes down: You have 3 replicas left.
* Write Result: SUCCESS. Since 3 replicas are still alive, you meet the quorum.
* Behavior: Same as above; writes continue to work because $3 \ge 3$.
Key Difference from your $N=2$ test:
* In your $N=2$ test, Majority was 2. Losing one node dropped you to 1, which is less than the required 2. That is why it failed.
* In $N=3$ or $N=4$, losing one node still leaves you with enough replicas to satisfy the "Majority" math.
Summary: For continuous write availability during a single node failure, you must use replication_num >= 3 with write_quorum=MAJORITY.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/operation_maintenance_faq.mdFrancisco Silva
06/04/2026, 2:27 PMRocky
06/04/2026, 2:27 PMreplication_num=4, write_quorum=MAJORITY, 2 nodes down
* Quorum Required: 3 (Majority of 4 is 3).
* Result: FAIL.
* Why: With 4 replicas distributed across 5 nodes, losing any 2 nodes makes it mathematically certain that many tablets will only have 2 replicas remaining. Since 2 is less than the required quorum of 3, the write operation cannot complete.
2. replication_num=3, write_quorum=MAJORITY, 2 nodes down
* Quorum Required: 2 (Majority of 3 is 2).
* Result: FAIL.
* Why: With 3 replicas distributed across 5 nodes, losing 2 specific nodes will result in many tablets having only 1 replica remaining. Since 1 is less than the required quorum of 2, the write operation fails.
Summary:
To survive 2 nodes being down simultaneously while keeping writes alive, you would need at least replication_num=5 (where Majority is 3, leaving 3 survivors). In both of your examples, the number of surviving replicas for affected tablets falls below the mathematical majority of the configured replica count.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/management/FE_configuration.md
• faq/Sql_faq.mdFrancisco Silva
06/04/2026, 2:30 PMRocky
06/04/2026, 2:30 PMMAJORITY quorum:
1. To lose 1 BE node and keep writing:
* Configuration: replication_num=3
* Quorum: write_quorum=MAJORITY (Requires 2 replicas to succeed).
* Why: If 1 node fails, you still have 2 replicas alive. Since 2 meets the majority of 3, writes continue.
2. To lose 2 BE nodes and keep writing:
* Configuration: replication_num=5
* Quorum: write_quorum=MAJORITY (Requires 3 replicas to succeed).
* Why: If 2 nodes fail, you still have 3 replicas alive. Since 3 meets the majority of 5, writes continue.
──────────
Summary Table (5 BE Cluster)
To survive... | Required replication_num | write_quorum | Quorum Math
1 node down | 3 | MAJORITY | 2 of 3 must be up
2 nodes down | 5 | MAJORITY | 3 of 5 must be up
*Note: You can technically use write_quorum=ONE to survive more failures with fewer replicas, but this is not recommended as it risks data inconsistency and data loss if the remaining node also fails before the others return.*
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/operation_maintenance_faq.mdFrancisco Silva
06/04/2026, 2:30 PMRocky
06/04/2026, 2:31 PMreplication_num=4 and write_quorum=MAJORITY on a 5-node cluster:
1. If 1 BE node goes down:
* Quorum Required: 3 (Majority of 4 is 3).
* Result: SUCCESS.
* Why: You still have 3 surviving replicas. Since $3 \ge 3$, the majority requirement is met.
2. If 2 BE nodes go down:
* Quorum Required: 3 (Majority of 4 is 3).
* Result: FAIL.
* Why: You only have 2 surviving replicas. Since $2 < 3$, you no longer have a majority.
Comparison Note:
Even though you have 4 replicas, you can still only afford to lose 1 node for writes to stay healthy. To survive 2 nodes going down, you must increase your replication_num to 5 (where the majority is 3, and losing 2 leaves you with 3).
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/management/FE_configuration.md
• faq/Sql_faq.md
• faq/operation_maintenance_faq.mdFrancisco Silva
06/04/2026, 2:31 PMRocky
06/04/2026, 2:32 PMwrite_quorum=MAJORITY, yes, they are basically the same regarding the number of node failures you can survive for writes. Both configurations can only survive 1 node failure.
Here is the breakdown of why 4 replicas is generally considered less optimal than 3 in this specific scenario:
The "Even Number" Problem
For write availability, an even number of replicas provides the same fault tolerance as the odd number immediately below it, but with higher overhead:
* 3 Replicas: Majority is 2. (Can lose $3 - 2 = \mathbf{1}$ node).
* 4 Replicas: Majority is 3. (Can lose $4 - 3 = \mathbf{1}$ node).
Advantages of 4 Replicas (over 3)
1. Read Survival: If 2 nodes go down, you still have 2 copies of the data available for reads. With 3 replicas, you would only have 1 copy left, which is riskier for read-only operations during a crisis.
2. Persistence Safety: In the event of permanent disk corruption, having 4 physical copies is objectively safer than 3.
3. Read Throughput: You have more nodes capable of serving the same data, which can improve performance for highly concurrent read workloads.
Disadvantages of 4 Replicas (the "Why Not" list)
1. Strictness: Since the majority is higher (3 vs 2), your write operations are more likely to fail or timeout if a single BE node is just lagging or slow (even if it hasn't completely "crashed").
2. Storage Cost: You consume 33% more disk space (4 copies instead of 3) for no additional write-fault-tolerance.
3. Resource Overhead: Every write requires more network bandwidth, more IO, and more BE CPU to manage the 4th replica.
4. Metadata Pressure: The FE (Front End) has to manage 33% more tablet metadata, which can impact cluster management performance in very large clusters.
Conclusion
In StarRocks, it is standard best practice to use 3 replicas for most production workloads or 5 replicas if you absolutely must survive 2 concurrent node failures. Using 4 is rarely recommended because it increases your costs and write-failure sensitivity without increasing your write fault-tolerance.
References
• administration/management/resource_management/Replica.md
• knowledge/usage/best-practice.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
References
• administration/management/resource_management/Replica.md
• knowledge/usage/best-practice.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.mdFrancisco Silva
06/04/2026, 2:32 PMRocky
06/04/2026, 2:33 PMreplication_num=4 is considered "stricter" and less ideal:
1. The "All-or-Nothing" Problem when 1 node is down
When 1 node is already down in your 5-node cluster:
* With 3 replicas: You have 2 left. Since the majority of 3 is 2, every single remaining replica must succeed for the write to work.
* With 4 replicas: You have 3 left. Since the majority of 4 is 3, every single remaining replica must succeed for the write to work.
In both cases, you have zero margin for error left. If any of the remaining healthy nodes becomes slow (GC pause, disk I/O spike, network jitter), your write will hang or timeout.
2. Statistical Probability of Failure
Think of it this way:
* To fail a write with 3 replicas, you need any 2 out of your 3 nodes to be slow/dead.
* To fail a write with 4 replicas, you need any 2 out of your 4 nodes to be slow/dead.
Because there are more ways for "any 2 nodes" to be slow in a group of 4 than in a group of 3, the 4-replica setup is statistically more likely to experience a write timeout in a real-world environment, even though the theoretical "node loss" limit is the same.
3. Tail Latency (The "Straggler" Effect)
When writing to 4 replicas, StarRocks has to coordinate more nodes. If 1 node is down, the system is waiting for the slowest of 3 nodes to finish to hit the majority of 3. If you used 3 replicas, it would only be waiting for the slowest of 2 nodes. The more nodes you involve in a quorum, the higher your "tail latency" (p99) becomes.
Summary
Config | Fault Tolerance | Quorum | Why it's awkward
3 Replicas | 1 Node | 2 of 3 | Standard, efficient.
4 Replicas | 1 Node | 3 of 4 | Same safety as 3, but higher cost and more sensitive to "straggler" nodes.
5 Replicas | 2 Nodes | 3 of 5 | True upgrade in safety.
Bottom line: If you have the disk space to support 4 replicas, you should almost always just go to 5 replicas. This actually increases your fault tolerance to 2 nodes. If you can't afford 5, stick with 3.
References
• administration/management/resource_management/Replica.md
• knowledge/usage/best-practice.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
References
• administration/management/resource_management/Replica.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• knowledge/usage/best-practice.mdFrancisco Silva
06/04/2026, 2:34 PMRocky
06/04/2026, 2:35 PMreplication_num=4 is risky on a 5-node cluster.
To clarify your worry: Creating new partitions will only stop if the number of alive BE nodes falls below your replication_num.
The Math for Your Cluster (5 Nodes)
Case | Alive Nodes | replication_num = 3 | replication_num = 4
Healthy | 5 | Works (Places 3/5) | Works (Places 4/5)
1 Node Down | 4 | Works (Places 3/4) | Works (Places 4/4)
2 Nodes Down | 3 | Works (Places 3/3) | FAILS (Needs 4, only 3 alive)
Why your worry is correct:
If you use replication_num=4, you are "using up" your safety margin for management operations:
1. Creation Failure: If you lose 2 nodes, you can no longer create new tables or add new partitions for that table. StarRocks will throw an error: Table replication num should be less than or equal to the number of available BE nodes.
2. No Room for Repair: If 1 node is permanently dead, you only have 4 nodes left. Since your table requires 4 replicas, StarRocks cannot repair any lost replicas because there is no 5th "spare" node to move the data to. Your cluster will stay in a "degraded" state forever until you fix the dead node or add a new one.
3. Maintenance Issues: If you need to take 1 node down for a rolling upgrade while another node happens to be having issues, your partition creation (and writes, as discussed before) will immediately fail.
Summary
If you have 5 nodes:
* Use replication_num=3: You can lose 2 nodes and still create partitions/tables. You also have 2 "spare" nodes available to handle automatic repairs if one node dies.
* Use replication_num=5: Only if you want the highest possible data safety (can lose 2 nodes and keep reading), but you lose the ability to create partitions if 1 node is down.
* Avoid replication_num=4: It gives you the "creation" fragility of a 4-node cluster despite you having paid for 5 nodes.
References
• administration/management/resource_management/Replica.md
• faq/operation_maintenance_faq.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
References
• administration/management/resource_management/Replica.md
• faq/operation_maintenance_faq.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/management/FE_configuration.md
• sql-reference/information_schema/be_tablets.md
References
• faq/operation_maintenance_faq.md
• administration/management/FE_configuration.md
• administration/management/resource_management/Replica.md
• administration/management/resource_management/be_label.md
• faq/Deploy_faq.md
• sql-reference/information_schema/be_tablets.mdFrancisco Silva
06/04/2026, 2:37 PMRocky
06/04/2026, 2:38 PMreplication_num=4 setup on a 5-node cluster:
1. The Write Process (Immediate)
Because the write_quorum is set to MAJORITY by default:
* Original Replicas: 4
* Majority (Quorum) needed: 3
* Status: Since you still have 3 healthy BE nodes holding replicas, StarRocks can successfully write to those 3 and return a "Success" to the client. It does not wait for the dead node to come back or for a new 4th replica to be created elsewhere.
2. The Repair Process (Background)
While you are continuing to write to the 3 remaining replicas, the FE (Front End) notice that the tablet is "unhealthy" (it wants 4 replicas but only has 3).
* Action: The FE will schedule a Clone Task.
* Destination: Since you have a 5-node cluster, there is one node that does not yet have a copy of this data. The FE will tell that 5th node to copy the data from one of the 3 healthy nodes.
* Completion: Once that 5th node finishes copying, you are back to 4 replicas.
The "Danger Zone" during this time
Even though writes don't stop, you are in a very fragile state until that background repair finishes:
1. Zero Margin for Error: To hit your majority of 3, you need all 3 remaining healthy nodes to respond. If any one of those 3 nodes experiences a "hiccup" (high CPU, long Java GC pause, or a temporary network blip), your write will hang or fail because you can no longer hit the number 3.
2. Increased Load: The 3 remaining nodes are now handling all the original write traffic plus the I/O and network stress of "cloning" the data to the 5th node to repair the cluster.
Summary
* Does it stop? No.
* Is it safe? Technically yes, because you have 3 copies.
* Is it "stable"? Not really. In a replication_num=3 setup, if one node dies, you only need 2 out of the 2 remaining nodes to succeed. It's the same logic, but with rep=4, you are involving more hardware in every single write, which statistically increases the chance that a "straggler" node will slow down your ingestion.
This is why the majority rule favors odd numbers (3, 5):
* With 3 replicas, you need 2 for a majority (Allows 1 failure, with 1 "extra" node to potentially miss the write but still succeed).
* With 4 replicas, you need 3 for a majority (Allows 1 failure, but zero "extra" nodes can miss the write).
References
• administration/management/resource_management/Replica.md
• faq/operation_maintenance_faq.md
• administration/management/FE_configuration.md
• sql-reference/information_schema/be_tablets.mdFrancisco Silva
06/04/2026, 2:38 PMRocky
06/04/2026, 2:39 PM(N / 2) + 1.
The Math for 3 Nodes / 2 Replicas
When you set replication_num=2, here is how StarRocks calculates the write quorum:
* Total Replicas (N): 2
* Majority Required: (2 / 2) + 1 = 2
This means for replication_num=2, a "Majority" quorum is mathematically identical to an "ALL" quorum.
Because you need 2 out of 2 replicas to acknowledge the write:
1. Node Drops: You lose 1 BE node.
2. Immediate Impact: For any tablet that had one of its two replicas on that dead node, only 1 replica remains alive.
3. Write Fails: When you try to write, StarRocks sees it can only reach 1 replica. Since 1 is less than the required quorum of 2, the write fails or blocks immediately.
4. Repair Phase: The FE notices the tablet only has 1 replica. It finds one of the other 2 healthy BE nodes and starts a "Clone" task to create the 2nd replica there.
5. Writes Resume: Only once that background repair is finished and the tablet has 2 physical replicas again can the "Majority of 2" (which is 2) be satisfied.
Why this doesn't happen with 3 Replicas
If you had used replication_num=3 on those same 3 nodes:
* Total Replicas (N): 3
* Majority Required: (3 / 2) + 1 = 2
* When 1 Node Drops: You still have 2 replicas alive.
* Result: 2 out of 2 is still a majority of 3. Writes continue without any interruption, even before the repair tasks start.
Summary
The behavior you saw confirms why even numbers for replication are generally avoided in production:
* replication_num=2 has the same write availability as replication_num=1 (it can't survive any node being down for writes).
* replication_num=4 has the same write availability as replication_num=3 (it can only survive 1 node being down for writes).
Recommendation: For a 3-node or 5-node cluster, always stick to odd numbers (3 or 5) for your replication_num. This ensures that your "Majority" actually leaves you a margin of one or more "spare" failures.
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/operation_maintenance_faq.md
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/management/FE_configuration.md
• knowledge/usage/best-practice.md
• administration/management/resource_management/resource_group.mdFrancisco Silva
06/04/2026, 2:40 PMreplication_num=3 on those same 3 nodes:
* Total Replicas (N): 3
* Majority Required: (3 / 2) + 1 = 2
* When 1 Node Drops: You still have 2 replicas alive.
* Result: 2 out of 2 is still a majority of 3. Writes continue without any interruption, even before the repair tasks start.
you can't create new tablet partitions because it tries to do it in all 3 nodes and they don't exist. correct?Rocky
06/04/2026, 2:40 PMreplication_num = 3
* Status: 1 BE node is down (leaving 2 alive)
When you try to add a partition, the FE will look for 3 BE nodes to host the 3 replicas. Since only 2 nodes are alive, it cannot satisfy the replication_num=3 requirement and will throw an error:
2. The Trade-off Matrix (3-Node Cluster) Strategy | Node Down? | Can you Write? | Can you create Partitions?ERROR 1064 (HY000): Unexpected exception: Table replication num should be less than or equal to the number of available BE nodes.
rep=3 | 1 Down | YES (2/3 is majority) | NO (Needs 3 alive nodes)
rep=2 | 1 Down | NO (1/2 is not majority) | YES (Needs 2 alive nodes)
3. How to handle this in production
This "Management Lock" is one reason why production clusters usually have more nodes than their replication_num (e.g., a 5-node cluster with replication_num=3).
If you are stuck on a 3-node cluster and one node is dead for a long time:
1. Manual Fix: You can temporarily change the table's replication_num to 2:
sql
ALTER TABLE my_table MODIFY PARTITION (*) SET("replication_num" = "2");
ALTER TABLE my_table SET("default.replication_num" = "2");
2. Partition Creation: Once the property is changed to 2, StarRocks will allow you to create new partitions on the 2 remaining healthy nodes.
3. Restoration: When the 3rd node comes back, change it back to 3, and StarRocks will automatically "repair" the tablets by cloning the 3rd replica back onto the recovered node.
Summary
Your observation was spot on. For a 3-node cluster:
* replication_num=2 makes your writes fragile (they stop if 1 node dies).
* replication_num=3 makes your partition management fragile (it stops if 1 node dies).
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/operation_maintenance_faq.md
• knowledge/usage/best-practice.md
References
• faq/operation_maintenance_faq.md
• administration/management/resource_management/Replica.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.mdFrancisco Silva
06/04/2026, 2:41 PMRocky
06/04/2026, 2:41 PMreplication_num=3 and replication_num=2 (using write_quorum=MAJORITY) comes down to whether your ingestion can survive a single node failure immediately.
1. The "Majority" Math
Regardless of the cluster size (5 nodes), the majority is calculated based on the replication_num of the table, not the total nodes in the cluster.
Property | Replication Num | Majority Needed to Write
rep=3 | 3 | 2 (3 / 2 + 1)
rep=2 | 2 | 2 (2 / 2 + 1)
2. Difference in Write Availability (When 1 Node Dies)
If 1 BE node fails in your 5-node cluster:
* With `replication_num=3`:
* For any given tablet, you still have 2 replicas alive on the remaining 4 nodes.
* Since 2 is the majority of 3, writes continue without interruption.
* With `replication_num=2`:
* About 40% of your tablets will have one of their replicas on the dead node. For those tablets, only 1 replica remains.
* Since 1 is not the majority of 2, writes to those tablets will fail/stop until the FE repairs them (clones them to a healthy node).
3. Difference in Management Availability
Because you have a 5-node cluster, you have plenty of "room" to create new data structures even if a node is down.
* With `replication_num=3`: You can lose up to 2 nodes and still create new partitions (because the FE can still find 3 healthy nodes to place the replicas).
* With `replication_num=2`: You can lose up to 3 nodes and still create new partitions (because the FE only needs 2 healthy nodes).
4. Summary Comparison for 5 BE Nodes
Feature | replication_num=3 | replication_num=2
Write Availability | Can lose 1 node; writes never stop. | Writes stop for affected tablets if 1 node dies.
Partition Creation | Can lose 2 nodes. | Can lose 3 nodes.
Repair Capability | High (4 nodes can host 3 replicas). | High (4 nodes can host 2 replicas).
Disk Usage | 3x data size. | 2x data size.
The Verdict:
Even on a large 5-node cluster, replication_num=2 is "fragile" for writes. If any node goes down, your ingestion pipeline will likely stall for several minutes while the background "Repair/Clone" tasks run to restore the 2nd replica.
With replication_num=3, the system handles a node failure transparently—the users and the ingestion pipeline usually won't even notice.
References
• administration/management/resource_management/Replica.md
• faq/operation_maintenance_faq.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.md
• deployment/plan_cluster.mdFrancisco Silva
06/04/2026, 2:41 PMRocky
06/04/2026, 2:41 PMreplication_num=4 and replication_num=3 (with write_quorum=MAJORITY) follows the same "Even Number Quorum" logic but with higher numbers.
1. The Write Quorum Math
The majority is calculated as (N / 2) + 1.
Property | Replication Num (N) | Majority Required to Write
rep=3 | 3 | 2
rep=4 | 4 | 3
2. Failure Scenarios for Writes
* If 1 Node Fails:
* rep=3: You have 2 replicas left. Since 2 is the majority of 3, writes continue.
* rep=4: You have 3 replicas left. Since 3 is the majority of 4, writes continue.
_ _Result:* Both survive 1 node failure for writes.
* If 2 Nodes Fail:
* rep=3: You have 1 replica left. 1 is not the majority of 3. Writes stop.
* rep=4: You have 2 replicas left. 2 is not the majority of 4 (majority of 4 is 3). Writes stop.
_ _Result:* Both stop writing if 2 nodes fail.
Key Takeaway: Moving from rep=3 to rep=4 does not improve your write availability. Both configurations can only survive exactly 1 node failure for continuous ingestion.
3. Difference in Management (Partition Creation)
This is where rep=4 becomes a disadvantage on a 5-node cluster.
* rep=3: To create a new partition, StarRocks needs to find 3 healthy BE nodes. In a 5-node cluster, you can lose 2 nodes and still create new partitions.
* rep=4: To create a new partition, StarRocks needs to find 4 healthy BE nodes. You can only lose 1 node. If a 2nd node goes down, you can no longer add partitions or create tables.
4. Summary for 5 BE Nodes
Feature | replication_num=3 | replication_num=4
Write Availability | Can lose 1 node. | Can lose 1 node.
Partition Creation | Can lose 2 nodes. | Can lose 1 node.
Data Durability | Can lose 2 nodes total. | Can lose 3 nodes total.
Storage Cost | 3x | 4x
Conclusion
replication_num=4 is rarely used because:
1. It provides the exact same write availability as replication_num=3.
2. It makes management tasks more fragile (less room for node failures during partition creation).
3. It consumes 33% more disk space for no gain in uptime.
If you want more availability than rep=3 on a 5-node cluster, the next logical step is replication_num=5 (which allows you to survive 2 node failures for writes, as the majority of 5 is 3).
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• faq/operation_maintenance_faq.md
References
• administration/management/resource_management/Replica.md
• sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE.md
• administration/management/FE_configuration.md
• knowledge/usage/best-practice.md
• faq/operation_maintenance_faq.mdFrancisco Silva
06/05/2026, 9:30 AMRocky
06/05/2026, 9:30 AMfe.conf configuration file, located in the fe/conf/ directory of your StarRocks installation.
1. Where to see/edit the settings
Look for the JAVA_OPTS line in fe.conf. It contains standard JVM flags like -Xmx (Max Heap) and -Xms (Initial Heap).
* File Path: path_to_starrocks/fe/conf/fe.conf
* Example entry:
bash
JAVA_OPTS="-Xmx8g -Xms8g -XX:+UseG1GC ..."
2. Default Values
While the exact "out-of-the-box" default can vary slightly by version (often starting at 8GB in many templates), StarRocks recommends specific minimums based on your cluster's metadata scale (number of tablets):
Number of Tablets | Recommended FE Memory (-Xmx)
Below 1 million | 16 GB
1 – 2 million | 32 GB
2 – 5 million | 64 GB
5 – 10 million | 128 GB
3. Key Configuration Rules
* Keep -Xms and -Xmx identical: This prevents the JVM from constantly resizing the heap, which can cause performance jitters or "Stop the World" GC pauses during metadata-heavy operations.
* Physical Memory Margin: If the FE is on a dedicated node:
* If total RAM < 32GB, set -Xmx to ~70% of total RAM.
* If total RAM > 32GB, set -Xmx to ~80% of total RAM.
* The remaining memory is used by the OS and the FE's off-heap processes (like the C++ query planner parts).
* MALLOC_ARENA_MAX: In many fe.conf files, you'll also see export MALLOC_ARENA_MAX=1. This is used to limit memory fragmentation in the non-JVM parts of the process.
How to check the actual current usage
If the FE is already running and you want to see what it's actually using (versus what is in the file), run:
bash
jstat -gcutil <FE_PID> 1000
Or check the FE's internal metrics via the web UI (default port 8030) under the Metrics or System** tabs.
References
• faq/Others.md
• administration/management/FE_configuration.md
• knowledge/trouble_shooting/fe_memory_problems.md
• administration/Meta_recovery.md
• faq/operation_maintenance_faq.mdFrancisco Silva
06/05/2026, 9:33 AMRocky
06/05/2026, 9:33 AM-Xmx settings based on the total number of tablets in your cluster:
* StarRocks FAQ - How to set FE memory size?
2. Physical Memory Percentage Rules
The "70% vs 80%" rules and advanced troubleshooting for FE memory (including MALLOC_ARENA_MAX) are detailed in the FE Memory Problems guide:
* FE Memory Problems Troubleshooting and Optimization (Specifically under the "FE OOM killed by OS" section).
3. General FE Configuration
For a full list of FE configuration parameters and how to edit fe.conf, refer to:
* FE Configuration Parameters
Summary of the key numbers from these links:
Number of Tablets | Recommended FE JVM Heap (-Xmx)
< 1 million | 16 GB
1 – 2 million | 32 GB
2 – 5 million | 64 GB
5 – 10 million | 128 GB
* Rule of thumb: If the FE is on a dedicated node, set -Xmx to 70% of total RAM (if RAM < 32GB) or 80% (if RAM > 32GB). Always set -Xms (initial) to the same value as -Xmx (max).
References
• faq/Others.md
• administration/Meta_recovery.md
• administration/management/FE_configuration.md
• knowledge/trouble_shooting/fe_memory_problems.md
• faq/Deploy_faq.mdFrancisco Silva
06/05/2026, 9:38 AMRocky
06/05/2026, 9:38 AMbe.conf file.
* File Path: path_to_starrocks/be/conf/be.conf
* Key Parameter: mem_limit
2. Default Values and Logic
Unlike the FE, which has a fixed default (like 8GB), the BE defaults to a percentage of the total physical RAM on the machine.
* mem_limit (Default: 90%): By default, the BE process is allowed to use up to 90% of the total system memory.
* You can set this as a percentage: mem_limit = 80%
* Or as a fixed value: mem_limit = 128G
* Soft vs. Hard Limit:
* Hard Limit: The value set in mem_limit (default 90%). If the BE hits this, it will trigger OOM (Out of Memory) protections and potentially kill queries.
* Soft Limit: Typically 80% of the mem_limit. When memory usage reaches this level, the BE starts aggressively flushing caches and may reject new heavy tasks to stay stable.
3. Key Sub-Limits (Defaults)
The BE further divides its memory into "pools" for different tasks. You generally don't need to change these unless you have a specific workload (like very heavy streaming ingestion):
Parameter | Default | Description
load_process_max_memory_limit_percent | 30% | Max memory allowed for data loading (Stream Load, Broker Load, etc.).
compaction_max_memory_limit_percent | 100% | Max memory for background data merging (constrained by the overall mem_limit).
consistency_max_memory_limit_percent | 20% | Max memory for replica consistency checks.
4. Important Recommendations
* Avoid Shared Nodes: StarRocks BE is designed to utilize all available resources. It is highly recommended not to deploy other memory-intensive services (like HDFS or other databases) on the same node as a BE.
* Swap Space: It is standard practice to disable swap on BE nodes to ensure predictable query performance and prevent the process from hanging.
* Cgroups: If you are running in a container (K8s/Docker), ensure mem_limit is aligned with your container limits, or the BE may be killed by the OS/Container runtime before it can trigger its own safety mechanisms.
Documentation Links
* BE Configuration Parameters (mem_limit)
* BE Memory Management Details
References
• administration/management/BE_configuration.md
• faq/operation_maintenance_faq.md
• administration/management/resource_management/resource_group.md
• deployment/helm_charts/Environment_Requirements.md
• knowledge/trouble_shooting/be_memory_problems.md
_be_memory_problems)
)
References
• administration/management/BE_configuration.mdFrancisco Silva
06/05/2026, 9:43 AMRocky
06/05/2026, 9:43 AMJAVA_OPTS setting for be.conf, but it serves a very specific purpose compared to the FE.
While the BE is a C++ process, it starts an embedded JVM via JNI (Java Native Interface) to handle specific tasks that require Java libraries.
1. What is it used for?
In the BE, JAVA_OPTS is primarily used to configure the heap for:
* Java UDFs: If you run custom Java User Defined Functions.
* External Catalogs: When the BE communicates with HDFS, Hive, Iceberg, or Hudi using the Hadoop/Java client libraries.
* JDBC-based queries: Accessing external databases via JDBC.
2. Default and Configuration
In a default installation, JAVA_OPTS might not be explicitly set or is commented out in be.conf. If you need to use the features above, you add it like this:
bash
# Example in be.conf
JAVA_OPTS="-Xmx2g -Xms2g"
3. Important: Memory Conflict
It is critical to remember that the memory you allocate to JAVA_OPTS (the JVM heap) is separate from the mem_limit (the BE process limit).
* mem_limit tracks the C++ memory usage (the majority of StarRocks' work).
* JAVA_OPTS allocates memory from the OS for the JVM.
Warning: If you set a very high JAVA_OPTS (e.g., 16GB) and also set mem_limit to 90% of your RAM, your BE node may run out of physical memory and be killed by the OS (OOM Killer) because the JVM memory and the BE C++ memory are competing for the same physical RAM.
Recommendation
* If you are not using Java UDFs or complex external catalogs, you can usually leave this unset or at a small value (1–2GB).
* If you are using Java UDFs, StarRocks recommends setting this to a value that balances your UDF needs against your query performance needs.
References
• sql-reference/sql-functions/JAVA_UDF.md
• administration/management/BE_configuration.md
• faq/operation_maintenance_faq.md
References
• sql-reference/sql-functions/JAVA_UDF.md
• faq/Others.md
• administration/management/BE_configuration.mdFrancisco Silva
06/05/2026, 1:20 PMRocky
06/05/2026, 1:21 PMsql
SHOW PROC '/tablet_scheduler';
The Three Balance Types
StarRocks breaks down rebalancing into these specific categories:
1. Inter-node tablet distribution (Inter-BE):
* Goal: Balances the number of tablets across different BE nodes.
* Action: If one BE has significantly more tablets than others, the FE will migrate tablets to less-loaded nodes.
2. Intra-node disk usage (Intra-BE):
* Goal: Balances the disk space (%) across multiple disks on the same BE node.
* Action: If you have multiple storage paths (e.g., /data1, /data2) and one is much fuller than the others, StarRocks moves data locally between disks.
3. Intra-node tablet distribution (Intra-BE):
* Goal: Balances the number of tablets across multiple disks on the same BE node.
* Action: Ensures that no single disk is "hotter" than others in terms of metadata and I/O tasks.
Key Thresholds (FE Configuration)
If you see these marked as unbalanced, it is usually controlled by these FE parameters:
* tablet_sched_balance_load_score_threshold (Default 0.1): Controls when inter-node balancing kicks in based on a node's "load score" (a mix of disk capacity and tablet count).
* tablet_sched_storage_balance_threshold: Often used to define the allowed skew between disks for intra-node balancing.
How to check the "Score"
To see the actual math (the "Load Score") the scheduler is using for Inter-node balance, you can run:
sql
SHOW PROC '/cluster_balance/cluster_load_stat';
This will show you the LoadScore for each BE. If the gap between the highest and lowest score exceeds the threshold, the "Inter-node" balance status will switch to Pending or Running.
References
• administration/management/resource_management/Replica.md
• administration/management/FE_configuration.md
• administration/management/Scale_up_down.md
References
• administration/management/FE_configuration.md
• faq/Deploy_faq.md
• administration/management/resource_management/Load_balance.mdFrancisco Silva
06/05/2026, 1:21 PMRocky
06/05/2026, 1:22 PMSHOW PROC '/tablet_scheduler'), they are typically reported by the FE with specific labels.
In StarRocks, the scheduler doesn't usually have a single "Boolean" metric for balance. Instead, it exposes the number of tablets currently being moved or waiting to be moved for each balance type.
1. The Core Metrics
The primary Prometheus metrics to watch are:
* starrocks_fe_scheduled_pending_tablet_num: The number of tablets waiting in the queue.
* starrocks_fe_scheduled_running_tablet_num: The number of tablets currently being migrated.
2. Identifying "Inter" vs "Intra"
To distinguish between Inter-node (between different BEs) and Intra-node (between disks on the same BE) balancing, look for the type or priority labels (depending on your StarRocks version):
* Inter-node Balance: These tasks are usually labeled with type="balance".
* Intra-node Balance: These are sometimes labeled as type="intra_balance" or included under balance but distinguishable by the migration path in the logs.
* Repair tasks: Labeled as type="repair".
Note: If your version does not break these down into separate labels, you won't see a "metric" specifically named3. How to check for imbalance via Metrics Since there isn't a "Balanced: Yes/No" metric, most users use the following PromQL queries to detect an imbalance: * Inter-node Skew: Check if the number of tablets varies significantly between BEs.. You have to monitor the skew in tablet counts across BEs.inter_node_balance_stat
promql
# Shows the number of tablets on each BE
starrocks_fe_tablet_num
If one BE has 10,000 tablets and another has 2,000, the "Inter-BE" status in SHOW PROC will switch to UNBALANCED.
* Migration Activity: Check if the cluster is actively trying to fix a balance issue.
promql
# Total pending balance tasks
starrocks_fe_scheduled_pending_tablet_num{type="balance"}
4. Where the "Intra/Inter" text comes from
The specific strings "Inter-node tablet distribution" and "Intra-node disk usage" you see in the SHOW PROC output are metadata statuses generated by the FE's TabletScheduler. These status strings are not currently exported as individual Prometheus gauges (e.g., you won't find starrocks_fe_inter_node_balanced_status == 1).
If you need to alert on the status itself (rather than the counts), you would typically need to query the StarRocks Information Schema or use an external script to scrape the SHOW PROC output, as Prometheus is designed for numeric metrics rather than text-based statuses.
Summary of what to look for:
Goal | Metric to use
Inter-node health | starrocks_fe_tablet_num (look for skew across backend_id)
Balance activity | starrocks_fe_scheduled_running_tablet_num{type="balance"}
Disk health (Intra) | starrocks_be_disk_used_capacity vs starrocks_be_disk_total_capacity
References
• administration/management/monitoring/metrics.md
• administration/management/resource_management/Load_balance.md
• administration/management/resource_management/Replica.md
References
• administration/management/monitoring/metrics.mdFrancisco Silva
06/08/2026, 9:33 AMRocky
06/08/2026, 9:33 AMsql
-- Remove the old entry first
ALTER SYSTEM DROP FOLLOWER "node_ip:9010";
-- Add it back as a fresh entry
ALTER SYSTEM ADD FOLLOWER "node_ip:9010";
2. Clear the Local Metadata Directory
On the machine where you are recreating the FE, ensure the meta_dir (configured in fe.conf) is empty. If there is old, stale metadata in that folder, the FE might try to start as its own independent cluster or fail due to term mismatches.
3. Start with the --helper Flag
This is the most critical step for replication. You must tell the new FE where to pull the initial metadata "image" from.
bash
./bin/start_fe.sh --helper leader_ip:9010 --daemon
* What happens next: The new FE will connect to the Leader, download the latest metadata image, and then replay the edit logs to catch up to the current state.
* Subsequent Restarts: Once the node has successfully joined and synchronized for the first time, you no longer need the --helper flag for future restarts.
Summary of Metadata Flow
* Initial Sync: Performed via the --helper flag (downloads the full image).
* Ongoing Sync: Once the node is "Alive" in SHOW FRONTENDS, it stays in sync by receiving edit logs from the Leader via the BDBJE replication protocol.
References
• administration/Meta_recovery.md
• faq/operation_maintenance_faq.md
• administration/management/FE_configuration.md
References
• administration/Meta_recovery.md
• faq/operation_maintenance_faq.md
• administration/management/FE_configuration.md
• administration/management/Scale_up_down.md
References
• administration/Meta_recovery.md
• faq/operation_maintenance_faq.mdFrancisco Silva
06/08/2026, 9:50 AMRocky
06/08/2026, 9:50 AMstarrocks_fe_max_journal_id
To calculate the replication lag (how far behind the new node is), you compare the value from the Leader FE to the value on your new Follower FE:
promql
# Replication Lag (lower is better)
starrocks_fe_max_journal_id{is_leader="true"} - starrocks_fe_max_journal_id{is_leader="false"}
2. Checking via SQL (Most Direct)
If you just want to see the status immediately without a dashboard, run:
sql
SHOW FRONTENDS;
Look at the MaxJournalId column:
* Leader Node: This will have the highest MaxJournalId.
* Recreating Node: You will see this number increasing rapidly as it "catches up" to the Leader. Once the numbers match (or are very close), replication is complete.
3. Understanding the Phases
When you recreate a node with the --helper flag, it goes through two distinct phases:
1. Image Download (Bootstrap): The FE downloads the image file (a snapshot of metadata) from the helper. During this time, the FE's HTTP port (8030) might not be active yet, so Prometheus metrics may be unavailable.
2. Journal Replay: Once the image is loaded, the FE starts replaying all the "edit logs" created since that image was taken. This is when you will see starrocks_fe_max_journal_id start to climb.
Other Useful Metrics
* starrocks_fe_meta_log_count: Shows how many edit logs exist that haven't been compressed into a checkpoint (image) yet. If this is very high on the Leader, the new node has more work to do to catch up.
* starrocks_fe_replayed_journal_id: In some versions, this is an alias for the latest ID processed by the local replay thread.
Troubleshooting
If the MaxJournalId is not increasing:
* Check the fe.log on the new node for "connection refused" or "network partition" errors.
* Ensure the priority_networks in fe.conf is correctly set so the nodes can communicate over the correct interface intended for BDBJE traffic (edit_log_port 9010).
References
• administration/management/monitoring/metrics.md
• administration/management/FE_configuration.md
• administration/management/monitoring/Monitor_and_Alert.md
• administration/Meta_recovery.mdFrancisco Silva
06/08/2026, 10:14 AMRocky
06/08/2026, 10:15 AMmeta/ folder).
To check for differences in metadata size between FE hosts, you have two main options:
1. Manual Check (Most Accurate for "Size")
The most direct way to see the physical size difference is via the command line on each FE host. StarRocks metadata consists of an image file (snapshot) and BDBJE logs.
bash
# Run this on each FE node to see the size of the metadata directory
du -sh /path/to/starrocks/fe/meta
* What to look for: The image file size should be almost identical across all nodes. The bdb/ directory size might vary slightly because different nodes may have cleaned up old log files at slightly different times based on their local checkpointing.
2. Monitor "Metadata Count" via Prometheus
Instead of bytes, StarRocks uses the number of log entries as the primary indicator of metadata synchronization and health. Significant differences here indicate the nodes are out of sync.
* starrocks_fe_max_journal_id: This is the "version number" of the metadata. All nodes should eventually reach the same ID. A difference in this number is a more critical "size" difference than the actual disk bytes.
* starrocks_fe_meta_log_count: This tracks how many log entries are currently sitting in the bdb/ directory that haven't been "compacted" into a new image file yet.
* Leader: Usually has a higher count until a checkpoint is triggered.
* Follower: Should have a similar count. If one node has a much higher count than others (e.g., > 100,000), it might indicate a failure in its local checkpoint process.
3. Check via SQL
You can compare the MaxJournalId across all nodes to ensure they are at the same metadata "point in time":
sql
SHOW FRONTENDS;
Look at the MaxJournalId column. If the recreating node's ID is significantly lower than the Leader's but is increasing, it is successfully replicating.
Why do sizes sometimes differ?
It is normal for metadata disk sizes to not be byte-for-byte identical because:
* Checkpoint Timing: The Leader creates a new image file and then followers download it. There is a delay where one node has the new image and others are still on the old one.
* BDBJE Log Cleaning: The Berkeley DB background threads delete old log files at different intervals.
* `bdbje_reserved_disk_size`: This setting in fe.conf (default 512MB) controls how much disk space BDBJE keeps for logs before aggressive cleaning.
Summary: Use SHOW FRONTENDS to check if they are at the same Journal ID. If you need the exact disk bytes, you must check the filesystem or use a standard Prometheus node_exporter to monitor the disk usage of the specific directory where your meta_dir is located.
References
• administration/management/monitoring/metrics.md
• administration/management/FE_configuration.md
• administration/Meta_recovery.md
References
• administration/management/monitoring/metrics.md
• administration/management/FE_configuration.md
• administration/management/monitoring/Monitor_and_Alert.mdFrancisco Silva
06/08/2026, 1:23 PMRocky
06/08/2026, 1:23 PMsql
-- Increase the total number of tablets that can be scheduled/balanced concurrently
ADMIN SET FRONTEND CONFIG ("max_scheduling_tablets" = "10000");
ADMIN SET FRONTEND CONFIG ("max_balancing_tablets" = "2000");
-- Increase the number of concurrent tasks allowed per disk (path) on the BE
-- Default is 8. Setting this higher (e.g., 16 or 32) speeds up the new node.
ADMIN SET FRONTEND CONFIG ("schedule_slot_num_per_path" = "16");
2. Increase BE Data Transfer Speed
Even if the FE schedules 1,000 tasks, the BEs might throttle the actual data copy. You can increase the bandwidth and thread limits on the BEs (can be done via curl or by editing be.conf and restarting):
* max_download_speed_kbps: Limits the HTTP download speed for tablet sync. Default is ~50MB/s. Increase this if your network allows (e.g., 1024000 for 1GB/s).
* parallel_clone_task_per_path: (In be.conf) Increases the number of worker threads for cloning on the BE side.
3. Monitoring the Progress
You can see exactly which tablets are moving and why the scheduler might be waiting by using these internal diagnostic commands:
sql
-- View tablets currently in the scheduling queue
SHOW PROC '/cluster_balance/scheduling_tablets';
-- View a summary of why tablets are being balanced
SHOW PROC '/cluster_balance/cluster_load_stat';
Important Considerations
* Resource Impact: Increasing these values will consume more Disk I/O and Network bandwidth. If you notice query latency increasing, dial these numbers back down.
* Balanced State: StarRocks will stop moving tablets once the "load score" (a mix of disk usage and tablet count) across all BEs is within a certain threshold (default tablet_sched_balance_load_score_threshold = 0.1).
* Automatic Process: You do not need to manually run a "repair" command; once the new BE is Alive, the FE will automatically identify it as "under-replicated" or "low load" and start the process.
References
• administration/management/FE_configuration.md
• administration/management/BE_configuration.md
• faq/operation_maintenance_faq.md
References
• administration/management/FE_configuration.md
• faq/operation_maintenance_faq.mdFrancisco Silva
06/08/2026, 1:36 PMRocky
06/08/2026, 1:36 PMADMIN REPAIR TABLE command. This tells the FE to move these tablets with VERY_HIGH priority, placing them at the front of the scheduling queue.
sql
-- Prioritize a specific table
ADMIN REPAIR TABLE my_database.my_table;
-- Prioritize specific partitions if the table is huge
ADMIN REPAIR TABLE my_database.my_table PARTITION (p202301, p202302);
Note: This doesn't fix the data; it simply forces the scheduler to process these tablets immediately.
2. Reduce the Scheduling Interval & Increase Throughput
The FE's "Tablet Scheduler" and "Checker" run in the background. If you want it to react faster and do more work per cycle, adjust these FE configurations:
sql
-- Allow more tablets to be scheduled in a single batch (default 10000)
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_scheduling_tablets" = "20000");
-- Allow more concurrent balancing tasks (default 500)
-- Increase this significantly during a node replacement
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_balancing_tablets" = "5000");
-- Increase the "slots" available on each BE disk for replication
-- This is often the biggest bottleneck (default 8)
ADMIN SET FRONTEND CONFIG ("tablet_sched_slot_num_per_path" = "32");
3. Check for Scheduling Delays
If tablets aren't moving, check if there is a "down tolerate" delay. If you replaced a node and the old one is marked as DEAD, the FE waits for a certain period before starting repairs to avoid unnecessary data movement during brief network blips:
* tablet_sched_be_down_tolerate_time_s: (Default 900s / 15m). If you want the FE to start moving data from a dead node immediately, you can lower this to 60.
4. How to see what is happening "Right Now"
To see if the scheduler is actually working or if it's stuck, use these internal status commands:
* SHOW PROC '/cluster_balance/pending_tablets';: Shows tablets waiting to be moved.
* SHOW PROC '/cluster_balance/running_tablets';: Shows tablets currently being copied. If this list is small but pending is large, you need to increase the slot_num_per_path mentioned above.
Summary Recommendation:
To make it reach the same number "now":
1. Increase tablet_sched_slot_num_per_path to 32.
2. Increase tablet_sched_max_balancing_tablets to 2000.
3. Run ADMIN REPAIR TABLE on your largest tables.
References
• sql-reference/sql-statements/cluster-management/tablet_replica/ADMIN_REPAIR.md
• administration/management/FE_configuration.md
• administration/management/resource_management/Replica.md
References
• administration/management/FE_configuration.mdFrancisco Silva
06/09/2026, 2:59 PMRocky
06/09/2026, 3:00 PMfe.audit.log is the primary source for slow query data. It records every query, its latency, resource usage, and the SQL text.
* Set the Threshold: By default, queries taking longer than 5000ms are tagged as slow. You can adjust this:
sql
ADMIN SET FRONTEND CONFIG ("qe_slow_log_ms" = "2000"); -- Set to 2 seconds
* JSON Format: Enable JSON formatting to make exporting to ELK (Elasticsearch, Logstash, Kibana) or Loki much easier:
sql
ADMIN SET FRONTEND CONFIG ("audit_log_json_format" = "true");
* Export via Log Collectors: Use Filebeat, Fluentd, or Vector to tail the fe.audit.log file and ship it to your observability platform.
2. Audit Loader (Ingest into StarRocks)
StarRocks provides an Audit Loader plugin that automatically reads the fe.audit.log and loads the data into a StarRocks table (usually starrocks_monitor.starrocks_audit_tbl).
* This allows you to use SQL to query your own slow logs:
sql
SELECT query_sql, query_time, mem_cost, cpu_cost
FROM starrocks_monitor.starrocks_audit_tbl
WHERE query_time > 5000
ORDER BY query_time DESC;
3. Detailed Profile Logs (fe.profile.log)
For deep dives into why a query was slow (e.g., specific operator bottlenecks), use the profile log.
* Enable Profile Logging:
sql
ADMIN SET FRONTEND CONFIG ("enable_profile_log" = "true");
* This log is generated in JSON format and contains the full execution graph and timing for every fragment. Like the audit log, it can be exported via standard log collectors.
4. Prometheus Metrics
StarRocks exports summary metrics to Prometheus for high-level monitoring of query latencies.
* Endpoint: http://<FE_IP>:<FE_HTTP_PORT>/metrics
* Key Metrics:
* `starrocks_fe_query_latency_ms`: A histogram of query latencies.
* `starrocks_fe_query_err_rate`: Useful for spotting slow queries that eventually time out or fail.
* Usage: Use these to trigger alerts in Grafana when the P99 latency exceeds your threshold.
5. Real-time Observation (Active Queries)
To catch a slow query while it is still running, use the `information_schema`:
sql
SELECT * FROM information_schema.active_queries
WHERE query_start_time < NOW() - INTERVAL 10 SECOND;
This gives you the QueryId, which you can use to fetch the full execution profile:
sql
-- Get the text-based profile for a specific slow query
GET PROFILE FROM 'query_id_here';
6. StarRocks Manager (Web UI)
If you are using StarRocks Manager (the official GUI), it has a "Slow Queries" tab that aggregates this data automatically, providing visual breakdowns of execution time, data scan volume, and memory usage without manual export setup.
References
• administration/management/logs.md
• administration/management/FE_configuration.md
• administration/management/monitoring/metrics.md
• sql-reference/sql-statements/administration/GET_PROFILE.md
References
• administration/management/logs.md
• administration/management/FE_configuration.md
• knowledge/usage/best-practice.md
• faq/operation_maintenance_faq.mdFrancisco Silva
06/09/2026, 3:03 PMRocky
06/09/2026, 3:03 PMhttp://<FE_IP>:8030
* Key Observability Features:
* Current Queries: Go to System -> Current Queries (or http://<FE_IP>:8030/system?path=//current_queries). You can see every query currently running, how much memory it's using, and how long it's been active.
* Query Profiles: You can click on a QueryID to see the visualized execution plan and find which specific node or operator is causing a bottleneck.
* Log Viewing: You can view recent FE/BE logs directly from the browser.
2. StarRocks Manager (Separate Tool)
This is a more sophisticated, standalone management platform (often used in enterprise or cloud environments). It provides a much richer "Observability" experience than the built-in console.
* Slow Query Dashboard: It has a dedicated tab that automatically parses audit logs and presents them in a searchable table.
* Visual Analysis: It provides charts for query latency trends (P99, P95), CPU/Memory spikes, and top "expensive" queries over time.
* Alerting: You can set up alerts within the Manager to notify you when queries exceed a certain time or resource threshold.
Which one should you use?
* For quick debugging ("Why is the cluster slow right now?"): Use the Built-in FE Console (Port 8030).
* For long-term analysis ("Which queries were slow last Tuesday?"): Use the Audit Loader (to put logs into a table) or StarRocks Manager if you have it installed.
Pro-tip: If you just want to see the performance of a specific query you just ran without using a browser, you can run this in your MySQL client:
sql
-- See the last few profiles generated
SHOW PROFILELIST;
-- Get the detailed breakdown for one of them
SELECT GET_PROFILE('query_id_from_above');
-- To see it visually in the terminal (v3.1+)
EXPLAIN ANALYZE <your_sql_query>;
```
## References
- [administration/management/monitor_manage_big_queries.md](https://docs.starrocks.io/docs/administration/management/monitor_manage_big_queries)
- [sql-reference/sql-statements/administration/GET_PROFILE.md](https://docs.starrocks.io/docs/sql-reference/sql-statements/administration/GET_PROFILE)
- [administration/management/monitoring/Monitor_and_Alert.md](https://docs.starrocks.io/docs/administration/management/monitoring/Monitor_and_Alert)
## References
- [administration/management/monitor_manage_big_queries.md](https://docs.starrocks.io/docs/administration/management/monitor_manage_big_queries)
- [sql-reference/sql-statements/administration/GET_PROFILE.md](https://docs.starrocks.io/docs/sql-reference/sql-statements/administration/GET_PROFILE)
- [administration/management/monitoring/Monitor_and_Alert.md](https://docs.starrocks.io/docs/administration/management/monitoring/Monitor_and_Alert)
## References
- [administration/management/monitor_manage_big_queries.md](https://docs.starrocks.io/docs/administration/management/monitor_manage_big_queries)
- [administration/management/resource_management/query_queues.md](https://docs.starrocks.io/docs/administration/management/resource_management/query_queues)Francisco Silva
06/09/2026, 3:07 PMRocky
06/09/2026, 3:07 PMhttp://<FE_IP>:8030/system?path=//current_queries.
* The trick: Click on the ExecTime column header. This sorts the list by duration. The queries at the top are your "slow queries" currently putting pressure on the cluster.
* You can then click the QueryID to see the live profile and find the bottleneck.
2. If you want to filter past slow queries (The SQL way)
Since the basic UI doesn't store query history, the best "interface" for filtering is actually SQL. If you install the Audit Loader (a small plugin), it pipes your slow logs into a StarRocks table.
Then you can filter with full flexibility:
sql
-- Find queries longer than 10s from a specific user
SELECT * FROM starrocks_monitor.starrocks_audit_tbl
WHERE query_time > 10000
AND user = 'reporting_user'
ORDER BY query_time DESC;
3. If you need a dedicated "Slow Query" UI
For a true point-and-click experience with filters for time range, user, and latency, you need StarRocks Manager (or the Cloud version).
* This is a separate management platform that includes a "Queries" tab.
* It allows you to filter by Duration, CPU Cost, Memory, and Scan Volume across your entire query history.
4. Adjusting what "Slow" means
To make sure your logs (and the UI tools) capture the right data, you can lower the threshold for what StarRocks considers "slow" (the default is 5 seconds):
sql
-- Lower the threshold to 1 second
ADMIN SET FRONTEND CONFIG ("qe_slow_log_ms" = "1000");
Summary: The port 8030 UI is a "live view" only. For historical filtering, use Audit Loader + SQL or the StarRocks Manager tool.
References
• administration/management/monitor_manage_big_queries.md
• administration/management/FE_configuration.md
• using_starrocks/running_queries.md
References
• administration/management/monitor_manage_big_queries.md
• administration/management/FE_configuration.md
• using_starrocks/running_queries.md
References
• using_starrocks/running_queries.md
• administration/management/monitor_manage_big_queries.md
• administration/management/resource_management/query_queues.mdFrancisco Silva
06/09/2026, 4:15 PMRocky
06/09/2026, 4:15 PMfe.audit.log file on every Frontend (FE) node.
2. Stream Load: It periodically (e.g., every 60 seconds) uses Stream Load to ingest those log entries into a table you've created (usually called starrocks_audit_tbl).
3. SQL Observability: Once the data is in a table, you use standard SQL to find your slow queries.
Why this is better than the Web UI:
* Filter Everything: You can filter by any column: WHERE queryTime > 5000 (slow queries), WHERE user = 'bob', or WHERE scanBytes > 1073741824 (queries scanning >1GB).
* Historical Data: The Web UI only shows what's running now. Audit Loader lets you look back days or weeks to find patterns.
* Visualize: Since the data is in a regular table, you can connect tools like Grafana, Superset, or Tableau to it to build your own "Slow Query Dashboard."
How to set it up:
1. Create the table: You create a database and a table with specific columns (like queryId, queryTime, stmt, etc.) to hold the logs.
2. Download & Config: Download the auditloader.zip from the StarRocks resources page, and edit a plugin.conf file with your cluster's credentials.
3. Install: Run a simple command in your MySQL client:
sql
INSTALL PLUGIN FROM "/path/to/auditloader.zip";
4. Verify: After a minute, you can start querying:
sql
SELECT * FROM starrocks_audit_db.starrocks_audit_tbl
WHERE queryTime > 3000
ORDER BY timestamp DESC;
Summary: If you want a searchable "UI" for slow queries, Audit Loader is the bridge that turns your text logs into a queryable database table.
References
• administration/management/audit_loader.md
• administration/management/logs.md
• administration/management/FE_configuration.md
• administration/management/monitor_manage_big_queries.md
References
• administration/management/audit_loader.mdFrancisco Silva
06/10/2026, 11:38 AMRocky
06/10/2026, 11:38 AMqe_slow_log_ms parameter to define what "slow" means. Any query exceeding this threshold is tagged as a slow_query in the logs.
Run this in your SQL client:
sql
-- Set the threshold to 1 second (1000ms)
ADMIN SET FRONTEND CONFIG ("qe_slow_log_ms" = "1000");
-- Ensure the slow log module is enabled (it is by default)
ADMIN SET FRONTEND CONFIG ("enable_qe_slow_log" = "true");
2. Identify the Log Source
All query information is written to fe.audit.log, located in the log/ directory of your Frontend (FE) nodes. Unlike CloudSQL which has a separate toggle for "slow logs," StarRocks puts both regular and slow queries into the same audit file but tags them differently.
* Format: Each line contains Time (execution time), ScanBytes, ReturnRows, etc.
* Identification: In the default pipe-separated format, look for entries where the execution time (in ms) exceeds your threshold.
3. Change Log Format to JSON (Recommended)
CloudSQL logs are structured. To make StarRocks logs easier for external tools to parse, enable JSON formatting (available in StarRocks 3.2+):
sql
ADMIN SET FRONTEND CONFIG ("audit_log_json_format" = "true");
This turns every log entry into a structured JSON object, making it much easier to filter by the Time field in external systems.
4. Build the Forwarding Mechanism (The "CloudSQL Experience")
Since you aren't using Audit Loader to push logs back into a StarRocks table, you should use an industry-standard Log Shipper to move these logs to a central location (like GCP Cloud Logging, Grafana Loki, or Elasticsearch).
Common Setup:
1. Agent: Install a lightweight agent like Vector, Filebeat, or Fluentd on each FE node.
2. Filter: Configure the agent to tail fe.audit.log.
3. Forward:
* If you are in GCP: Use the Ops Agent to forward the logs to Cloud Logging. You can then use Log Explorer to query them exactly like CloudSQL logs.
* If you are on-prem: Forward to a Loki or ELK stack.
Example Vector configuration snippet (filtering for slow queries only):
toml
[sources.sr_logs]
type = "file"
include = ["/path/to/starrocks/fe/log/fe.audit.log"]
[transforms.filter_slow]
type = "filter"
inputs = ["sr_logs"]
condition = "includes(string!(.message), \"slow_query\")" # or parse JSON and check duration
[sinks.gcp_logging]
type = "gcp_stackdriver_logs"
inputs = ["filter_slow"]
# credentials and project config...
Summary of Parameters
Parameter | Description
qe_slow_log_ms | The duration threshold (default 5000ms).
audit_log_json_format | Set to true for easier parsing (v3.2+).
audit_log_delete_age | How many days to keep logs on the FE disk (default 7 days).
By setting these and using a log agent, you create a robust, externalized slow-query log that doesn't consume StarRocks' own resources for storage or compute resources.
References
• administration/management/FE_configuration.md
• administration/management/logs.md
• administration/management/monitor_manage_big_queries.md
References
• administration/management/FE_configuration.md
• administration/management/logs.mdFrancisco Silva
06/10/2026, 11:39 AMRocky
06/10/2026, 11:39 AMqe_slow_log_ms is not exclusive to the Audit Loader. It is a core configuration for the StarRocks Frontend (FE) that controls how events are written to the standard fe.audit.log file on disk.
Here is how it works regardless of whether you use the Audit Loader:
1. It tags entries in fe.audit.log
By default, StarRocks logs all queries to fe.audit.log. However, when a query's execution time exceeds the qe_slow_log_ms threshold, the log entry is specifically marked as a slow_query.
* If you look at your fe.audit.log file, you will see entries labeled |query| and others labeled |slow_query|.
* Setting this parameter allows you to grep or filter your text logs for only the problematic queries.
2. It controls the "Slow Query" log stream
In addition to the main audit log, StarRocks has an internal "Slow Audit" stream.
* qe_slow_log_ms: Defines the threshold (default is 5000ms).
* enable_qe_slow_log: Controls whether these slow queries are surfaced to the audit system at all.
3. How Audit Loader relates
The Audit Loader is simply a consumer of this data. It works by:
1. Waiting for the FE to identify a query as "slow" (based on qe_slow_log_ms).
2. Catching that event via an internal FE hook.
3. Sending that data to a StarRocks table.
In short: Even if you never install the Audit Loader plugin, changing qe_slow_log_ms will immediately change which queries are labeled as "slow" in your fe/log/fe.audit.log files, which you can then monitor using standard Linux tools (grep, awk) or log forwarders (Filebeat, Vector, etc.).
References
• administration/management/FE_configuration.md
• administration/management/logs.md
• administration/management/audit_loader.md
References
• administration/management/FE_configuration.md
• administration/management/logs.md
• administration/management/audit_loader.md
References
• administration/management/FE_configuration.mdFrancisco Silva
06/10/2026, 5:02 PMRocky
06/10/2026, 5:02 PMnormalize_sql, it provides a mechanism to group identical query structures together in the audit table, making them much more readable and easier to analyze.
1. The digest Column
When enabled, StarRocks generates a fingerprint (hash) for every SQL statement by removing specific parameters (literals). This fingerprint is stored in the digest column of your audit table (if you are using the Audit Loader).
What gets normalized:
* Constants: WHERE id = 1 and WHERE id = 2 will have the same digest.
* IN lists: IN (1, 2) and IN (1, 2, 3) will have the same digest.
* LIMIT clauses: LIMIT 10 and LIMIT 100 will have the same digest.
2. How to enable it
You can enable this feature dynamically on your Frontend (FE) nodes:
sql
ADMIN SET FRONTEND CONFIG ('enable_sql_digest' = 'true');
To make it permanent, add enable_sql_digest = true to your fe.conf.
3. Making the Audit Table "Readable"
Since the audit table stores the original SQL in the stmt column and the fingerprint in the digest column, you can use SQL to get a "normalized" view.
If you want to see a list of your query patterns without seeing 1,000 individual entries for the same query, you can run:
sql
SELECT
digest,
ANY_VALUE(stmt) AS query_template, -- Pick one original query as a representative
COUNT(*) AS execution_count,
AVG(queryTime) AS avg_latency
FROM starrocks_audit_db.starrocks_audit_tbl
GROUP BY digest
ORDER BY avg_latency DESC;
4. Other Related Features
* enable_sql_desensitize_in_log: This is a security feature that replaces sensitive literals and credentials with placeholders in the logs. While its primary goal is privacy, it effectively "normalizes" the output text in the logs.
* SQL Plan Manager (v3.5+): This newer feature uses normalization internally to bind specific execution plans to query structures (baselines), ensuring performance stability for similar queries.
References
• administration/sql_digest.md
• administration/management/audit_loader.md
• administration/management/FE_configuration.md
• using_starrocks/SQL_plan_manager.md
References
• administration/sql_digest.md
• administration/management/audit_loader.md
• administration/management/FE_configuration.md
• using_starrocks/SQL_plan_manager.md
References
• administration/management/FE_configuration.md
• administration/sql_digest.mdFrancisco Silva
06/10/2026, 5:03 PMRocky
06/10/2026, 5:03 PMenable_sql_digest does not store a readable, parameterized query string. It only generates a 32-character MD5-style hash (e.g., f58bb718...) in a new column called digest.
If you are looking for a way to see a "normalized" readable query (like SELECT * FROM table WHERE id = ?) instead of the raw SQL, StarRocks handles this differently than some other databases:
1. How to get a "Readable Template"
Since StarRocks stores the raw SQL (stmt) and the digest hash together, the intended way to see a readable template is to query the audit table using the digest to group them.
You can pick one "representative" query to act as your template:
sql
SELECT
digest,
ANY_VALUE(stmt) AS query_template, -- This gives you a readable version of that pattern
COUNT(*) AS call_count,
AVG(queryTime) AS avg_ms
FROM starrocks_audit_db.starrocks_audit_tbl
GROUP BY digest;
2. Is there an "In-Place" Normalizer?
There is no dedicated configuration to automatically convert the stmt column into a ? parameterized string in the logs, but there is a security-focused parameter that comes close:
enable_sql_desensitize_in_log = true
* What it does: It masks sensitive information (like passwords in CREATE USER) and literals.
* The Result: It makes the logs safer, but it often makes them less readable for debugging because it may replace parts of the query with placeholders. It is not designed to be a "clean" query template generator like the CloudSQL normalization.
3. Comparison Summary
Feature | Output in Audit Log | Best Use Case
Default | Full raw SQL (SELECT * FROM t WHERE id=1) | Debugging specific failures.
enable_sql_digest | Adds a Hash (f58b...) | Grouping/Aggregation. Best for finding your "top 10 slowest patterns."
enable_sql_desensitize | Redacted SQL (SELECT * FROM t WHERE id=***) | Security/Compliance.
Recommendation for your Slow Query Log
If your goal is a "CloudSQL-like" experience where you can quickly see which patterns of queries are slow:
1. Enable enable_sql_digest = true.
2. Use the GROUP BY digest approach mentioned above.
3. This effectively "creates" your normalized query list on the fly without losing the original raw SQL (which is often vital for troubleshooting specific data-skew issues).
References
• administration/sql_digest.md
• administration/management/FE_configuration.md
• administration/http_interface/query_detail.md
References
• administration/sql_digest.md
• administration/management/FE_configuration.md
• administration/http_interface/query_detail.md
• administration/management/logs.mdFrancisco Silva
06/11/2026, 12:13 PMRocky
06/11/2026, 12:13 PMbin, lib, and storage folders are located).
* System Overrides: Most modern Linux distributions redirect core dumps. You should check the system-wide configuration:
* Run cat /proc/sys/kernel/core_pattern to see where they are sent.
* systemd-coredump: If the output starts with |/usr/lib/systemd/systemd-coredump, use the command coredumpctl list to find the crash and coredumpctl info <PID> to see the path (usually /var/lib/systemd/coredump/).
* Ubuntu/Apport: Usually located in /var/crash/.
* CentOS/ABRT: Usually located in /var/spool/abrt/.
Prerequisite: Core dumps will only be generated if the resource limit is set. You can check this by running ulimit -c. If it returns 0, no core dump will be created. It must be set to unlimited in the environment before starting the BE.
2. Frontend (FE) Crash & Dumps
Since the FE runs on the JVM, it rarely produces a standard binary core dump. Instead, it produces:
* hs_err_pid<pid>.log: Created if the JVM itself crashes. This is usually found in the FE root directory or the FE log directory.
* fe.out: This file (in the fe/log directory) is the first place you should look for "Last Gasp" error messages or stack traces if the FE stops unexpectedly.
* Query Dumps: StarRocks has a specific feature for debugging SQL exceptions called query_dump. These are stored in the directory defined by dump_log_dir (default is fe/log).
3. Summary Checklist
If you are looking for a crash file to send to support:
1. Check ${STARROCKS_HOME}/ (the root of the BE or FE folder).
2. Check /var/lib/systemd/coredump/ (on systemd-based systems).
3. Check be/log/be.out or *`fe/log/fe.out`*; these often contain the stack trace even if the full core file is missing or too large to process easily.
References
• faq/Sql_faq.md
• administration/management/logs.md
• administration/management/BE_configuration.md
References
• faq/Sql_faq.md
• administration/management/logs.md
• administration/management/BE_configuration.md
References
• faq/Sql_faq.md
References
• developers/debuginfo.md
• faq/Others.md
• faq/Sql_faq.md
• administration/management/logs.md
• developers/mac-compile-run-test.md
• administration/management/FE_configuration.md
• administration/management/BE_configuration.mdFrancisco Silva
06/11/2026, 1:30 PMRocky
06/11/2026, 1:31 PMpg_stat_statements.query that explicitly stores a "parameterized" version of every SQL string alongside its Digest.
Here are the answers to your specific questions:
1. Is there a built-in function or system table/column for normalized SQL?
No. There is no built-in SQL function like normalize_sql() or mask_literals() available to users.
While StarRocks internally performs this normalization to generate the digest (by stripping literals, IN-lists, and LIMIT values), the result of that process (the parameterized string) is not exposed as a first-class string column in the starrocks_audit_tbl__ or any system view.
2. Is the normalized text persisted anywhere?
The normalized text is generally not persisted as a standalone field.
* The Digest: Only the 32-character MD5 hash is stored in the digest column.
* The Original SQL: The full raw SQL is stored in the stmt column.
* Exception: If you set the global configuration enable_sql_desensitize_in_log = true, StarRocks will mask sensitive information and literals in the logs. In this mode, the stmt field in the audit log will effectively contain a "desensitized" version of the query. However, this is a security feature that overwrites the original SQL text in the log, so you lose the raw query data.
3. Recommended way to display a readable "query shape"
Since StarRocks stores the raw stmt and the digest together, the recommended practice is to use SQL aggregation to pick a "representative" query for each digest.
When grouping by digest to analyze patterns, use ANY_VALUE(stmt) (or MIN(stmt)) to show a human-readable example of that pattern:
sql
SELECT
digest,
ANY_VALUE(stmt) AS query_template, -- Pick one original query as the "shape"
COUNT(*) AS execution_count,
AVG(queryTime) AS avg_latency
FROM starrocks_audit_db__.starrocks_audit_tbl__
GROUP BY digest
ORDER BY avg_latency DESC;
Why this is the standard approach:
Because the digest logic ensures that queries with the same structure (but different literals) share the same hash, any one stmt in that group is a valid representation of the "query shape." While it will still contain the specific literals of that one execution, it is usually sufficient for a human to identify the template.
Summary Table
Feature | Persisted Text | Use Case
Default | Full raw SQL in stmt | Debugging specific queries.
enable_sql_digest | Hash in digest | Grouping similar queries.
enable_sql_desensitize | Masked SQL in stmt | Security/Compliance (hiding literals).
References
• administration/sql_digest.md
• administration/management/FE_configuration.md
• administration/management/audit_loader.md
• administration/http_interface/query_detail.md
References
• administration/http_interface/query_detail.md
• sql-reference/information_schema/statistics.md
• sql-reference/information_schema/loads.mdFrancisco Silva
06/12/2026, 10:15 AMRocky
06/12/2026, 10:15 AMsql
-- Increase the total number of tablets being scheduled at once (Default: 2000)
ADMIN SET FRONTEND CONFIG ("max_scheduling_tablets" = "5000");
-- Increase the number of balancing tasks allowed (Default: 100)
ADMIN SET FRONTEND CONFIG ("max_balancing_tablets" = "500");
-- Increase slots per storage path (Default: 2)
-- This controls how many concurrent clone tasks a single disk can handle.
ADMIN SET FRONTEND CONFIG ("schedule_slot_num_per_path" = "8");
2. Increase BE Execution Capacity
The BEs are the "workers" that actually copy the data. You need to allow them to handle more parallel tasks and use more bandwidth.
Bandwidth Limit:
By default, StarRocks limits replication speed to prevent network saturation (usually 50-100 MB/s).
sql
-- Check your current limit first (it is in KB/s)
-- To increase to 200MB/s:
ADMIN SET BE CONFIG ("clone_max_network_bandwidth_limit_kbps" = "204800");
-- In v3.3.5+, you may also need to check:
ADMIN SET BE CONFIG ("replication_max_speed_limit_kbps" = "204800");
Thread Concurrency:
sql
-- Increase parallel clone threads per disk path (Default: 8)
ADMIN SET BE CONFIG ("parallel_clone_task_per_path" = "16");
3. Monitoring the Progress
You can monitor how many tablets are currently being scheduled or are "unhealthy" (waiting to be replicated to the new node) using:
sql
SHOW PROC '/cluster_balance';
-- or
SHOW TABLET STATUS;
Important Considerations:
* Resource Impact: Increasing these values will lead to higher CPU, Disk I/O, and Network usage. If the cluster is under heavy production load, increase these values incrementally.
* Priority: Balancing tasks (moving data to the new node) usually have a lower priority than repair tasks (fixing replicas when a node is lost). The parameters above primarily target the "balancing" flow.
* Reverting: Once the cluster is balanced (check SHOW PROC '/backends'; to see if DataUsedCapacity is roughly equal across nodes), it is recommended to revert these settings to their defaults to prevent background tasks from interfering with query spikes in the future.
References
• faq/operation_maintenance_faq.md
• administration/management/BE_configuration.md
• administration/management/FE_configuration.md
References
• faq/operation_maintenance_faq.md
• administration/management/BE_configuration.md
• faq/Deploy_faq.mdFrancisco Silva
06/12/2026, 10:19 AMRocky
06/12/2026, 10:20 AMADMIN SHOW FRONTEND CONFIG command. You can use the LIKE clause to filter for the specific scheduling and balancing parameters:
sql
-- View all tablet scheduling and balancing limits
ADMIN SHOW FRONTEND CONFIG LIKE '%tablet%';
-- Or view specific ones:
ADMIN SHOW FRONTEND CONFIG LIKE '%max_scheduling_tablets%';
ADMIN SHOW FRONTEND CONFIG LIKE '%max_balancing_tablets%';
ADMIN SHOW FRONTEND CONFIG LIKE '%schedule_slot_num_per_path%';
2. Fetch Backend (BE) Settings
Since ADMIN SHOW CONFIG currently only displays FE parameters, you should query the information_schema.be_configs table to see the current values across all BE nodes.
sql
-- View bandwidth and clone thread limits for all BE nodes
SELECT * FROM information_schema.be_configs
WHERE NAME LIKE '%bandwidth%'
OR NAME LIKE '%parallel_clone%'
OR NAME LIKE '%replication_max_speed%';
3. Quick Reference Table
If you prefer to check them one by one, here are the exact names to look for:
Type | Parameter Name | Default Value (Approx)
FE | max_scheduling_tablets | 2000
FE | max_balancing_tablets | 100
FE | schedule_slot_num_per_path | 2
BE | clone_max_network_bandwidth_limit_kbps | 102400 (100MB/s)
BE | parallel_clone_task_per_path | 8
BE | replication_max_speed_limit_kbps | 102400 (100MB/s)
Note: If you find that a setting is not present in be_configs, it may be because your specific version uses a different parameter name or relies on the hardcoded default. Generally, clone_max_network_bandwidth_limit_kbps is the primary throttle for replication speed.
References
• administration/management/FE_configuration.md
• sql-reference/information_schema/be_configs.md
• administration/management/BE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.md
References
• administration/management/BE_configuration.md
• sql-reference/information_schema/be_configs.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SHOW_CONFIG.mdFrancisco Silva
06/12/2026, 10:21 AMmysql> SELECT * FROM information_schema.be_configs
-> WHERE NAME LIKE '%bandwidth%'
-> OR NAME LIKE '%parallel_clone%'
-> OR NAME LIKE '%replication_max_speed%';
+---------+----------------------------------+-------+-------+---------+---------+
| BE_ID | NAME | VALUE | TYPE | DEFAULT | MUTABLE |
+---------+----------------------------------+-------+-------+---------+---------+
| 6337671 | parallel_clone_task_per_path | 8 | int32 | 8 | 1 |
| 6337671 | replication_max_speed_limit_kbps | 50000 | int32 | 50000 | 1 |
| 6403184 | parallel_clone_task_per_path | 8 | int32 | 8 | 1 |
| 6403184 | replication_max_speed_limit_kbps | 50000 | int32 | 50000 | 1 |
| 6442054 | parallel_clone_task_per_path | 8 | int32 | 8 | 1 |
| 6442054 | replication_max_speed_limit_kbps | 50000 | int32 | 50000 | 1 |
| 6701287 | parallel_clone_task_per_path | 8 | int32 | 8 | 1 |
| 6701287 | replication_max_speed_limit_kbps | 50000 | int32 | 50000 | 1 |
| 7876145 | parallel_clone_task_per_path | 8 | int32 | 8 | 1 |
| 7876145 | replication_max_speed_limit_kbps | 50000 | int32 | 50000 | 1 |
| 6487344 | parallel_clone_task_per_path | 8 | int32 | 8 | 1 |
| 6487344 | replication_max_speed_limit_kbps | 50000 | int32 | 50000 | 1 |
+---------+----------------------------------+-------+-------+---------+---------+
12 rows in set (0.298 sec)
ERROR 1064 (HY000): Getting syntax error at line 1, column 25. Detail message: Unexpected input '<EOF>', the most similar input is {'EXPORT', 'REVOKE', 'RECOVER', 'REFRESH', 'RESTORE', '(', ';'}.
mysql> ADMIN SHOW FRONTEND CONFIG LIKE '%max_scheduling_tablets%';
+-------------------------------------+--------------------------+-------+------+-----------+---------+
| Key | AliasNames | Value | Type | IsMutable | Comment |
+-------------------------------------+--------------------------+-------+------+-----------+---------+
| tablet_sched_max_scheduling_tablets | [max_scheduling_tablets] | 10000 | int | true | |
+-------------------------------------+--------------------------+-------+------+-----------+---------+
1 row in set (0.123 sec)
mysql> ADMIN SHOW FRONTEND CONFIG LIKE '%max_balancing_tablets%';
+------------------------------------+-------------------------+-------+------+-----------+---------+
| Key | AliasNames | Value | Type | IsMutable | Comment |
+------------------------------------+-------------------------+-------+------+-----------+---------+
| tablet_sched_max_balancing_tablets | [max_balancing_tablets] | 500 | int | true | |
+------------------------------------+-------------------------+-------+------+-----------+---------+
1 row in set (0.137 sec)
mysql> ADMIN SHOW FRONTEND CONFIG LIKE '%schedule_slot_num_per_path%';
+--------------------------------+------------------------------+-------+------+-----------+---------+
| Key | AliasNames | Value | Type | IsMutable | Comment |
+--------------------------------+------------------------------+-------+------+-----------+---------+
| tablet_sched_slot_num_per_path | [schedule_slot_num_per_path] | 8 | int | true | |
+--------------------------------+------------------------------+-------+------+-----------+---------+Rocky
06/12/2026, 10:21 AM50000 KB/s).
Here are the commands to increase the speed based on your specific output:
1. Increase BE Replication Bandwidth
Your current replication_max_speed_limit_kbps is 50,000. On a 10Gbps network, you can safely increase this to 200MB/s or even 500MB/s to significantly speed up the data transfer to the new node.
sql
-- Increase to 200MB/s (204,800 KB/s)
ADMIN SET BE CONFIG ("replication_max_speed_limit_kbps" = "204800");
-- Also set this if it exists (it's often an alias or used in older versions)
ADMIN SET BE CONFIG ("clone_max_network_bandwidth_limit_kbps" = "204800");
2. Increase BE Task Concurrency
Your parallel_clone_task_per_path is 8. If your BEs have many CPU cores and high-performance NVMe/SSD drives, you can double this.
sql
ADMIN SET BE CONFIG ("parallel_clone_task_per_path" = "16");
3. (Optional) Increase FE Balancing Concurrency
Your tablet_sched_max_balancing_tablets is at 500. If you have a very large cluster and want more tablets moving in parallel, you can bump this up.
sql
ADMIN SET FRONTEND CONFIG ("tablet_sched_max_balancing_tablets" = "1000");
Regarding the Syntax Error
The error Unexpected input '<EOF>' you encountered usually happens if you press Enter before finishing the SQL statement (missing a ;) or if there is a hidden character/trailing space in a copy-pasted command. Ensure every command ends with a semicolon.
How to verify it's working
After running these, keep an eye on your network and disk usage. You can check if the speed has increased by running:
sql
SHOW PROC '/cluster_balance';
Look at the Pending vs Running counts. If Running increases and your BE network metrics (in your monitoring dashboard) go up, the changes are taking effect.
Note: Once the "DataUsedCapacity" across your BEs looks balanced (check SHOW PROC '/backends';), remember to set these back to their original values to ensure background tasks don't compete with query traffic later.Francisco Silva
06/12/2026, 10:26 AMRocky
06/12/2026, 10:26 AMADMIN SET FRONTEND CONFIG command only applies to the FE nodes.
To update BE configurations dynamically without a restart, you must use the BE's HTTP API. You cannot use SQL to set these values.
1. Get the BE IP and HTTP Port
First, get the IP and HttpPort for your BEs using this SQL command:
sql
SHOW BACKENDS\G
Look for the IP and HttpPort (default is usually 8040) columns.
2. Update each BE via curl
You will need to run a curl command for each BE node. Replace <BE_IP> and <BE_HTTP_PORT> with the values from the previous step.
To increase the replication speed:
bash
curl -XPOST http://<BE_IP>:<BE_HTTP_PORT>/api/update_config?replication_max_speed_limit_kbps=204800
To increase the parallel clone tasks:
bash
curl -XPOST http://<BE_IP>:<BE_HTTP_PORT>/api/update_config?parallel_clone_task_per_path=16
(Note: If you have configured a username/password for the BE HTTP interface, use -u user:pass in the curl command.)
3. Verify the change
After running the curl commands, you can run your original SQL query again to confirm the VALUE has updated:
sql
SELECT * FROM information_schema.be_configs
WHERE NAME IN ('parallel_clone_task_per_path', 'replication_max_speed_limit_kbps');
Important Notes:
* Non-Persistent: Changes made via curl (or ADMIN SET FRONTEND CONFIG) are reset if the process restarts. Once you find the "sweet spot" for speed, you should manually update the be.conf and fe.conf files on the servers to make them permanent.
* The Syntax Error: The error you saw earlier (Unexpected input '<EOF>') was likely because you were trying to run a multi-line SQL command and the parser encountered a character it didn't like or an incomplete statement. Ensure you end every SQL command with a ;.
References
• administration/management/BE_configuration.md
• faq/Deploy_faq.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SET_CONFIG.md
References
• administration/management/BE_configuration.md
• sql-reference/sql-statements/cluster-management/config_vars/ADMIN_SET_CONFIG.mdFrancisco Silva
06/12/2026, 11:57 AMRocky
06/12/2026, 11:58 AMloadScore to decide where to place or move tablets. This score is calculated using two main factors:
1. Disk Utilization: The percentage of disk space used on the BE.
2. Replica Count: The number of tablet replicas currently hosted on the BE.
Because the system aims to keep the utilization percentage roughly equal across all nodes, a BE with a 2TB disk will naturally end up hosting twice as much data (and therefore more tablets) than a BE with a 1TB disk to reach the same percentage.
Key Logic & Controls
* Weighted Balancing: StarRocks uses capacityCoefficient and replicaNumCoefficient as weights.
* If your disks are relatively empty (below 50%), it weighs the number of replicas and disk percentage equally.
* As disks get fuller (above 75%), it prioritizes disk utilization almost entirely to prevent any single node from running out of space.
* Triggering Balance: By default, if the difference in disk utilization between the highest-load node and the lowest-load node exceeds 10%, StarRocks will trigger a re-balance (controlled by tablet_sched_balance_load_disk_safe_threshold).
* Storage Mediums: If you have mixed drive types (e.g., some BEs have SSDs and others have HDDs), StarRocks recognizes the storage medium and tries to balance tablets within the same medium type first.
How to check the "Load" of your nodes
You can see how StarRocks views the capacity and load of your backends by running:
sql
SHOW PROC '/backends';
Look at the UsedCapacity, TotalCapacity, and DataUsedCapacity columns. You will notice that as long as the UsedPct (percentage) is similar, the cluster is considered balanced, and the node with the larger TotalCapacity will have a higher DataUsedCapacity.
References
• administration/management/resource_management/Replica.md
• administration/management/FE_configuration.md
References
• administration/management/resource_management/Replica.md
• knowledge/admin_and_operation/shared_data_compaction.mdFrancisco Silva
06/12/2026, 2:18 PMRocky
06/12/2026, 2:19 PMexec_mem_limit in StarRocks is 2,147,483,648 bytes, which is exactly 2 GB.
However, there are a few important details to keep in mind regarding memory limits in modern StarRocks versions (v2.x and v3.x):
1. exec_mem_limit vs. query_mem_limit
While exec_mem_limit was historically the primary variable to limit query memory, StarRocks now primarily uses query_mem_limit when the Pipeline Engine is enabled (which is the default).
* query_mem_limit Default: 0 (This means the query is limited only by the total BE memory limit, mem_limit).
* Relation: In some older versions or specific configurations (like certain load types), if query_mem_limit is not set or set to 0, the system may fall back to exec_mem_limit.
2. What it limits
* exec_mem_limit typically limits the memory of a single query instance (a fragment of a query) on a BE node.
* query_mem_limit limits the total memory of a single query across all its instances on a specific BE node.
3. Common Related Errors
If you see the error:
You should increase the limit for your session or globally:Mem usage has exceed the limit of single query, You can change the limit by set session variable exec_mem_limit.
sql
-- Set for the current session
SET exec_mem_limit = 8589934592; -- 8GB
-- Set globally for all future sessions
SET GLOBAL exec_mem_limit = 8589934592;
4. Summary of Memory Defaults
Variable | Default Value | Description
exec_mem_limit | 2 GB | Limit per query instance/fragment.
query_mem_limit | 0 | Total limit per query on a BE (0 = no limit).
mem_limit | 90% | (BE Config) Total memory the BE process can use.
can use. |
References
• sql-reference/System_variable.md
• administration/management/resource_management/Memory_management.md
• administration/management/BE_configuration.mdFrancisco Silva
06/12/2026, 2:19 PMRocky
06/12/2026, 2:19 PMexec_mem_limit in StarRocks is 2,147,483,648 bytes, which is exactly 2 GB.
You can find this documented or referenced in several places within the StarRocks documentation and system behavior:
1. SQL Reference - SET Statement
In the StarRocks documentation for the SET command, the official examples use 2GB as the standard baseline:
_ _Example:* SET GLOBAL exec_mem_limit = 2147483648;
2. FAQ and Troubleshooting
The Troubleshooting Resource Isolation page contains a FAQ section that uses the 2GB default to explain how memory is calculated per query instance:
*“Q: If a query consumes 128 GB memory in total... while query_mem_limit=0 and exec_mem_limit=2G. Will the query fail? A: The query fails as long as any instance consumes more than 2 GB.”*3. Memory Management Docs In the Memory Management section, it is noted that several other memory-related variables (like
load_mem_limit) default to 0. When these are set to 0, the system automatically falls back to the exec_mem_limit value, which is initialized at 2GB.
Note on Modern Versions (v3.x+)
In recent versions, StarRocks has shifted toward using query_mem_limit (which defaults to 0, meaning "no limit" other than the BE's total mem_limit). While exec_mem_limit is still there for backward compatibility and specific fragment-level control, the system will prioritize query_mem_limit when the Pipeline Engine is active.
To check your current value, you can run:
sql
SHOW VARIABLES LIKE 'exec_mem_limit';
References
• sql-reference/System_variable.md
• administration/management/BE_configuration.md
• faq/resource_isolation_faq.md
• administration/management/resource_management/Memory_management.mdFrancisco Silva
06/12/2026, 2:21 PMRocky
06/12/2026, 2:21 PMexec_mem_limit remains 2,147,483,648 bytes (2 GB).
While the 4.0 release line introduced major architectural improvements (like Flat JSON V2, Decimal256, and enhanced Iceberg support), this specific safety limit has been kept at 2GB for backward compatibility and to prevent individual query fragments from accidentally consuming all backend memory.
Why 2GB?
In StarRocks, a single query is broken down into multiple fragments (instances) that run across your BE nodes.
* exec_mem_limit (2GB): This is a hard limit for each individual fragment on a BE.
* query_mem_limit (0/Unlimited): This is the limit for the entire query on a single BE. By default, it is 0, meaning the query can use as much memory as the BE allows (mem_limit), provided no single fragment exceeds the 2GB exec_mem_limit.
Documentation in v4.0.x
You can verify this in your specific cluster by running:
sql
SHOW VARIABLES LIKE 'exec_mem_limit';
The StarRocks 4.0 documentation and the troubleshooting guides for resource isolation continue to reference this 2GB default:
* Safety Cap: If a query generates 10 fragments on a single BE, it could technically use up to 20GB of RAM even if query_mem_limit is not set, because each fragment is allowed its own 2GB.
* Errors: If you see the error Memory exceed limit... Limit: 2147483648, it means one part of your query plan (like a large hash join or aggregation) tried to use more than the 2GB default.
Recommended Adjustment for v4.0.9
Given that modern servers often have 128GB+ of RAM, the 2GB limit is frequently too small for complex workloads. It is common practice to increase this globally:
sql
-- Increase to 8GB or 16GB depending on your BE RAM
SET GLOBAL exec_mem_limit = 8589934592;
References
• sql-reference/System_variable.md
• release_notes/release-4.0.md
• faq/resource_isolation_faq.md
• administration/management/resource_management/Memory_management.md
References
• administration/management/resource_management/Memory_management.md
• sql-reference/System_variable.md
• administration/management/BE_configuration.md
• faq/resource_isolation_faq.md
• knowledge/usage/best-practice.md
• release_notes/release-2.4.md
• release_notes/release-4.0.mdFrancisco Silva
06/12/2026, 2:21 PMRocky
06/12/2026, 2:22 PMSHOW VARIABLES LIKE 'exec_mem_limit'; returns an empty set in v4.0.9, it is because StarRocks has fully transitioned to the Pipeline Engine as the primary execution framework, and exec_mem_limit has been effectively replaced or deprecated in the 4.x release line.
In version 4.0 and later, you should use query_mem_limit instead.
Key Changes in StarRocks 4.x
1. Variable Replacement: The variable exec_mem_limit (which limited memory per fragment instance) is no longer the standard for query memory control. It has been superseded by query_mem_limit, which limits the total memory usage of a single query on a single BE node.
2. Default Value of `query_mem_limit`: The default is typically 0, which means there is no per-query limit. The query is only restricted by the Backend's total memory limit (mem_limit, usually 90% of the OS memory).
3. Why it's gone: In the Pipeline Engine (default since v3.x and the only path in v4.x), memory is managed more holistically across the query's pipeline tasks rather than individual fragments.
What you should check instead
To see your current query memory limit, run:
sql
SHOW VARIABLES LIKE 'query_mem_limit';
How to set a limit
If you want to re-impose a 2 GB limit (the old default) for a specific session or globally:
sql
-- Set for the current session
SET query_mem_limit = 2147483648;
-- Set globally for all users
SET GLOBAL query_mem_limit = 2147483648;
Summary of Memory Limits in v4.x
* query_mem_limit: Limits memory for one query on one BE. Default is 0 (no limit).
* mem_limit: (BE Config) Limits the total memory for the entire BE process. Default is 90% of machine RAM.
* load_mem_limit: Limits memory for import tasks. Defaults to 0 (inherits query_mem_limit).
If you are receiving memory-related errors, StarRocks 4.0 recommends using Resource Groups for more granular control rather than relying solely on individual session variables.
References
• administration/management/resource_management/Memory_management.md
• sql-reference/System_variable.md
• release_notes/release-3.3.md
• administration/management/BE_configuration.md
• faq/resource_isolation_faq.md
• release_notes/release-4.0.md session variables. 4)
• sql-reference/sql-statements/cluster-management/config_vars/SET.md
• release_notes/release-4.1.md
References
• faq/resource_isolation_faq.md
• sql-reference/System_variable.md
• administration/management/BE_configuration.md
• administration/management/resource_management/Memory_management.md
• release_notes/release-3.3.mdFrancisco Silva
06/12/2026, 2:24 PMRocky
06/12/2026, 2:25 PMquery_mem_limit is set to 0 (unlimited), StarRocks queries can still fail with MEM_LIMIT_EXCEEDED because there are several other layers of memory protection.
In version 4.0.9, if you are hitting a 2GB limit specifically, it is almost certainly coming from one of the following "hard-coded" or "legacy" defaults that query_mem_limit=0 does not override.
1. The Global BE Process Limit (mem_limit)
If your error message says "Memory of process exceed limit", your Backend (BE) has hit its total allowed memory usage.
* Default: 90% of the machine's RAM.
* The 2GB connection: If you are running on a very small machine (e.g., a dev container with 2-4GB RAM), the 90% limit will naturally be around 2GB.
* Check: Run SHOW CONF LIKE 'mem_limit'; on your BE nodes (via HTTP API or check be.conf).
2. The Legacy Fragment Limit (exec_mem_limit)
Even if it's missing from SHOW VARIABLES in your specific build, the execution engine often maintains a fallback default of 2GB (2,147,483,648 bytes) for individual execution fragments.
* The logic: query_mem_limit controls the whole query on a node, but the engine still tracks "fragments" (specific tasks like a hash join). If query_mem_limit is 0, some versions of the Pipeline engine revert to a conservative per-fragment safety cap to prevent a single skewed task from crashing the node.
* Verification: Check the full error message. If it contains Limit: 2147483648, this is exactly what is happening. Try explicitly setting it:
sql
SET GLOBAL query_mem_limit = 8589934592; -- Set to 8GB instead of 0
Note: Setting a specific value often works better than 0 because it forces the engine to allocate a larger explicit budget to the query's memory tracker.
3. Load Process Limit (load_mem_limit)
If your query is part of an INSERT INTO ... SELECT or a broker load:
* Default: In many 3.x/4.x configurations, the default load memory limit is 2GB.
* Documentation: This is controlled by the BE configuration default_load_mem_limit.
* Fix: SET load_mem_limit = 8589934592;
4. Specific Operation Caps
Several internal operations have their own 2GB defaults documented in StarRocks 4.0:
* Schema Change: memory_limitation_per_thread_for_schema_change = 2GB.
* Compaction: compaction_memory_limit_per_worker = 2GB.
* Intermediate Results: If a single column in a SORT or GROUP BY operation exceeds 2GB-4GB of raw data, it can trigger a limit error unless Spilling is enabled.
How to diagnose exactly:
To see which limit you are hitting, look at the <http://be.INFO|be.INFO> log or the full error string returned to your client.
1. "Memory of process exceed limit": The BE is full. Increase physical RAM or lower mem_limit.
2. "Memory of Fragment ... exceed limit": This is the 2GB legacy fragment limit. Set query_mem_limit to a high number (like 16GB) instead of 0.
3. "Mem usage has exceed the limit of query pool": Your query_max_memory_limit_percent (default 90% of BE limit) is being shared by too many concurrent queries.
Recommendation for v4.0.9:
Instead of 0, try setting a specific high value:
sql
SET GLOBAL query_mem_limit = 17179869184; -- 16GB
SET GLOBAL enable_spill = true; -- Allow big queries to use disk instead of failing
References
• administration/management/BE_configuration.md
• faq/resource_isolation_faq.md
• administration/management/resource_management/Memory_management.md
• sql-reference/System_variable.md
• release_notes/release-4.0.mdRocky
06/12/2026, 2:25 PMFrancisco Silva
06/15/2026, 10:20 AMRocky
06/15/2026, 10:20 AMstarrocks_audit_tbl__):
sql
ALTER TABLE starrocks_audit_db__.starrocks_audit_tbl__
SET (
"dynamic_partition.enable" = "true",
"dynamic_partition.partition_live_number" = "30"
);
* partition_live_number: This ensures StarRocks automatically drops partitions older than 30 days.
* dynamic_partition.enable: Must be true for the retention policy to execute.
2. FE Audit Log Files (on disk)
The Frontends (FE) also store audit logs as physical files in the fe/log/ directory. By default, StarRocks keeps these for 30 days, but you can verify or change this in your fe.conf file:
1. Open fe/conf/fe.conf.
2. Check or add the following parameter:
properties
audit_log_delete_age = 30d
3. Restart the FE for this configuration to take effect (this parameter is not mutable at runtime).
3. Minimum Retention Safeguard
StarRocks also has a safety setting to prevent logs from being deleted too aggressively if disk space is high. You can adjust this globally without a restart:
sql
ADMIN SET FRONTEND CONFIG ("log_cleaner_audit_log_min_retention_days" = "30");
Summary of Differences
Storage | Management Method | Parameter
StarRocks Table | Table Property | "partition_live_number" = "30"
Disk (.log files) | fe.conf | audit_log_delete_age = 30d
References
• administration/management/audit_loader.md
• administration/management/FE_configuration.md
• sql-reference/sql-statements/table_bucket_part_index/ALTER_TABLE.md
References
• administration/management/BE_configuration.md
• using_starrocks/caching/block_cache.md
• deployment/environment_configurations.md
• deployment/shared_data/feature-support-shared-data.md
• administration/management/FE_configuration.mdFrancisco Silva
06/15/2026, 10:22 AMRocky
06/15/2026, 10:22 AMPARTITION BY date_trunc('day', timestamp), then you use partition_live_number directly.
Correct command:
sql
ALTER TABLE starrocks_audit_db__.starrocks_audit_tbl__
SET ("partition_live_number" = "30");
2. If you used Legacy Dynamic Partitioning
If your table was created using the older PARTITION BY RANGE syntax with a separate dynamic_partition properties block, you must use the dynamic_partition. prefix.
Correct command:
sql
ALTER TABLE starrocks_audit_db__.starrocks_audit_tbl__
SET ("dynamic_partition.partition_live_number" = "30");
──────────
How to verify which one to use?
Run this command to check your table's current configuration:
sql
SHOW CREATE TABLE starrocks_audit_db__.starrocks_audit_tbl__\G
* Case A: You see PARTITION BY date_trunc(...) $\rightarrow$ Use partition_live_number.
* Case B: You see PARTITION BY RANGE(...) and dynamic_partition.enable = true $\rightarrow$ Use dynamic_partition.partition_live_number.
Important Note
For either method, StarRocks checks and deletes expired partitions every 10 minutes by default (controlled by the FE config dynamic_partition_check_interval_seconds). The deletion is based on the current date; partitions older than 30 days relative to today will be dropped.
References
• administration/management/audit_loader.md
• table_design/data_distribution/expression_partitioning.md
• table_design/data_distribution/dynamic_partitioning.md
• sql-reference/sql-statements/table_bucket_part_index/ALTER_TABLE.md
References
• table_design/data_distribution/expression_partitioning.md
• sql-reference/sql-statements/table_bucket_part_index/ALTER_TABLE.mdFrancisco Silva
06/15/2026, 3:25 PMRocky
06/15/2026, 3:25 PMfilter parameter in the plugin.conf file. This uses the same syntax as a Stream Load WHERE clause.
* File: auditloader/plugin.conf
* Parameter: filter
* Example: To only ingest queries from a specific user or queries that failed:
properties
filter=user='admin' and state='ERR'
* Common Use Case: Use filter=isQuery=1 to exclude metadata operations and only ingest actual SELECT/INSERT statements.
2. Filtering fe.audit.log (Generation)
At the FE level, you can filter by module (e.g., only logging connections or only slow queries). These are set in `fe.conf`:
* audit_log_modules: Controls which categories are logged.
* Default: slow_query, query
* Options: query, slow_query, connection (available since v3.0).
* qe_slow_log_ms: Sets the threshold for what is considered a "slow query." If a query is faster than this (default 5000ms), it won't appear in the slow_query category.
* enable_audit_sql: Set to false if you want to record the fact that a query happened but mask the actual SQL text (replaces it with ?).
3. Filtering fe.big_query.log (Generation)
This log is filtered automatically based on resource consumption thresholds. A query is only recorded here if it exceeds one of the following thresholds defined in `fe.conf`:
* big_query_log_cpu_second_threshold: (Seconds) Log queries exceeding this CPU time.
* big_query_log_scan_rows_threshold: Log queries scanning more than this many rows.
* big_query_log_scan_bytes_threshold: Log queries scanning more than this many bytes.
By adjusting these thresholds, you effectively "filter" the ingestion into the big query log file.
Summary of Differences
Filter Level | Method | Best For
Generation (File) | fe.conf parameters | Reducing disk I/O and log file size.
Ingestion (Table) | AuditLoader filter | Saving only relevant data into the StarRocks audit table.
References
• administration/management/audit_loader.md
• administration/management/FE_configuration.md
• administration/management/logs.md
References
• administration/management/FE_configuration.md
• administration/management/audit_loader.md
• sql-reference/information_schema/loads.mdFrancisco Silva
06/15/2026, 3:52 PMRocky
06/15/2026, 3:52 PMfe.audit.log depends on your configuration, but it generally contains the same set of fields whether it is in its default text format or JSON.
1. Where to find the field list
The most reliable way to see the current structure for your version is the AuditLoader documentation, which provides a CREATE TABLE statement. The columns in that table map directly to the fields generated in the log file.
2. Standard Field Definitions
The following fields are typically present in the `fe.audit.log`:
Field Name | Description
queryId | Unique identifier for the query.
timestamp | Start time of the query/event.
queryType | Category of the event (query, slow_query, or connection).
clientIp | The IP address and port of the client.
user | The username used for the connection.
authorizedUser | The authenticated user identity (e.g., 'root'@'%').
db | The database the query was executed against.
state | Outcome of the query (OK, EOF, or ERR).
queryTime | Total execution time in milliseconds.
scanBytes | Total bytes scanned from storage.
scanRows | Total number of rows scanned.
returnRows | Number of rows returned to the client.
cpuCostNs | CPU time consumed in nanoseconds.
memCostBytes | Peak memory used by the query in bytes.
stmtId | Incremental ID of the statement within the session.
isQuery | 1 for SELECT/queries, 0 for DDL/DML.
feIp | The IP of the FE node that handled the request.
stmt | The actual SQL text (may be truncated or masked based on config).
resourceGroup | The resource group/workload group used.
warehouse | (In v3.x+) The warehouse name used for the query.
3. Format Variants
You can control the physical layout of these fields in `fe.conf`:
* Default (Text): Fields are written as pipe-separated key=value pairs.
_ _Example:* queryId=...|timestamp=...|user=...
* Structured (JSON): If you set audit_log_json_format = true, the log will be a single JSON object per line. This is highly recommended if you use external log collectors like Filebeat or Fluentd.
4. Special Logs
* fe.big_query.log: Contains the same structure as above but includes additional fields for resource thresholds (like bigQueryLogCpuSecondThreshold) to explain why the query was flagged as "big."
* fe.audit.log.connection: If you enable the connection module in audit_log_modules, you will see login/logout events which have a subset of these fields (primarily IP, user, and timestamp).
References
• administration/management/audit_loader.md
• administration/management/FE_configuration.md
• administration/management/logs.md
References
• administration/management/audit_loader.md
• loading/RoutineLoad.md
• quick_start/shared-data.mdFrancisco Silva
06/15/2026, 3:55 PMRocky
06/15/2026, 3:55 PMfe.audit.log file are separate components. The log file is the "source of truth" generated by the FE, and the plugin is just one way to move that data into a database table.
1. The Relationship
* fe.audit.log: A local text file residing on each FE node (usually in starrocks/fe/log/). It is generated by an internal StarRocks component called __builtin_AuditLogBuilder.
* AuditLoader Plugin: A separate, optional background process that reads the fe.audit.log file and uses Stream Load to ingest those lines into a StarRocks table for easier SQL-based analysis.
──────────
2. The Structure of fe.audit.log
By default, the log file is not a CSV or a simple table. It is a series of pipe-separated key=value pairs.
Default Format (Text)
Each line looks like this:
timestamp=2023-10-27 10:00:00|queryId=abc-123|user=root|clientIp=127.0.0.1|...
JSON Format
If you set audit_log_json_format = true in fe.conf, the structure changes to a single JSON object per line, which is much easier for tools like Filebeat or ELK to parse.
──────────
3. List of Internal Fields (Keys)
Whether in pipe-separated or JSON format, these are the standard keys recorded in the log:
Key | Description
queryId | The unique UUID for the query.
timestamp | Start time (YYYY-MM-DD HHMMSS).
queryType | query, slow_query, or connection.
clientIp | IP and port of the connecting client.
user | The username logged in.
authorizedUser | The actual RBAC user (e.g., 'root'@'%').
db | The default database for the session.
state | OK, EOF (success), or ERR (failure).
errorCode | MySQL error code if the state is ERR.
queryTime | Total time in milliseconds.
scanBytes | Data scanned from storage in bytes.
scanRows | Number of rows scanned.
returnRows | Number of rows sent back to the client.
cpuCostNs | CPU time in nanoseconds.
memCostBytes | Peak memory usage in bytes.
stmtId | Session-level sequence number for the statement.
isQuery | 1 for SELECT, 0 for DDL/DML/Others.
feIp | The IP of the FE node that wrote this log entry.
stmt | The raw SQL text.
digest | (If enabled) The SQL fingerprint/hash.
resourceGroup | Name of the Workload/Resource Group used.
How to verify your specific structure
Since field names can vary slightly between major StarRocks versions (e.g., v2.5 vs v3.x), the best way to see your exact structure is to run:
bash
tail -n 1 /path/to/starrocks/fe/log/fe.audit.log
This will show you exactly which key= pairs your FE is currently emitting.
References
• administration/management/logs.md
• administration/management/FE_configuration.md
• administration/management/audit_loader.md
References
• administration/management/audit_loader.md
• administration/management/FE_configuration.md
• administration/management/logs.md
• knowledge/usage/best-practice.mdFrancisco Silva
06/15/2026, 3:56 PMRocky
06/15/2026, 3:56 PMaudit_log_json_format = true (introduced in v3.2.7) and likely sys_log_format = "json" (introduced in v3.2.10) enabled in your fe.conf.
When these settings are active, StarRocks switches from the legacy pipe-separated (key=value) format to a structured JSON format. A key difference in this mode is that field names use PascalCase (e.g., User instead of user), as they are serialized directly from the internal AuditEvent class.
Full Structure for fe.audit.log (JSON Mode)
In this mode, the "message" field of your log contains a JSON object with the following typical keys:
JSON Key | Description
Timestamp | Query start time (Unix epoch in milliseconds).
QueryId | The unique UUID for the query.
User | The login user.
AuthorizedUser | The authenticated identity (e.g., 'root'@'%').
Db | The database context.
State | Outcome: OK, EOF, or ERR.
ErrorCode | MySQL error code (if state is ERR).
Time | Total execution time in milliseconds.
ScanBytes | Total bytes scanned.
ScanRows | Total rows scanned.
ReturnRows | Rows returned to the client.
CpuCostNs | CPU time in nanoseconds.
MemCostBytes | Peak memory usage in bytes.
IsQuery | Boolean (`true`/`false`) indicating if it was a SELECT.
FeIp | IP of the FE node handling the request.
ClientIp | IP of the client that connected.
Stmt | The actual SQL statement.
Warehouse | The warehouse used (for shared-data/v3.x clusters).
ResourceGroup | The name of the workload/resource group used.
fe.big_query.log Additional Fields
The fe.big_query.log uses the exact same structure as above but appends three additional fields to explain why the query was categorized as "big":
* BigQueryLogCpuSecondThreshold: The CPU limit that was exceeded.
* BigQueryLogScanBytesThreshold: The scan byte limit that was exceeded.
* BigQueryLogScanRowsThreshold: The scan row limit that was exceeded.
Why the difference?
* Standard Log: Uses lowercase/camelCase keys (e.g., queryId=...).
* JSON Log (audit_log_json_format): Uses PascalCase keys (e.g., "QueryId": "...").
If you are using the AuditLoader plugin, note that the plugin is designed to parse the standard pipe-separated format. If you have enabled JSON audit logs, you must ensure your ingestion pipeline (or a custom version of the plugin) is configured to handle the JSON schema and PascalCase keys.
References
• administration/management/FE_configuration.md
• administration/management/logs.md
• administration/management/audit_loader.md
References
• administration/management/FE_configuration.md
• administration/management/logs.md
• administration/management/audit_loader.md
• administration/http_interface/query_detail.md
References
• administration/management/FE_configuration.md
• administration/http_interface/query_detail.md
• administration/management/logs.md