【华为云MySQL技术专栏】TaurusDB资源隔离技术,让资源利用率飙升

举报
GaussDB 数据库 发表于 2025/04/17 09:14:59 2025/04/17
【摘要】 一、背景介绍TaurusDB 的多租户管理特性,能够让数据库为多个租户服务,从而提高数据库资源利用率。该特性不仅实现了租户间的数据隔离,确保了不同租户能够安全访问自己的数据,还支持租户级和用户级的资源隔离,避免资源浪费和性能干扰。同时,它还支持资源的动态调整,能够及时应对不同租户或用户的业务高峰和低谷。本文将结合多租内部使用的 CGroups(Control Groups,控制组)技术和My...

一、背景介绍

TaurusDB 的多租户管理特性,能够让数据库为多个租户服务,从而提高数据库资源利用率。

该特性不仅实现了租户间的数据隔离,确保了不同租户能够安全访问自己的数据,还支持租户级和用户级的资源隔离,避免资源浪费和性能干扰。同时,它还支持资源的动态调整,能够及时应对不同租户或用户的业务高峰和低谷。

本文将结合多租内部使用的 CGroups(Control Groups,控制组)技术和MySQL 8.0发布的资源组特性,来介绍 TaurusDB 内部资源隔离和限制的实现机制。

二、原理介绍

2.1 CGroups介绍

CGroups 是 Linux 内核提供的一种物理资源隔离机制,通过这种机制可以限制一组进程或者线程所使用的物理资源(CPU、Memory、IO等)。

CGroups 将一个或多个进程(或线程)组织成一个逻辑组(称为“CGroup”),然后对该组整体进行资源控制,每个控制组指明了资源的配额限制,一个进程/线程可以加入到某个控制组,也可以迁移到其他控制组。

CGroup 为每种可以控制的资源定义了一个子系统,即资源控制器,包含了不同的物理资源配置规则。在 Linux 系统中,CGroup 子系统位于以下目录下:

/sys/fs/cgroup/cpu:限制 CGroup 的 CPU 使用率。

/sys/fs/cgroup/cpuacct:统计 CGroup 的 CPU 使用率。

/sys/fs/cgroup/cpuset: 绑定 CGroup 到指定的 CPU 核心。

/sys/fs/cgroup/memory: 限制 CGroup 的内存使用率。


TaurusDB的多租特性对CPU资源的隔离,正是基于CGroup和Thread Pool(线程池)技术实现的。通过当前连接识别所属租户/用户,并将该连接绑定到对应CGroup目录下的Worker Thread(工作线程)进行处理,具体可参考《TaurusDB多租户管理与资源隔离特性解读》进行了解。

1.png

▲ 图1 cgroup树状继承关系

如图 1 所示,CGroups 有树状的结构关系,子控制组会默认继承父控制组的属性(资源限制等),同时,子控制组分配的资源之和不能超过父控制组的资源额度。
在实现上,CGroups 并没有增加新的系统调用,而是通过一个 cgroup 文件系统(cgroupfs)来管理,可以把一个或多个子系统挂载到某个目录创建控制组。例如:
  • cpu_cgrp:具有cpu使用率的限制和统计能力。

  • memory_cgrp:具备内存使用率的限制能力。

同样,子控制组 cgrp1 和 cgrp2 的CPU资源配额之和不能超过父控制组 cpu_cgrp 的 CPU 额度。

mkdir -p .../cgroup/cpu_cgrp
mount –t cgroup –o cpu,cpuacct cpu_cgrp .../cgroup/cpu_cgrp
mkdir /sys/fs/cgroup/cpu_cgrp/cgrp1
mkdir /sys/fs/cgroup/cpu_cgrp/cgrp2

想要创建图 1 中的子控制组 cgrp1、cgrp2,只需要在 cpu_cgrp 父目录下创建对应的子目录即可,子目录将默认包含以下配置文件:
cgroup.event_control   cpu.cfs_period_us  cpu.rt_period_us   
cpu.shares      notify_on_release    tasks    cgroup.procs     
cpu.cfs_quota_us   
cpu.rt_runtime_us      cpu.stat           release_agent      
cpuacct.stat    cpuacct.usage        cpuacct.usage_percpu

上述提到的TaurusDB Worker Thread,正是通过这一特性修改文件 cpu.shares 、 cpu.cfs_period_us 和 cpu.cfs_quota_us 中的内容比例,从而完成对不同租户的CPU分配控制。

cpu.shares控制组之间的CPU分配比例,缺省值1024。假设 group1 中的 cpu.shares 1024,而 group2 中的 cpu.shares 3072,那么 group1 : group2 =1:3。 

在一台 4 个 CPU 的机器上,当 group1 和 group2 都需要 4 个 CPU 的时候,它们实际分配到的 CPU:group1 是 1 个,group2 是 3 个。只有在 CPU 资源争抢时才生效,决定了控制组 CPU 使用的下限。

无论 CPU 是繁忙还是空闲,cpu.shares 都会限制控制组 CPU 使用的上限。

2.png

cpu.cfs_quota_us 和 cpu.cfs_period_us 配合使用,用于控制租户内进程使用 CPU 的绝对值。如果 cpu.cfs_quota_us 是 cpu.cfs_period_us 的 2 倍,则表示该租户的进程在 2 个核上完全使用。

3.png

图 1 从整体结构上描述了进程与 cgroup 之间的关系。最下面的 P 代表一个进程。每个进程都指向一个辅助结构 css_set(cgroups subsystem set)。 指向某一个 css_set 的进程会被加入到当前 css_set 的进程链表中,隶属于同一 css_set 的进程将受到该 css_set 所关联的资源限制。

图 中的“M × N Linkage”说明了 css_set 通过辅助结构可以与 cgroups 节点进行多对多的关联。多租特性主要关注 CPU 子系统的限制使用。

2.2 资源组管理介绍

MySQL 8.0 新增了 resource group(资源组)的功能,旨在将一个或多个线程归属到一个资源组下,DBA们可以通过命令配置资源组的资源选项。

与 MySQL 8.0  resource group 特性一致,TaurusDB在现阶段仅提供了对 CPU 资源的设置,通过查看源代码 sql/resourcegroups/platform 文件夹下的 API,可以看出,资源组通过绑定 CPU 核心和设置优先级来实现对 CPU 资源的精准管控。

在 resource_group_sql_cmd.cc 中,继承自 Sql_cmd 类的Sql_cmd_create_resource_group,Sql_cmd_drop_resource_group,Sql_cmd_alter_resource_group 和 Sql_cmd_set_resource_group ,分别对应着创、删、改资源组,以及将其分配给对应的执行线程的操作。

以图 2 新建资源组流程为例:

4.png

▲ 图新建资源组流程

可以看出,配套资源组引入了两个新权限:

  • RESOURCE_GROUP_ADMIN:用于创、删、改资源组;

  • RESOURCE_GROUP_USER:用于指定线程到资源组中。

DD(数据字典)中新增了 resource_groups 表,负责持久化信息。从表的结构,可以清晰地看出一个 Resource_group 包括:

5.png

| resource_groups | CREATE TABLE `resource_groups` (
 `id` bigint unsigned NOT NULL AUTO_INCREMENT, 
 `resource_group_name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,  
 `resource_group_type` enum('SYSTEM','USER') COLLATE utf8mb3_bin NOT NULL,  
 `resource_group_enabled` tinyint(1) NOT NULL,  
 `cpu_id_mask` varchar(1024) COLLATE utf8mb3_bin NOT NULL,  
 `thread_priority` int NOT NULL,  
 `options` mediumtext COLLATE utf8mb3_bin,  
 PRIMARY KEY (`id`),  
 UNIQUE KEY `resource_group_name` (`resource_group_name`)

在Sql_cmd_set_resource_group中绑定线程时,最终由Thread_resource_control 负责调用 apply_control ,并通过调用不同操作系统的 bind_thread 和 set_thread_priority 接口,来达成资源(CPU)的限制和管理。

实践中,TaurusDB 使用 taskset 命令完成指定线程和 CPU 的绑定,避免其他线程的竞争导致性能波动。

三、总结

本文介绍了 TaurusDB 多租特性中,使用 CGroups 技术和资源管理组特性来限制资源的方法。目前,这两种方法都集中限制了 CPU 资源。后续 TaurusDB 计划对诸如内存、 IOPS 等方面进行更细粒度的优化,从而实现更精细的资源管理,更好地支持多租户使用。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。