玩转GaussDB(DWS)资源负载管理系列 --- DWS资源负载管理的原理是什么,是怎么实现分布式资源管理的呢?
文章目录
1. 多租户介绍
2. 计算资源:cpu管控
3. 计算资源:内存管控
4. 存储资源:磁盘空间
正文
一、什么是多租户?
所谓多租户:就是我们一套集群内,可以有多个用户使用,比如说云上,一个集群中有多个用户,大家都有自己的业务要运行,假如其中某个用户A运行了一些很吃资源的业务,一个人就把cpu、内存等资源用得淋漓尽致,那么其他人就只能看着了,自己的业务完全受阻,这时候,就需要多租户手段,去限制A用户所使用的资源,比如规定好让他最多使用1G的内存,最多使用30%的cpu,这样的话他的作业跑起来也不会影响到其他人,大家相安无事,好好工作。
二、GaussDB for DWS多租户概述
GaussDB for DWS 用两层用户架构组织租户。一个父租户下有多个子租户,一个子租户只能属于一个父租户。我们通过给父租户分配资源配额,同时限定附属于该父租户的子租户的资源使用。其中,子租户也可以分配父租户分配到的资源。
主要涉及的资源有以下几种:
1)计算资源:CPU资源、内存资源。
2)存储资源:磁盘空间。
下面我们分别对各种资源的分隔方式进行一个技术分享。
三、计算资源
-
CPU资源管控
GaussDB for DWS的CPU管控机制,是基于linux自带机制:CGroup来实现的,CGroup是Linux内核提供的一种限制、记录、隔离进程组所使用的物理资源(如CPU、 Memory、I/O等)的机制。
我们以一种树的形式,组织各个分配了资源的租户,如下图所示:
图中是控制组的一个挂载树,从最上层开始,就分为了两部分,一部分是属于Gaussdb的资源,一部分是留给系统其他进程使用的资源,我们使用的资源如图所示,都是挂载到Gaussdb:gaussdba的,其中第一层又分为两个控制组,Backend用来预留资源给数据库常驻的各个工作线程,Class控制组的资源用来分配给各个用户进行作业执行。
我们每创建一个父租户,就会对应创建一个UserClass1-n挂载到Class控制组下,去从Class控制组分到对应配额的CPU资源。而我们创建的子租户,会从他们的父租户那里分配资源,当前我们支持两层的架构,父租户对应数据库中的组用户,子租户对应数据库中的业务用户。
总体来说可以这样表述:给父租户分配40%的CPU,此时子租户将父租户的40%当做100%来分配,比如子租户A设置配额为50%,那么实际上是相当于分配了整体CPU资源的40%*50%=20%。
2.内存资源管控
Gaussdb for DWS数据库当前的架构由最早的多进程架构,演变为多线程架构,因此单独一个数据库实例,比如一个coordinator或者datanode,都是作为一个进程运行,进程中会用多个线程去负责各种不同的工作,比如有的用来执行用户作业,有的用来处理后台的任务,各个cn与dn互相之间由一套独特的通信架构进行联络(基于TCP协议),由cn解析下发客户端发过来的作业,下推给dn去执行,结果再返回汇总到cn,完成各种业务。
DWS会直接在数据库进程启动的时候,就为其分配好内存,为实例分配的一整块内存中,会根据不同的需要,划分为各种不同的内存上下文,其中有一块内存,叫做dynamic_workload_memory,作为作业运行时可以使用的内存,总体大小也会在一开始被规定好,举个例子,整个进程分配到20G内存,可以给dynamic_workload_memory根据算法从中分配对应的内存,比如会分配20G中的15G用于作业执行。
而我们要说的多租户内存管控机制,就是从这15G的内存中,按照租户规定的百分比,对一个租户可以使用的资源进行限制。当给一个租户设置了一定额度的内存之后,数据库中会对他使用的内存进行一个记录,当他运行的作业所使用的内存要超过对应的内存的时候,就会不再执行,作业进入排队状态,等待资源释放之后再继续执行。
四、存储资源
存储资源主要就是指磁盘空间上的管控,在实际使用的过程中,很容易出现由一条坏SQL一直执行,持续下盘,导致整个磁盘到达使用率100%的状态,后果非常严重,因此,DWS也为了避免出现这种状况,提供了磁盘管控的功能,在内核8.0版本中,一共提供了三种类型的磁盘空间管控:永久表空间管控、临时表空间管控、以及SQL执行时的算子罗盘使用的临时空间管控。日常使用过程中进行下盘的无非这三种场景,我们已经都可以对其进行磁盘额度限制,这个额度和用户绑定,我们在使用过程中,创建用户或者修改用户,都可以指定该用户可以使用的永久空间,临时表空间,算子落盘空间。使一个用户所使用的磁盘空间在可控制的范围内,一旦超过限制,该用户将不能再进行落盘的操作,并且如果是当前正在执行的语句导致的磁盘空间膨胀,数据库内核也会把他找到并且干掉。
具体内部机制可以这样描述:内核中会记录每个用户使用的空间大小,并且在用户进行落盘等使用到磁盘空间操作时也进行对应记录,直到用户所使用的空间达到限额时,内核就会做出对应的策略,不允许该用户再进行落盘。
此外,内核中还有一个保护机制,就是当某个dn实例使用率达到90%时,整个集群会进入只读状态,为防止磁盘达到100%后的未知后果,直接禁止所有的写入操作。
五、后记
与此同时,对于用户所使用的资源,DWS也提供了监控功能,从页面上可以看到当前用户的资源使用情况,同样也可以在内核中查询视图:pg_total_user_resource_info进行查看。
希望通过本文可以加深读者对于DWS多租户功能的认识理解。
- 点赞
- 收藏
- 关注作者
评论(0)