暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何利用资源管理技术,让 HTAP 负载同时运行

原创 腾讯云数据库 2024-07-08
163



胡翔

腾讯云数据库高级工程师

博士毕业于中国科学院软件研究所后,加入华为高斯实验室工作多年,加入腾讯后主要负责 TDSQL-A 数据库向量化执行引擎、资源管理等相关特性的设计和开发工作。

 

 

HTAP 负载要同时运行,就要涉及对应的资源管理技术,解决资源隔离等问题。在 InfoQ 公开课 DBTalk 第五期上,腾讯云数据库高级工程师胡翔带来了题为《如何利用资源管理技术让 HTAP 负载同时运行》的分享,介绍了该主题的相关内容。

 

背景介绍

HTAP 里包含了 OLTP 和 OLAP 两种不同的负载,如果想让它们在一起运行就必须做资源隔离,否则相互之间会有很大的干扰。这些资源包括了 CPU、内存、并发数、优先级。如果有一些负载 CPU 占用率比较高,系统就会被严重拖累,其他负载就没法运行下去。在 OLAP 这种场景中,大的作业可能一次申请内存比较多,超出系统内存就会造成系统不可用,这也是不可接受的。另外在多并发的场景,如果并发数量比较高,其他作业也没办法跑。还要考虑优先级,如果系统没有对优先级进行良好处理,高优先级的作业也没办法来正常跑,对客户的影响比较大。所以要通过资源隔离来处理不同特征的负载。

 

常见的资源隔离方案有两种,分别是物理资源的隔离方法,以及逻辑资源的隔离方案。

 

物理隔离是通过多个副本隔离,比如 OLTP 用行存的副本,OLAP 用列存的副本。它们是严格不共享物理资源的,是绝对隔离的状态。这样它的效果肯定是最优的,但成本肯定会更高,因为有多个副本,资源利用率也会较低。另外是逻辑资源隔离方案,相当于 OLTP 和 OLAP 共享物理资源,资源利用率高一些。但这两种负载共存要解决它们相互干扰的问题,确保每一种作业的 QoS 可以得到相应的保证。

 

具体实现介绍


物理资源的隔离方案用主备平面可以实现。它把集群分成两部分,左边主集群,右边备集群。主集群里部署所有主节点,有 CN 和 DN 节点;备集群部署相应的备副本。两种负载随时都可以通过路由到不同的集群上,比如说 OLTP 高并发可以用主集群来做,备集群做 OLAP 的分析。它们之间是通过复制来同步的,通过这种方式可以实现资源完全隔离。


使用资源组来做逻辑资源隔离,包括对并发数、CPU、内存设置了资源管理策略,然后用户创建资源组,把它分配到不同资源组上,就可以按照相应的策略实施资源管理。上图是我们用资源组进行资源隔离的架构图,也是一个多 CN 的 MPE 分布式执行数据库。这里有一个比较特殊的 CN 作为中心节点来做中心管控。并发控制、内存控制都是需要在中心节点上进行控制。CPU 控制使用 cgroups 的技术,是在不同的 CN、DN 进程上来做。其他 CN 把请求先路由到中心 CN、DN 做资源控制,然后中心管控的 CN,再把这个作业下发到 DN 上去执行。

 

下面具体来看并发数、CPU、内存是怎么来通过资源组来管控的。

 

并发数限制这块是先初始化了一个数组,这个数组是跟最大连接数参数相关的。这个数组是不同资源组所共享的全局数组。用户根据 ID 就可以找到对应的资源组,资源组上会有一些记录的信息,包括正在运行的事务数量。还有一些资源组配置的限制数,然后我们就简单通过这种对比确定了当前事务是否满足并发数的限制。如果不满足的话就进入等待队列,等待被唤醒。满足就可以分配 slot 并进行初始化,以便执行操作。

 

我们根据优先级划分了很多队列,通过这种方式可以更精确处理不同优先级的作业。高优先级的作业会被优先调动。另外这个限制也可以 bypass,有一些不想让它受控的作业直接通过 bypass 模式执行就可以。这里也是允许超时报错的,可以避免长时间的等待。以上是并发数限制的一个简单实现。

 

CPU 限制这块我们是利用 Linux control group 技术实现了资源隔离,这需要集群所有节点都开启 cgroups。Cgroups 是一个树形结构,涉及到多个树,每个树对应不同的子系统,管理不同的资源,比如说 CPU、内存、网络、存储、IO。


另外还有 cgconfig 服务,是配置 cgroups 的服务,可以配置挂载信息,即每种资源挂载到的文件目录,这里列出一个默认的目录,还可以配置具体需要管控的资源,比如说我只想管控 CPU 的话就直接配置这个就可以了。

 

具体到一些详细的设置,CPU 可以指定一个百分比,相当于这个资源组用的 CPU 比例。它有一个 CFS 调度器,区分了两种方式,一个是上限强制的 Enforce 模式,就是说它最多能使用一个上限值。这里有两个参数,一个相当于是单位,另一个参数相当于在这个单位里面可以用多大比例的时间。通过这种方式来确定资源组能使用 CPU 的上限,是控制比较精确的。

 

另外相对灵活一些的就是 CPU Shares 模式,它指定一定数量的配额,具体可以使用多大的 CPU 是需要与其他的 cgroups 设置做比较的。某些其他资源组空闲的时候它允许把这些 CPU 份额占用起来,只有所有资源组都忙的情况下才会按照预设比例来使用 CPU,这样方式更为灵活,资源利用率更高。这也是默认的使用方式。

 

CPU 限制的另外一种方式是 CPUSET,可以独占某一个 CPU,比如说这个资源组占用了这个 CPU1,其他资源组就不能用了。它比较适合的场景比如说高优先级的语句,我们可以把对应的用户分配到这样一个资源组上,然后可以占用这个 CPU,不会受其他 cgroups 运行的影响。还有像执行时间很短的 OLTP 语句我们也不想让它受其他 cgroups 影响,也可以做这样的配置。

 

需要注意的是,CPUSET 独占 CPU,可能会造成资源浪费。另外通常要尽量减少这种设置。另外还有 CPU0 需要预留给一些特殊场景。


内存限制这块主要是为了合理分配内存使用,避免过度使用内存的问题。我们是在单个的 DN 粒度来做内存限制的。内存分配有一个层次关系。系统内存分出来一部分需要给 OS 预留,还要分配一部分内存给数据库使用,通过参数限制数据库可以使用的内存量。内存限制按照单个 DN 维度的,因此需要将数据库占用的内存平均分配到每个 DN,然后再按照不同资源组指定的内存限制做进一步分配。最终可以计算出单个 DN 上执行一个 Query 能用多少内存。

 

实际执行时,在优化器上计划的时候会做一个估算,根据计划里面包含的这些重内存算子,然后还有一些参数设置做估算,根据这个估算得到这个 Query 在单个 DN 粒度上需要使用的内存数量。我们将这个值与上述计算出的可用内存进行比较,如果存在足够的空闲内存,这个 query 就可以继续执行,否则需要等待。

 

优化器估算内存时涉及到两个参数,一个是 Query_mem,一个是 Work_mem。Query_mem 是用来限制一个 Query 可以在单个 DN 上使用的最大内存,相当于整个语句维度来限制内存使用大小。Work_mem 是实际计算过程中可以使用的内存大小,它会在优化器生成计划时根据 Query_mem 自动地做进一步调整,比如说 Query_mem 设置比较小,相当于这个 Query 总共能用的内存数就很小,导致 Work_mem 就会相应得到更小的值,从而可以确保整个语句不会超过 Query_mem 的限制。如果执行时超过 Work_mem 的话,相应算子需要进行落盘处理。


以上对一个 Query 进行资源管理的流程,首先是根据用户 id 找到对应的资源组,然后进行并发限制判定,如果满足,进入下一步,如果不满足,则进行等待,接着进行内存限制判定,与上一步处理类似。执行阶段相关进行才会收到 CPU 限制。

 

使用资源组的基本步骤分以上四步。

 

首先是确保资源组启动,默认是不启动的,因为 linux 默认是关闭 cgroups 服务的。同时,还需要配置 cgroup 文件。另外,如果存在多个数据库,需要区别配置。

 

第二是创建资源组,可以设置这个资源组上一些限制,包括并发数、CPU 利用率,还有内存限制。

 

第三是把一个或多个角色分配到不同资源组上,比如说直接分配到 AdminGroup 里,它执行的一些 Query 会受该资源组的管控。

 

最后,通过资源管理视图来监视和管理资源组。如果出现一些异常,可以触发一些自动的运维操作,还可以做一些动态资源调度。这里要注意是 AdminGroup 里必须预留足够的资源给 DBA 使用。

 

资源组的实时监控包含很多视图,比如查看资源组上限制、查看资源组运行等待的作业数量、查看资源组对应的 CPU、内存实时使用的情况。我们还提供了一些管理资源组的操作,包括取消查询、资源组切换等功能。比如说 Query 在一个资源组上运行,如果这个 Query 一直处于等待状态,可以通过取消查询来终止这个 Query,如果这个 Query 由于分配的资源有限执行得很慢,可以切换到另外一个资源组上。

 

另外,通过资源组还可以动态配置每个资源组资源的配额,这样每天每个时间段负载不一样时,可以对这样的场景做很好的应对。银行等机构都会采用这种方式。


资源管理相关的研究,这里主要列举两种有关 HTAP 资源调度的研究方向。一篇论文是介绍怎么分配更多进程给 OTAP 和 OTLP。可以看到如果给 OLTP 分配数量多的话,这个 OLAP 颜色会越来越深,相当于它遇到更多的瓶颈。这种情况下更应该给 OLAP 分配更多资源,通过实时续监控来做一些自动的运维操作。

 

另一篇较新的研究是基于新鲜度驱动的调度。它是包含了 OLTP 和 OLAP 两种实例,可以做运行模式的切换。正常情况下是运行在模式 S2 的,它是比较新的一些数据。新鲜度是指 OLTP 和 OLAP 是两套不同的系统,最新的数据肯定在 OLTP,它需要把这些数据同步在 OLAP 做数据分析。新鲜程度足够高的话,相当于 CPU 分配给分析任务的配额就小了。如果新鲜度比较低,跟实时数据差异比较大,就需要分配更多的内存给同步进程。

 

总结

单独的 TP 和 AP 系统,资源利用率都不是很高。HTAP 系统可以同时处理 TP、AP 工作负载,但是对资源隔离提出了更高的要求,需要在资源合理隔离的基础上提高数据吞吐。HTAP 系统需要选择比较合适的资源隔离方案,合理分配、有效隔离,动态管理这些资源,避免资源之间的相互干扰,应对不同业务的需求。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论