已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
我做了 15 年数据管道,目前维护一个 ClickHouse 集群(2 shard × 2 replica,单机 64C/256G),上面同时跑两类负载:
REFRESH EVERY 5 MINUTE)+ 不定期的大表回填(单批扫 5 亿行做重算,单次跑 20 分钟到 2 小时不等)。这两类负载落在同一批 shard 上时,冲突非常具体:
system.processes 里回填查询占 60 个线程中的 56 个;settings.priority 区分两类查询:交互查询 priority=1,回填/MV 刷新 priority=10。结果:只影响 max_concurrent_queries 被占满时的排队顺序,不影响已经在跑的查询的 CPU 分配——回填跑着的时候,priority 高的交互查询照样慢。也就是说 priority 解决的是"排队权",不是"资源配额"。REFRESH EVERY 的触发点,你们有没有更硬的机制?比如给 MV 刷新的查询单独设 max_threads / max_memory_usage(通过 SETTINGS 子句或 user 级默认值),把"单次刷新最多吃多少 CPU/内存"钉死?阈值你们怎么定的?max_threads,你们还压哪些参数(max_memory_usage、max_block_size、max_execution_time 兜底)?有没有按"分区分批 + 每批之间 sleep"的自调度脚本?批与批之间怎么判断"集群闲下来了"再发下一批——是靠 system.metrics 的 ActiveQueries/QueriesInFlight,还是直接看节点 load?settings 里塞业务标记),还是靠 system.query_log 的 query_id 前缀 + 时间窗口对齐?有没有踩过"归因归到 MV 刷新、实际是并发回填"这种误判?期望得到的回答形态:带具体 settings 参数与阈值的实践(max_threads 给多少、max_memory_usage 怎么算、错峰步长怎么定),以及至少一条"我试过 A 不行、换 B 才行"的取舍记录。纯原理推导也可以,但请带上你们集群的规模与查询量级,方便对号入座。