免费试用
作者:宋日杰
产品技术解读
2023-04-19

导读

资源管控技术(Resource Control)是 TiDB 7.0 版本中优化提升的重要能力之一,不仅可以在负载剧烈变化时,保证服务质量,同时提供了数据库的多租户隔离能力,能够有效地降低数据库运行成本,帮助企业节省信息化管理开支,提升企业的竞争力。

本文从将技术优势、配置方式、场景实践等角度详细解析 TiDB 7.0 版本中的资源管控技术。

作为可透明扩展的分布式数据库,TiDB 一直致力于满足企业对大型数据库集群的管理需要,集群内资源管控和资源隔离是企业客户长久以来的诉求之一。资源管控的主要目的在于解决数据库管理中常见的一些问题:

  • 当多个业务共享同一数据库集群时,某个业务的非预期负载变化会影响其他业务的正常运行
  • 当集群中存在混合负载时,对资源需求较高的数据分析或批量作业会影响在线交易类业务的响应时间
  • 在需要 7x24 高可用性的业务系统中,数据备份、统计信息收集等后台任务可能会影响服务质量
  • 应用灰度上线时,小流量引发的性能问题仍可能“击穿”整个生产数据库

为了解决上述场景中的问题,TiDB 开发了资源管控技术,于 TiDB 6.6 首次引入,并在 TiDB 7.0 进行了优化和增强。该技术利用资源组 (Resource Group) 将一个庞大的数据库集群划分为多个逻辑单元,每个资源组都能限制其所需的计算和 I/O 资源。通过特定设置,当集群有空闲资源时,允许一部分资源组超越其限制,以实现资源的充分利用。

核心优势

  • TiDB 采用了业界领先的双层资源管控机制来实现更精确的管控。“流量控制”模块控制资源限额,确保仅在限额内的操作才能得以执行;“调度控制”模块则对队列中的任务设置不同的优先级,以确保在负载剧烈变化或超负荷运行时,高优先级的任务能够得到快速反馈。与同类产品通常只提供其中一层管控能力不同,TiDB 同时具备流控和调度控制能力,能够精确定义出更符合用户场景的配置。
  • 基于存储计算分离的架构,TiDB 的资源管控对最重要的 I/O 资源进行了限制。I/O 吞吐通常是数据库系统最常见的资源瓶颈,也是资源管控的难点,多数数据库产品并不支持对 I/O 进行控制。只有控制住主要瓶颈,才能保证在资源阻塞时有疏通调控的手段。
  • 把所有资源抽象成统一的单位来进行分配和限制。太过细粒度的设置通常难以衡量,也容易失去灵活性。TiDB 希望通过尽量少的指标来识别用户的意图,自适应地完成最佳的调度方案,提升易用性。
  • 除了隔离性,提升资源利用率也是 TiDB 资源管控的重要目标。在整体资源尚有空闲的情况下,允许部分业务超过资源组定义的限制。
  • 提供用量统计的精确反馈, 通过监控面板获取实际用量的使用情况,协助用户合理改进配置。同时,配合企业管理目标,TiDB 能够协助企业精确统计各部门数据库资源的使用情况,进而完成合理的成本分摊。
  • 提供灵活的资源绑定手段。支持在用户级,会话级,和语句级指定资源的绑定方式,满足不同场景的资源控制需要。

管理方式

资源管控引入了“资源组(Resource Group)”的概念,通过设置“用户”和“资源组” 的对应关系,把会话与用户组进行绑定,利用“用量 (RU)”对资源限额进行定义。结构如下:

资源组结构.png

资源组 (Resource Group)

资源组是资源管理的逻辑单元。任意一个会话属于唯一的资源组,而同一资源组的所有会话共享同一组资源限额。TiDB 支持数据库用户与资源组的映射关系,通过设置数据库用户的默认资源组,用户会话可以分属于不同的资源组。未指定默认资源组的用户,与系统内置的 default 资源组相关联。

资源限额

TiDB 首先支持为资源组配置用量 (RU)。RU (Request Unit) 是 TiDB 对 CPU、IO 等系统资源的统一抽象的单位,目前会考虑 CPU、IOPS 和 IO 带宽三个指标,按照一定的比例统一到 RU 单位上。TiDB 支持设置资源组为 BURSTABLE 模式,BURSTABLE 模式允许资源组超额使用到集群的空闲资源。
用户可以查看面板数据的反馈,以获取真实的用量请求和分配情况。通过对数据进行分析,来优化资源组的限额配置。配合真实负载的压力测试,用户还可以通过数据反馈得出整个系统的用量上限。

调度优先级

默认情况下,所有资源组的优先级 (PRIORITY)均为“中等(medium)”。当资源组在同一优先级下,调度优先级按照资源配额的比例分配,这已经能够满足绝大多数场景的需要。用户仍旧可以显式地指定资源组优先级为“高(high)”或者“低(low)”,从而完成更复杂的设定。比如,为一个算力需求不大,但优先级很高的应用配置资源组。

资源组设定

在 TiDB v7.0,用户能够通过以下方式指定资源组:

  • 用户级别。通过 CREATE USERALTER USER 语句将用户绑定到特定的资源组。绑定后,对应的用户新创建的会话会自动绑定对应的资源组。
  • 会话级别。通过 SET RESOURCE GROUP 设置当前会话的资源组。
  • 语句级别。通过优化器 hint RESOURCE_GROUP() 设置当前语句的资源组。

配置步骤

  • 启用资源管控

手工开启资源管控分两步进行(资源管控在 TiDB 7.0 中默认开启):

1)设置 TiDB 全局变量启用“流量控制”:

SET GLOBAL tidb_enable_resource_control = 'ON';

2)在 TiKV 配置中将 resource-control.enabled 设为 true 启用“调度控制”

  • 估算集群容量

在资源规划之前,TiDB 提供了集群总用量(RU)的估算。需要注意的是,这个值是基于当前硬件配置结合平均负载经验得出的参考值,在运行用户实际应用时可能会有偏差。用户可以以此作为资源组起始规划的参考,后续再根据实际运行数据进行微调。

CALIBRATE RESOURCE;
  • 有了总容量的估算,此时我们可以根据实际业务目标规划和创建资源组。例如创建一个名为 rg1 的资源组,分配每秒 500 RU 的流量,并允许资源组在有空闲资源的情况下超限额分配。
CREATE RESOURCE GROUP IF NOT EXISTS rg1 RU_PER_SEC = 500 BURSTABLE;
  • 将用户 usr1 的资源组设置为 rg1
ALTER USER usr1 RESOURCE GROUP rg1;

完成上述配置后,当系统繁忙时,用户 usr1 的所有会话使用的资源上限为 500 RU/秒;非繁忙时间段, usr1 则能够使用空闲集群资源。

场景演示

我们来看一个配置的示例。假定我们有三个租户分别运行三种不同的业务形态,每类业务有不同的管控目标:

三租户配置示例.png

对于以上这个需求,如果选择严格的多租户物理隔离,就不得不为每一个租户分配足够的资源,同时会造成 oltp 谷值负载时的资源浪费比较严重;而放入一套集群又无法消除租户 batch 对租户 oltp 的影响。利用 TiDB 既“隔离”又“融合”的资源管控技术,我们可以为这几类用户分别创建资源组:

  • 为租户 oltp 分配一个较高的用量,租户 batch 和 租户 hr 则相对低,这样在系统资源紧张的情况下,保证租户 oltp 的服务质量。
  • 租户 oltp 和 batch 的资源组设置为 burstable, 这样租户 oltp 发生超预期的负载,仍旧可能会保证质量;而当整个集群负载有空余时, 租户 batch 可以利用空闲资源加速其工作。
三租户配置示例-2.png
  • 创建资源组
CREATE RESOURCE GROUP oltp  RU_PER_SEC=4000 BURSTABLE;
CREATE RESOURCE GROUP batch RU_PER_SEC=400 BURSTABLE;
CREATE RESOURCE GROUP hr    RU_PER_SEC=400;
  • 创建租户对应租户,并设置其所属的资源组
CREATE USER 'oltp' RESOURCE GROUP oltp;
GRANT ALL PRIVILEGES ON oltp.* TO 'oltp'@'%';
CREATE USER 'batch' RESOURCE GROUP batch;
GRANT ALL PRIVILEGES ON batch.* TO 'batch'@'%';
CREATE USER 'hr' RESOURCE GROUP hr;
GRANT ALL PRIVILEGES ON hr.* TO 'hr'@'%';

在完成以上简单的设置之后,我们来模拟几个租户不同的负载,观测吞吐量 (QPS) 和服务质量 (P99 响应时间)。整个场景模拟分为三个阶段:

  1. 首先三类负载同时运行, 租户 oltp 设置为峰值负载。
  2. 切换租户 oltp 的负载到谷值,其他不变。
  3. 再次切换租户 oltp 的负载回到峰值。
三租户配置示例-3.png

从实际数据来看,TiDB 资源管控技术在负载变化时的反馈非常及时。租户 oltp 的响应时间始终维持在较低的水平,租户 hr 的吞吐被限制在较低的范围内:

  1. 当租户 oltp 维持在峰值负载时, 它保持高吞吐和较低的响应时间;租户 batch 和 租户 hr 维持在低吞吐,由于租户 batch 可以使用空闲资源,因此吞吐要略高于租户 hr。
  2. 当租户 oltp 进入谷值负载,吞吐下降,其响应时间仍旧很低。这时由于租户 batch 的资源需求很大,因此它的吞吐迅速提升,响应时间下降, 租户 hr 仍旧被限制在其限额内。
  3. 当租户 oltp 重新回到峰值负载,租户 batch 则立即让出资源,使得租户 oltp 的吞吐再次回到之前的水平,响应时间维持不变。

由此得出, 利用 TiDB 提供的资源管控和调度能力,多个不同诉求的租户能够共存在一套系统中,在保证各自服务目标的基础上,提升资源使用效率。

资源管控技术协助企业兼顾质量与成本

从上面的例子我们看到, 资源管控技术能够有效地解决在负载剧烈变化时,服务质量无法保证的问题。我们也可以利用这项技术防止未经验证的应用出现资源过载,比如新业务上线前的灰度测试,为资源组为灰度流量定义上限,避免局部性能问题引发大范围影响。

资源管控技术同时提供了数据库的多租户隔离能力,支持企业将中小型的系统进行合并,降低数据库运行成本。成本的节约主要来自几个方面:

  • 节省预留资源:一般来说,我们在规划单系统容量的时候,平均负载一般占到规划容量的 50% 甚至更低,留下足够的空间应对突发的性能抖动,以及未来可能的业务增长。而多个不相关的业务系统很少在同一时间出现负载波动,结合 TiDB 可透明扩展的特性,将这些系统合并到同一集群中,就不必预留相同比例的空间了。
    节省预留资源.png
  • 缓解峰值谷值波动:如果将负载峰值与谷值不同的系统整合在一起,整合后的系统可以减少负载波动的幅度。在“削峰填谷”的作用下,资源利用率得到提升,低负载时段的硬件浪费也得到了减少。
缓解峰值谷值波动.png
  • 快速扩展与收缩:企业经常需要为定期的业务活动增加临时的计算资源,以确保系统的稳定性。在多个业务系统合并的情况下,可以借助合理的业务规划,共享预留资源,轮流进行促销活动,而不必反复部署,节约重复的人力投入。
  • 提升运维效率:将多个业务系统整合成一个系统,可以显著降低运维人员的投入。因为管理实体变少了,系统数量也减少到以前的几十分之一,运维难度和需要的人工成本都随之大大降低。

这要求产品需要有很强的负载隔离能力,同时又能够将资源融合,正是 TiDB 资源管控技术想要达成的目标。

未来展望

TiDB 发布的资源管控能力是一个很好的开始,我们将沿着这个方向从多角度持续深耕这项技术,通过细粒度资源管控技术为客户创造更多的价值:

  • 更多样的管控方式: 根据场景的不同,为客户提供百分比,权重,用量等多种资源限额定义方式,并把 TiDB Cloud 中 Serverless 模式的计量方式和经验注入产品,协助客户运行自己的私有云服务,轻松完成成本分摊。扩展资源组的映射方式,支持除用户以外其他会话属性向资源组的映射。
  • 更多维的管控范围: 除了最重要的 CPU 与 I/O 资源,持续延伸管控的范围和粒度,如分析型负载,内存使用,并行度等等。另外, 还将支持把运维操作和系统内部任务编入资源组, 协助客户做更精细的场景定义。
  • 更智能的管控手段:通过分析历史运行数据,提供资源管理的建议,协助客户发现资源配置的潜在问题和风险,结合 TiDB Cloud 的部署运行经验,为客户提供更经济更合理的资源配置建议,协助企业的成本控制。

TiDB 的弹性扩展特性和资源管控能力可以有效提高 IT 系统的效率,并协助企业降低 IT 运营的成本,同时确保系统的稳定性和安全性。随着资源管控技术的不断增强, TiDB 一定能够协助企业在数字化的道路上更加扎实地前进。