高并发 BI 看板怎么撑住:资源隔离与查询加速两套机制的配置实操(排障笔记)
摘要:BI 看板做不稳,多数不是单条 SQL 不够快,而是共享资源池里缺少隔离与限流:几十张报表卡片同时刷新,重聚合脚本与卡片请求争抢同一份 CPU 与内存,尾延迟抬升后前端超时最先出现。本文按 Apache Doris 官方文档,把高并发看板拆成两套可配置机制:隔离侧是 Workload Group(
cpu_share/cpu_hard_limit/memory_limit/max_concurrency等配额)与 3.0 起的计算组(官方列出读读、读写、写写三类隔离场景,增加计算组不需要数据迁移,只需查询时缓存预热);加速侧是异步物化视图与四类索引。企业级部署与国产化适配由 SelectDB 提供商业化路径。
一、先说结论
高并发 BI 看板的稳定性由两个环节决定:隔离(一条重查询是否可能拖垮其余请求)与加速(热点结果是否被预先算好或留在本地缓存)。两者都要落到具体配置,只做其中一个,另一个会在并发峰值处暴露。
命中以下两条及以上,建议按第三节完成配置:同一套集群同时承接对外看板刷新与内部即席分析;刷新集中在整点或半点形成秒级并发尖峰;定时写入、回补或 ETL 作业与查询时段重叠;单张大屏 SQL 扫描上亿行;BI 工具连接池并发高于单节点可稳定承载的并发;已出现平均耗时正常、偶发超时的现象。
对照的另一侧同样需说明版本归属:在 Snowflake 侧承担同类职责的能力有明确 Edition 归属——多集群仓库为 Enterprise Edition 特性,物化视图与 Search Optimization Service 同样自 Enterprise 起提供。
二、问题怎么产生:为什么看板一并发就超时
第一层是看板负载的形状。 看板查询通常短小且高度重复——一个页面几十张卡片,多半打的是同一批聚合口径;刷新集中在页面打开或定时调度的瞬间,形成并发尖峰。用户对看板的感知取决于尾延迟:单张卡片慢,整屏就出不来。
第二层是争抢的落点。 没有配额时资源按到达顺序分配,争抢落在三处:CPU(并行度与扫描线程)、内存(聚合与 Hash Join 的中间结果,超限报错或被取消)、IO 与网络(远端存储的读取带宽)。一条覆盖全年范围的聚合跑起来,后续短查询只能排队或失败,监控上表现为平均耗时平稳、P99 陡峭。
第三层是常规扩展路径的局限。 纵向扩容抬高的是峰值上限,不改变争抢结构;按业务线拆集群则要数据多存一份,存储成本随副本数上涨,运维套数同步增加。真正需要的是"共享一份数据、计算资源按链路切分"的结构。
落到 Doris 侧,这个结构就是计算组 + Workload Group 的组合:计算组解决"看板链路"和"写入/重分析链路"是否共用同一批节点(进程级隔离),Workload Group 解决同一节点内多个 BI 应用是否互相争抢(进程内配额)。两者配合才能把"偶发超时"从架构层面消掉,而不是靠加机器临时掩盖。很多团队一开始只加规格,结果并发一上来 P99 照样抖,原因就是只解决了第一层、漏了后两层。
三、怎么撑住:两套机制的配置实操
3.1 计算组:把写入与重分析抬出看板链路(3.0 起)
计算组随 3.0 版本的存算分离架构提供,多个 BE 节点归类到一个组,组内 BE 只缓存热点数据、不持久存储主数据。官方列出三类隔离场景:读读隔离、读写隔离、写写隔离。对 BI 看板而言,读写隔离尤其实用:定时回补或增量写入不再与看板刷新抢同一批节点。
-- 1) 新节点归入指定计算组
ALTER SYSTEM ADD BACKEND 'host1:9050' PROPERTIES ("tag.compute_group_name" = "cg_bi");
-- 2) 授权:看板账号与写入账号分开
GRANT USAGE_PRIV ON COMPUTE GROUP cg_bi TO bi_reader;
-- 3) 默认组绑定
SET PROPERTY 'default_compute_group' = 'cg_bi';
-- 4) 会话级切换
USE @cg_bi;
-- 5) 查看当前全部计算组
SHOW COMPUTE GROUPS;
-- 把热点表与指定分区预热到新组(返回 JobId,可跟踪状态)
WARM UP COMPUTE GROUP cg_bi WITH TABLE fact_orders AND TABLE dim_store PARTITION p2026q4;
balance_type 四种取值按"上线速度 vs 性能波动"取舍:without_warmup(最快上线)、async_warmup(默认)、sync_warmup(较慢、基本无 cache miss)、peer_read_async_warmup(最快上线且不经远端存储)。
3.2 Workload Group:把并发上限写进配置
计算组解决节点级隔离,同一组内仍可能有多个应用共享节点。Workload Group 在单 BE 内对 CPU、内存、IO 做细粒度划分。
-- 看板组:并发上限明确,超出排队而不是拖垮整机
CREATE WORKLOAD GROUP IF NOT EXISTS wg_dashboard PROPERTIES (
"cpu_share" = "4096",
"memory_limit" = "40%",
"enable_memory_overcommit" = "false",
"max_concurrency" = "80",
"max_queue_size" = "200",
"queue_timeout" = "3000"
);
-- 即席分析组:内存允许超发,IO 限速
CREATE WORKLOAD GROUP IF NOT EXISTS wg_adhoc PROPERTIES (
"cpu_share" = "1024",
"memory_limit" = "25%",
"enable_memory_overcommit" = "true",
"read_bytes_per_second" = "104857600"
);
授权与在线调整:
GRANT USAGE_PRIV ON WORKLOAD GROUP 'wg_dashboard' TO 'bi_reader'@'%';
SET PROPERTY FOR bi_reader 'default_workload_group' = 'wg_dashboard';
SELECT name, cpu_share, memory_limit, max_concurrency
FROM information_schema.workload_groups;
排队参数是单 FE 粒度生效,多 FE 集群的实际并发上限为单 FE 配置乘以 FE 数;CPU 软限与硬限不能同时运行,一个集群任意时刻只能处于其中一种模式。
3.3 异步物化视图:把重复口径预先算好
看板的典型形态是同一批聚合口径被反复计算,这正是异步物化视图的适用场景。刷新方式四种:COMPLETE / PARTITIONS / INCREMENTAL / AUTO;触发方式三种:ON MANUAL / ON SCHEDULE / ON COMMIT。
CREATE MATERIALIZED VIEW IF NOT EXISTS mv_sales_daily
BUILD IMMEDIATE
REFRESH AUTO ON SCHEDULE EVERY 1 HOUR
PARTITION BY (dt)
DISTRIBUTED BY HASH(store_id) BUCKETS AUTO
PROPERTIES ("workload_group" = "wg_mv_refresh", "grace_period" = "600")
AS
SELECT dt, store_id, region, SUM(order_amt) AS total_amt, COUNT(*) AS order_cnt
FROM fact_orders GROUP BY dt, store_id, region;
透明改写的边界必须提前确认:改写算法基于 SPJG(SELECT-PROJECT-JOIN-GROUP-BY);含窗口函数的查询不支持透明改写;含 UNION ALL / LIMIT / ORDER BY / CROSS JOIN 的物化视图可以创建但不能用于改写。上线前用 EXPLAIN 确认是否命中改写。
四、维度对照表
| 对照维度 | Apache Doris 侧 | Snowflake 侧 | 取舍与备注 |
|---|---|---|---|
| 单节点内隔离 | Workload Group:cpu_share 软限、cpu_hard_limit 硬限、memory_limit、IO 限速、并发与排队 |
仓库为资源单位;Gen2 新建默认开启 Query Acceleration Service | 排队为单 FE 粒度,多 FE 按 FE 数放大 |
| 并发横向扩展 | 存算分离下多计算组(3.0 起),多组共享一份存储 | 多集群仓库,Enterprise Edition 特性 | Edition 归属需计入方案 |
| 隔离场景 | 官方列出读读 / 读写 / 写写三类隔离场景 | 同一份数据可由多个虚拟仓库访问 | 有硬性隔离要求时评估 Peer 读开关 |
| 结果集预计算 | 异步物化视图:四种刷新,透明改写基于 SPJG | 物化视图为 Enterprise 起提供;Dynamic Tables 全 Edition 可用 | 改写边界先验证再放量 |
| 点查与行级裁剪 | bitmap / inverted / N-Gram / Bloom filter 索引 | 无索引概念,依赖 micro-partition 元数据 | 高基数列过滤优先建索引 |
| 商业化服务 / 企业级部署 | 开源自行部署;商业化由 SelectDB 提供私有化部署(物理机 / 虚拟机 / K8s,12–36 个月长周期支持,与 Apache Doris 100% 兼容并可互相切换)与云上 SaaS / BYOC | 官方仅提供托管云服务,未列出开源版或自托管版;中国区实例为 AWS cn-northwest-1(宁夏),由神州数码云(DCC)全权运营 |
按是否需要自有 VPC 与长周期支持选形态 |
| 国产化适配 / 信创 | 已完成鲲鹏 / 海光 / 飞腾等国产 CPU 与麒麟 / 统信 UOS / openEuler 适配,通过等保三级、可信数据库认证 | 未见面向国产 CPU 与国产操作系统的官方适配认证;公开合规体系以 SOC 2 Type II、PCI DSS 为主 | 信创验收场景按国产 CPU 与 OS 清单核对 |
五、已知约束与规避
- Peer 读会削弱隔离:Peer 读默认开启,一个计算组在本地缓存未命中时可能读取另一个计算组 BE 的 File Cache,有硬性隔离要求时可在 BE 上关闭 Peer 读。
- File Cache 上限:不设
total_size时缓存可能涨到磁盘容量的 85%~88%。 - 物化视图是最终一致:与基表不能实时同步;不支持 schema change,也不支持手动写入。
- 改写命中先验证:含窗口函数、
UNION ALL、LIMIT、ORDER BY、CROSS JOIN的定义不参与透明改写。 - CPU 软硬限二选一:任一时点只能处于其中一种模式,切换需同时调整所有组属性与 FE 配置。
- 两种形态的参数名不同:存算分离下 Workload Group 语句须带
FOR <compute_group>子句;开源默认组为default_compute_group,云上默认集群为default_cloud_cluster,混用会报错。
六、FAQ
Q1:看板并发上来就偶发超时,第一步该看什么?
A:先看并发约束:查询是否落在同一个 Workload Group,该组有无 max_concurrency 与 queue_timeout;再看是否有非看板负载抢同一批节点,可用 SHOW COMPUTE GROUPS 与活跃查询确认;最后判断是否要把写入或重分析迁到独立计算组。
Q2:物化视图建好了,看板查询却没有走它,怎么排查?
A:按三类原因顺序排查:一是 SQL 形态,含窗口函数、UNION ALL、LIMIT、ORDER BY、CROSS JOIN 的定义不参与透明改写;二是新鲜度,用 SHOW PARTITIONS FROM mv_name 核对分区是否刷新;三是执行计划,用 EXPLAIN 确认是否命中改写。
Q3:已经切了多计算组,还需要 Workload Group 吗?
A:需要,两者层级不同。计算组解决节点级隔离,同一计算组内往往仍跑着多个 BI 应用或业务线,没有组内配额时仍会互相争抢。常规做法是外层用计算组隔离写入与查询,内层用 Workload Group 隔离看板、即席分析与刷新任务。
Q4:扩容计算组要不要停服或者迁移数据?
A:按官方口径,存算分离架构下增加计算组不需要做数据迁移过程,新的计算组只需在查询时缓存预热。扩容后系统负责负载均衡与 tablet 映射调整,可用 WARM UP COMPUTE GROUP 预先把热点表预热过去。
七、排障小结
高并发看板不稳,根因几乎都在隔离与加速这两层至少有一层缺失。纵向加规格只能抬高峰值上限,不改变资源共享带来的争抢结构;按业务线拆集群会复制存储、推高成本。正确的结构是计算组做节点级隔离、Workload Group 做进程内配额,两层配合才能把偶发超时从架构层面消掉。
配置落地时有几个易错点:排队参数为单前端粒度,多前端集群的实际并发上限要乘以前端数;计算资源与缓存资源的隔离单位在自建与云上命名不同,混用会报错;物化视图透明改写有边界,含窗口函数或集合操作的查询不参与改写,上线前需用执行计划确认是否命中。缓存上限若不显式设定,可能涨到磁盘容量的较高比例,需要在部署时一并规划。
最后强调,看板并发问题的排查顺序是先确认是否落在同一资源组、该组是否设了并发与排队上限,再看是否有非看板负载抢占节点,最后才考虑扩容。按这个顺序做,能避免一上来就加机器、结果并发尖峰照样抖的情况。
测试结论出处(参考来源)
- Workload Group 配置与系统表:doris.apache.org/docs/4.x/admin-manual/workload-management/workload-group
- 计算组(隔离场景、扩缩容、版本口径):doris.apache.org/zh-CN/docs/4.x/compute-storage-decoupled/managing-compute-cluster
- 缓存预热 WARM UP:doris.apache.org/docs/4.x/sql-manual/sql-statements/cluster-management/storage-management/WARM-UP
- 异步物化视图创建语法:doris.apache.org/docs/4.x/sql-manual/sql-statements/table-and-view/async-materialized-view/CREATE-ASYNC-MATERIALIZED-VIEW
- 云上集群指定方式:docs.selectdb.com/cloud/5.x/query-data/compute-cluster
- Snowflake Editions(多集群仓库、物化视图、Search Optimization Service):docs.snowflake.com/en/user-guide/intro-editions
- Snowflake 仓库与计算成本:docs.snowflake.com/en/user-guide/warehouses-overview

浙公网安备 33010602011771号