【GaussTech速递】数据库技术解读之细粒度资源管控

news2024/11/18 8:24:42

背景

对数据库集群内资源管控与资源隔离一直是企业客户长久以来的诉求。华为云GaussDB作为一款企业级分布式数据库,一直致力于满足企业对大型数据库集群的管理需要。

数据库可以管理的资源有计算资源与存储资源,计算资源包括CPU、内存、IO与网络,存储资源包括数据存储空间、日志存储空间与临时文件等。

从用户角度来看,资源管控通过设定阈值或者优先级限定程序对资源的使用,保证承诺服务等级协议的同时,又满足不同用户间资源隔离,达成多个租户共享数据库资源的目的。

从系统的角度来看,引入资源监控与控制的手段,可以实现资源在可控情况下被合理利用的目的,避免资源耗尽,防止系统停止响应、崩溃等情况的发生。作业优先级,可以保证作业平稳运行,避免某个作业占用资源过高时影响其他作业,并在资源富裕时,实现资源利用的最大化。除此以外,还能满足外部的期望,保证系统资源使用最大化。通过对作业控制,可以保证作业是平稳的,避免作业执行过程中出现不可控的行为。

为了解决上述目标,华为云GaussDB数据库提供了一种对数据库集群内资源进行细粒度管控的方案——细粒度资源管控。该方案在不同的管控粒度(如用户级、会话级与语句级)和不同的管控维度(CPU、内存与IO)都提供了对应的管控能力。用户可以根据自己业务需求采取合适的管控维度与管控粒度来达成资源管控与资源隔离的目标,满足不同场景的资源控制的需要。

技术架构

我们先来看下细粒度资源管控的技术架构和运行原理:

 

从上图中可以看到,GaussDB提供资源池模块来完成CPU、内存与IO的管控逻辑。用户可以创建一个资源池并指定其可以使用的CPU、内存与IO的份额,并把资源池与用户绑定。之后该用户发起的作业在数据库内核优化解析、执行引擎以及存储引擎模块运行的过程中都会受到实时资源管控,确保其CPU、内存与IO都在对应资源池的范围内。

假设A公司部署了一套GaussDB实例,其同时存在三个不同的应用来访问该实例,如OLTP业务、报表业务、其他低优先级业务。A公司希望对三个业务做资源的合理管控,在保证资源使用最大化的情况下,系统平稳运行。我们可以使用系统管理员执行如下命令来为三个业务的用户设置,其资源份额比例为50:30:10,剩余的10%为系统预留。

这里仅做简单的使用示例,每一个参数的具体含义会在后面的章节进行详细说明。

create resource pool respool_tp with(control_group="cgroup_tp", max_dynamic_memory="5GB", max_shared_memory="5GB", io_limits=50, io_priority="High");
alter role tp_user RESOURCE POOL 'respool_tp';

create resource pool respool_report with(control_group="cgroup_report", max_dynamic_memory="3GB", max_shared_memory="3GB", io_limits=30, io_priority="Medium");
alter role report_user RESOURCE POOL 'respool_report';

create resource pool respool_other with(control_group="cgroup_other", max_dynamic_memory="1GB", max_shared_memory="1GB", io_limits=10, io_priority="Low");
alter role other_user RESOURCE POOL 'respool_other';

如上操作后,OLTP业务、报表业务与其他低优先级业务分别使用tp_user、report_user与other_user连入GaussDB执行作业时,这三个业务则会受到对应的资源池respool_tp、respool_report与respool_other的管控,在资源发生争抢的时候保证三个业务分别可以使用GaussDB集群50%、30%以及10%的资源。

关键能力

在了解了细粒度资源管控的整体架构和使用方法之后,我们再来看看它具备哪些关键能力,这些能力可以为客户带来什么样的业务价值。

 CPU管控

GaussDB的CPU管控是以资源池粒度来做用户资源管控的,每一个资源池绑定一个控制组,通过控制组(Control Group,CGroup)来实现CPU的管控。CGroup是Linux内核提供的一种限制、记录、隔离进程组所使用的物理资源(如CPU、Memory、IO等)的机制。

考虑到数据库系统、用户、作业不同维度的隔离性和可配置性,GaussDB使用控制组的层级特性构造符合数据库场景的模型(见下图),其满足客户SLA的关键特性,并支持三个维度的层次隔离和控制:数据库程序与非数据库程序隔离、数据库常驻后备线程与执行作业线程隔离以及数据库多用户之间的隔离。

GaussDB控制组可以设置CPU的百分比以及核数的上限,其中根节点负责管控GaussDB进程可用的CPU份额;Backend控制组负责管控数据库常驻后台线程的CPU份额(Vacuum、DefaultBackend);Class控制组负责管控用户的作业线程的CPU份额(UserClass1,UserClass2,...UserClassN);Class控制组内还可以创建Workload控制组(TopWD,RemainWD...)进行更细粒度的管控。

接上面的示例,我们用GaussDB提供的CGroup工具来为A公司的OLTP业务、报表业务以及其他低优先级业务分别创建控制组,CPU分配比例为50%、30%与10%。

gs_cgroup -c -S cgroup_tp -s 50;
gs_cgroup -c -S cgroup_report -s 30;
gs_cgroup -c -S cgroup_other -s 10;

执行如上命令就代表我们成功创建了3个控制组,之后可以在创建资源池时指定该控制组名称。绑定资源池的用户所发起的作业就会收到控制组对应CPU份额的管控。

CGroup管控CPU有两个问题需要注意:

一是,如果线程的CPU需要受CGroup管控,那么需要执行CGroup的系统API来为线程绑定对应的CGroup,该操作较为耗时;

二是,CGroup的CPU管控效果,在线程数与CPU成比例的情况下,管控效果最佳。

基于这些问题GaussDB提出了线程组的概念,每一个资源池对应一个线程组,线程组里的线程都绑定了该资源池所对应的CGroup。同时,GaussDB会将每一个线程组的线程数量调整到与对应CGroup的CPU份额一致。具体可见下图:

 

每一个用户发起的作业都会被分发到对应的线程组里的线程来执行,由于线程已经绑定了对应的Cgroup节点,所以操作系统会在线程调度时完成CPU管控。

GaussDB提供两层用户机制,绑定Class控制组的资源池称之为组资源池,对应的用户为组用户,绑定Workload控制组的资源池称之为业务资源池,对应的用户为业务用户。组用户一般对应一个部门,而业务用户对应这个部门的不同的业务。业务资源池的各个资源维度的资源份额会不会超过所属组资源池的份额,从而达到两级资源管控的目标。

CPU管控也提供名称为session_respool的GUC来限制单个会话的CPU不超过对应资源池的CPU上限。

内存管控

GaussDB提供动态内存与共享缓存的管控,创建资源池时可以指定max_dynamic_memory与max_shared_memory来分别完成动态内存与共享缓存的阈值设置。

动态内存管控并没有更改其原有的内存资源分配机制,仅在分配内存之前增加一个逻辑判断层,对多分配出的内存进行记账,通过检查该记账值是否达到允许使用的内存上限来完成内存的管控。当动态内存超过上限时,作业申请内存会失败。作业退出时,该作业已申请的内存会进行释放来保证其他作业可以正常执行。同理,当作业使用的共享缓存超过资源池的管控上限时,再次申请共享缓存,需要先释放自己已经占用的共享缓存,比如BufferPool,作业申请页面时,会对自己已经占用的页面进行淘汰,淘汰之后空余出来的页面供自己继续使用。

GaussDB除了用户粒度的内存管控外,也提供session_max_dynamic_memory与query_max_mem两个GUC参数来完成会话级与语句级动态内存的管控,当一个会话或者语句所使用的动态内存达到GUC的阈值时,作业申请内存失败。

IO管控

GaussDB的磁盘读写IO都由后台线程完成,该线程无法区分页面属主,只是按照时间顺序依次落盘,无法针对不同用户管控不同的IO使用。基于此,考虑IO管控功能采用逻辑IO统计方式,对用户或者会话的读写IO进行管控限制,在工作线程和共享缓存之间增加了逻辑IO计数,对于行存表来说每6000(可通过io_control_unit GUC进行修改)行算做一次IO,当一秒产生的读写IO请求数超过资源池设置的阈值时,则将该IO请求加入到后台线程的一个等待队列里,后台线程将对等待队列里的这些IO请求进行监控,当其等待时间符合条件时,将这些IO请求从等待队列中唤醒。

GaussDB支持两种模式的IO资源管控,上线数值模式是通过设置固定的触发IO次数的数值,进行IO资源控制;优先级模式是指在当前磁盘长时间使用率达到95%以上,所有作业都无法达到上线数值模式时,用户可通过该模式进行IO控制,控制该作业原本触发IO的优先级比例,优先级包含三挡:High、Medium与Low。

接上面的示例,我们为A公司的OLTP业务、报表业务以及其他低优先级业务分别创建资源池,IO权重分别设置的为High、Medium与Low。那么,OLTP业务能使用50%的IO请求向BufferPool中读取或写入数据,少量的IO请求会进入等待队列等待;报表业务能使用20%的IO请求向BufferPool中读取或写入数据,较多的IO请求会进入等待队列等待;其他低优先级业务能使用10%的IO请求向BufferPool中读取或写入数据,较多的IO请求会进入等待队列等待;后台监控线程会周期性的遍历IO等待队列,唤醒等待时间符合要求的IO请求从BufferPool读取或写入数据。

GaussDB除了支持用户粒度的IO管控外,也支持通过设置会话级GUC参数io_limits与io_priority,来完成指定会话上允许作业的IO管控。

连接数与并发管控

GaussDB提供基于资源池的连接数管控与并发管控,创建资源池时可以指定max_connections与max_concurrency来分别完成连接数与并发数的设置,可以使用如下SQL,为前面示例A公司的三个业务对应的资源池完成连接数与并发数管控:

alter resource pool respool_tp with(max_connections=-1, max_concurrency = -1);
alter resource pool respool_report with(max_connections=200, max_concurrency = 100);
alter resource pool respool_other with(max_connections=100, max_concurrency = 50);

如上SQL执行成功后,实时生效。A公司OLTP业务的连接数与并发数不受限制,只有集群有资源它都可以使用到;报表业务的最大连接数为200,其他低优先级业务的最大连接数为100,当这两个业务建立的连接数超过该值时,GaussDB内核会自动拦截,报当前连接数不足,链接失败;报表业务的最大并发数为100,其他低优先级业务的最大并发数为50,当这两个业务同时发起的作业数超过该值时,超出的作业将会进入等待队列,直到已有的作业完成之后GaussDB才会将其唤醒继续执行作业。

存储空间管控

存储空间管控,用于限定不同用户可以使用的空间配额,防止单用户存储空间使用过大导致整个数据库业务受阻。GaussDB通过在创建用户时指定存储空间的大小来实现对存储资源的管控。

存储空间资源分为三种类型:永久表空间(Perm Space)、临时表空间(Temp Space)与算子下盘空间(Spill Space)。

可以使用如下SQL,为前面示例A公司的三个业务对应的用户完成磁盘空间额管控。

alter user tp_user PERM SPACE '200G' TEMP SPACE '20G' SPILL SPACE '20G';
alter user report_user PERM SPACE '100G' TEMP SPACE '10G' SPILL SPACE '10G';
alter user other_user PERM SPACE '100G' TEMP SPACE '10G' SPILL SPACE '10G';

存储空间管理支持对组用户和业务用户的存储空间管理。当业务用户对应的组用户存在空间限制时,业务用户的空间也受到该组用户的空间限制。指定存储空间的大小后,该用户在DN上所有的写操作会增加用户已用空间,删除操作减少用户已用空间,CN会周期性的从DN获取一次已用空间总和,并对用户已用空间进行判断,超过最大值后cancel掉写作业(insert/create table as/copy),后面写作业报错退出。

特性演示

特性演示这里我们就简单的为大家演示一下CPU的管控效果,因为对业务影响最大的就是CPU。

创建两个资源池分别设置20%与60%的CPU,然后使用两个绑定了该资源池的用户开始跑业务。观测CPU的实际使用情况。

1. 创建控制组:

gs_cgroup -c -S class1 -s 20;
gs_cgroup -c -S class2 -s 60;

2. 创建资源池:

CREATE RESOURCE POOL xuuer_pool with(control_group = "class1");
CREATE RESOURCE POOL xyuser1_pool with(control_group = "class2");

3. 创建用户绑定资源池:

create role user1 RESOURCE POOL 'xuuer_pool';
create role user2 RESOURCE POOL 'xyuser1_pool';

4. 通过Top观察系统CPU状态,同时细粒度资源管控提供gs_wlm_respool_cpu_info函数来观察各个资源池的CPU实时情况。

如上图,可知初期系统CPU是空闲状态,资源池的CPU监控视图也显示CPU使用为0。让user1开始跑业务,观测可知系统CPU有一定业务占用,查询资源池的CPU监控视图显示,user1可以使用80%的CPU。此时,让user2也开始跑业务,观测可知系统CPU进入繁忙状态,查询资源池的CPU资源监控的系统函数可知user1的CPU使用率开始下降,user2的CPU使用率开始上升。

整理两个用户的CPU使用率并绘制曲线图如下图,可看出user1与user2的CPU使用率最终会平衡到3比1的状态,符合资源池对应的CGroup控制组里设置的20%与60%的比例,达到了CPU管控的效果。

总结

细粒度资源管控特性目前支持集中式与分布式。分布式下的计算资源管控是各个节点独立管控自己节点的资源,存储资源管控是以集群维度来整体管控的。

细粒度资源管控作为多租户的资源隔离的底座,实现资源的精准划分与控制,并解决高负载场景下资源不足而导致集群不可服务的问题。该特性适用于数据隔离不敏感,但对不同业务有资源隔离需求的场景,如果客户对资源隔离和数据隔离都有需求的话,可以关注一下我们后面即将分享的多租数据库特性哦!

- END -

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1655797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FastAPI vs Flask: 选择最适合您的 Python Web 框架

文章目录 1. 简介2. 安装和设置3. 路由和视图4. 自动文档生成5. 数据验证和序列化6. 性能和异步支持结论 在 Python Web 开发领域,FastAPI 和 Flask 是两个备受欢迎的选择。它们都提供了强大的工具和功能,但是在某些方面有所不同。本文将比较 FastAPI 和…

error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public: __cdecl ......

运行程序时,报如上图所示错误,其中一条是: ReflectionProbe.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl osg::Object::Object(bool)" (__imp_??0ObjectosgQEAA_NZ) 报这个错误一般是因为…

前端Web如何实现将一个 ECharts 动效保存为一张 GIF 动图?

前端Web如何实现将一个 ECharts 动效保存为一张 GIF 动图? 博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!…

[Cpp]类和对象 | 实现日期类

标题:[Cpp]类和对象 | 实现日期类 水墨不写bug 正文开始: 类和对象是Cpp面向对象编程区别于C的面向过程编程的重要的一部分,因此打好坚实的类和对象的基础对于深入学习Cpp语言是比较明智的。 本文通过实现简单的日期类来加深对类和对象的理解…

【算法】-- 二分查找详注

引入 二分查找,也称为折半查找;首先,二分查找是一种基于有序数组中查找特定元素的算法,所以它会因为数组的一些特性而受限。它的工作原理是不断将要查找的区间分成两部分,然后确定目标值可能存在的区间,直…

VUE 或 Js封装通用闭包循环滚动函数

1、vue3 闭包滚动函数的使用 js 调用也基本雷同 // 滚动Tab组件const scoreTabRef ref()// 滚动的选项const scrollOption ref({// 滚动的Dom元素scrollDom: null,// 滚动的时间间隔scrollInterval: 1500,// 滚动的距离scrollSep: 100,// 滚动历时时间scrollDuration: 10…

视频汇聚边缘网关EasyCVR硬件设备无法访问域名,解析失败该如何处理?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传统安防视…

240多道!Go开发岗位面试题合集(含答案)

随着今年互联网寒潮环境的影响,找工作的人也将达到顶峰,今天给大家分享一份《Go开发工程师超高频面试真题》,一共有240多道面试真题,希望能够帮助大家在面试中,少走一些弯路、更快拿到offer! 内容展示 GO 基…

uniapp0基础编写安卓原生插件之编写安卓页面在uniapp上显示(摄像头调用)

前言 如果你对安卓插件开发部分不熟悉你可以先看uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件 效果 开始 dcloud_uniplugins.json {"nativePlugins": [{"hooksClass": "","plugins": [{&…

信奥一本通:1103:陶陶摘苹果

#include <iostream> using namespace std; int a[101]; int main(){int n 10;//题目要求输十个数 for(int i 1;i < 10; i){cin >> a[i];//赋值到数组 }int c;cin >> c;//要求的值 int cnt 0;//计数 for(int i 1; i < n; i){//循环比较是否小于&am…

试用NXP官方的UDS bootloader

文章目录 1.前言2.资料获取2.1 MCU例程 2.2 开发环境2.3 上位机2.4 硬件 3.工程修改3.1 boot工程修改 3.2 app工程修改4.测试情况5.例程分享 1.前言 最近很多客户在开发S32K系列MCU时咨询是否可以提供基于UDS协议的bootloader。本文以S32K144为例&#xff0c;介绍如何使用NXP官…

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版

Parallels Desktop 19 for Mac v19.3.0.54924中文破解版是一款强大的虚拟机软件&#xff0c;支持多操作系统&#xff0c;提供卓越的虚拟化技术&#xff0c;确保流畅稳定的运行。新增特色功能如共享打印、TouchID集成等&#xff0c;提供便捷高效的虚拟机体验。界面美观现代&…

window golang 升级版本

执行go tidy&#xff0c;发现执行不了&#xff0c;得升级一下版本了 进入官网&#xff0c;并选择合适的系统以及版本。https://go.dev/dl/ 这台电脑是windows&#xff0c;我本人比较喜欢下载zip自己解压。 解压&#xff0c;这里我选择直接覆盖原文件&#xff0c;需要保留原版…

即将开幕,邀您共赴创新之旅“2024上海国际消费者科技及创新展览会”

备受期待的2024上海国际消费者科技及创新展览会&#xff08;以下简称“CTIS”&#xff09;即将于6月13日至15日亮相上海新国际博览中心N1-N3馆。 2024上海国际消费者科技及创新展览会总面积达40,000平方米&#xff0c;涵盖600余家展商&#xff0c;预计吸引40,000多位观众莅临现…

autodl 上 使用 LLaMA-Factory 微调 中文版 llama3

autodl 上 使用 LLaMA-Factory 微调 中文版 llama3 环境准备创建虚拟环境下载微调工具 LLaMA-Factory下载 llama3-8B开始微调测试微调结果模型合并后导出vllm 加速推理 环境准备 autodl 服务器&#xff1a; https://www.autodl.com/console/homepage/personal 基本上充 5 块钱…

毕业论文应该怎么写?推荐几款ai写论文工具

时间过的好快&#xff0c;马上又到了一年一度的毕业季了&#xff0c;对于即将毕业的学生来说毕业论文是一道难过的坎&#xff0c;想到自己为了毕业论文熬的夜&#xff0c;掉的头发&#xff0c;真的深有感触。 不过虽然翟博士给大家的毕业论文设了高门槛&#xff0c;但是随着时…

springboot项目中引入Xxl-Job并部署和使用

目录 模块划分 配置调度中心 配置执行器 添加执行器 写一个简单的定时任务 XxlJobHelper xxl-job是分布式任务调度平台&#xff0c;部署为独立的调度服务平台 github地址&#xff1a;xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任务调度…

ctfshow之_萌新web9至web10

一、访问在线靶场ctfshow 1、web9 如下图所示&#xff0c;进入_萌新赛的web9问题&#xff0c;题目提醒flag在config.php中&#xff1a; 如上图所示&#xff0c;可以get传参&#xff0c;且传入的参数需要正则匹配system、exec、highlight&#xff0c;且不区分大小写&#xff0…

Flink checkpoint 源码分析- Checkpoint snapshot 处理流程

背景 在上一篇博客中我们分析了代码中barrier的是如何流动传递的。Flink checkpoint 源码分析- Checkpoint barrier 传递源码分析-CSDN博客 最后跟踪到了代码org.apache.flink.streaming.runtime.io.checkpointing.CheckpointedInputGate#handleEvent 现在我们接着跟踪相应…

element ui的确认提示框按钮样式修改

修改确认提示框的默认按钮样式&#xff0c;使用css强制修改 例&#xff1a; js代码&#xff1a; deleteUser(params){this.$confirm("您确定要删除吗&#xff1f;此操作无法撤销并且将永久删除所有数据。", "提示", { type: "warning", cancel…