很多技术同行在第一次接触 TiDB Resource Control(资源管控,简称 RC)时,都会下意识地把它理解成一个高级的限流工具。这种理解在直观上容易让人接受,但如果仅仅把它定位为限流器,可能就无法完全体会到它在产品设计上的诸多良苦用心。
例如,大家在深入使用时难免会产生一系列疑问:为什么 TiDB 要单独引入 Resource Group(资源组)的概念?为什么要大费周章地设计 RU,而不是让大家直接对齐熟悉的 CPU 和内存指标?为什么它没有像某些传统数据库那样直接去做生硬的资源池物理隔离?为什么 Runaway Query(大查询拦截)是在执行过程中去识别治理,而不是在执行前直接拦截?
这些设计细节的背后,其实蕴含着 TiDB 对多业务共享集群如何平稳运行的全新理解。资源管控的目标,从来不是为了冷冰冰地“限制”用户使用资源,而是为了帮助大家在复杂的共享环境下,让不同业务能够相对公平、有序且高效地共享集群能力。 这才是整个资源管控设计的真正起点。

从资源不足,到资源失控
在日常的运维实践中,我们经常会遇到各种数据库性能瓶颈:CPU 打满了、I/O 跑满了、磁盘延迟升高了。表面上看,这些问题是因为“资源不足”导致的,但在很多生产环境中,真正让 DBA 感到头疼的往往不是资源绝对量的匮乏,而是资源使用的失控。
我们可以来看一个非常经典的“邻居噪声(Noisy Neighbor)”场景。在同一个 TiDB 集群里,往往同时运行着在线核心交易、BI 报表、数据分析平台和 ETL 批处理任务。某天白天,运营团队因为紧急需求突然执行了一条复杂的分析报表,需要扫描数亿行数据。紧接着,业务部门就开始反馈核心交易系统变慢了。可当 DBA 打开监控时,却发现集群整体的 CPU 并没有彻底打满,存储也未见明显异常,但在线业务的延迟就是莫名其妙地升高了。
问题的本质在于资源竞争。 数据库在默认情况下,并不知道哪条 SQL 关系到企业的营收命脉,哪项业务的优先级更高,它只能按照请求到达的先后顺序一视同仁地处理。于是,一个低价值的大查询就很容易在排队和调度中,无意间拖慢高价值的在线交易。资源管控要帮大家解决的,正是这种由于缺乏规则导致的资源失控。
为什么 TiDB 没有选择“资源硬隔离”?
很多用户经常会问,为什么不直接像虚拟机或者容器那样,给不同的业务强行划分独立的物理资源?比如 A 业务分 4 核,B 业务分 8 核,C 业务分 16 核,彼此井水不犯河水,这样难道不是最彻底、最简单的隔离方式吗?
这确实是一条很多传统数据库走过的经典路线,它的优点是隔离边界清晰、效果直接。但随之而来的代价,就是难以调和的资源利用率浪费。在实际业务中,核心交易往往白天繁忙、深夜清闲,而 ETL 批处理则恰恰相反。如果采用硬隔离,A 业务深夜闲置的 4 核资源将无法被正在挑灯夜战的 C 业务借用,这就违背了分布式数据库强调弹性与共享的初衷。
为了帮大家把每一分硬件预算都花在刀刃上,TiDB 选择了另一条更有弹性的路线:共享资源池 + 动态治理。资源依然在底层共享,但系统会在运行中持续、智慧地去判断谁正在消耗资源、谁的业务更重要、谁应该优先获得响应。这种设计既保留了多租户的弹性红利,又拉起了一道安全的防护网。
Resource Group:它是治理对象,而不是硬编码的资源池
要用好这套机制,首先需要帮大家厘清一个最常见的误区:不要把 Resource Group(资源组)等同于物理上的 Node Pool(节点池)。

物理节点池的核心逻辑是“划分资源的物理归属”,而 Resource Group 的核心逻辑则是“定义资源的动态使用规则”。它本质上是一个逻辑上的治理单元,既不会把你的 SQL 强行固定路由到某几台专属的服务器,也不会在物理上为某个业务死死扣出几核内存。
它更像是一个业务的预算账户。系统通过 Resource Group 来帮助管理员表达:这个业务每秒预计可以消耗多少资源、它的全局优先级是什么、在集群空闲时是否允许它超额突发使用、以及遇到异常查询时该如何处置。它管理的是规则,而不是物理归属,这也正是 TiDB 方案能保持高度弹性的原因所在。
为什么要设计 RU 这一套“统一货币”?
如果说 Resource Group 是我们的治理对象,那么 RU(Request Unit)就是这套治理体系中的通用语言。很多习惯了传统运维的同学难免会困惑,为什么不用大家熟悉的 CPU 核心数、IOPS 或者 QPS 呢?
原因在于,数据库的资源消耗从来不是单一维度的。一条 SQL 产生的负载,往往交织着 CPU 计算、存储 I/O、网络带宽以及 Cache 命中率等多种物理资源的损耗。如果我们试图针对每一种物理指标都去设限,配置规则会立刻陷入复杂的矩阵陷阱中。
因此,TiDB 引入了 RU,将不同维度的底层物理资源统一折算成一个抽象的度量单位。这就和大家现在使用大模型时付出的 Token 非常相似——我们不需要去精算这次对话让 GPU 运行了多少毫秒、占了多少显存,只需对齐 Token 即可。RU 同样不是硬件单位,而是一种专门为了降低理解和配置门槛而设计的资源治理单位。

为什么说它不仅仅是限流器?
很多时候,大家容易把 Resource Control 狭义地当成一个应急的限流开关,认为它只是在业务超载时把请求拉慢。但实际上,限流只是治理手段的一种结果,而不是最终的目标。
如果它只是一个单纯的入口限流器,我们就无法解释为什么 TiKV 存储层也要深度参与底层的资源调度,也无法解释为什么系统能支持业务优先级的流转。限流器通常只能被动地“堵截流量”,而资源管控做的是服务质量管理(QoS)。它不仅在资源紧张时让低优先级的业务主动让路,更重要的是在资源充足时,确保核心业务能够享受到最高优先级的丝滑响应。它管理的是全链路的资源编排,而不仅仅是把大水堵在门外。
Runaway Query:在不确定性中寻找最优解
在资源管控中,还有一个深受大家欢迎的设计——Runaway Query(大查询熔断)。不少同学曾提出过很好的设想:为什么系统不能在 SQL 还没有执行的时候,就提前百分之百准确地预测出它是不是大查询,并直接拒绝呢?
这是一个非常务实的工程取舍问题。在现实的数据库世界里,即使优化器再强大,在面对复杂的关联查询、统计信息过时、或是突发的数据热点倾斜时,执行前的估算都很难做到绝对的精准。

与其追求理论上完美的“执行前预测”,TiDB 选择了更务实的策略:承认预测存在误差,重点做好运行时的全程监控与实时治理。 当一条 SQL 在执行过程中,一旦跨过了我们设定的安全红线(如执行时间过长、消耗 RU 过多、扫描数据量超标),系统就会果断介入并按照预设规则处置。从工程落地和保障生产安全的角度来看,这种“运行时动态纠偏”的方案往往能给大家带来更踏实的安全感。
写在最后
在过去,我们往往习惯把数据库的资源管理看作是一个纯粹底层的技术调优问题。但 TiDB 的资源管控实践向我们展示了另一种可能:技术配置的背后,其实是业务优先级的治理。
因为在现实的商业场景中,资源永远是有限的,技术团队总需要在不同的业务诉求之间做出合理的取舍。而 Resource Control 最大的价值,就是把这种取舍从过去充满随机性的“线上遭遇战”,变成了可以在后台按规则、有组织、符合预期的“预算化管理”。它不是一个冷冰冰的限流器,它是协助大家在多业务共享的云时代,真正掌控集群稳定性的方向盘。