OceanBase 如何实现多层面的资源隔离

news2024/11/25 10:50:40

OceanBase的资源隔离涵盖了多个方面,如物理机器间的隔离、不同租户之间的隔离、同一租户内的隔离,以及针对大型查询请求的隔离等。在实际应用OceanBase的过程中,我们经常会遇到这些操作场景或产生相关需求。这篇文章针对这些内容进行了简要的梳理与汇总,有需要的朋友们可以通过以下内容进行初步的了解。

物理机器隔离

每个租户可以通过使用不同的服务器,来保证资源层面完全不会有任何影响。默认情况下,如果每个ZONE 有多个OBServer,那么OB会根据租户UNIT的资源配置将其均分到多个OBServer内,当然这个过程对于使用者来说是透明的,无需关注。

但是如果想要自定义UNIT到对应的节点上,也就是不同租户占用不同的机器,那么就需要关闭OB本身的均衡和迁移能力,比如关闭 enable_rebalance 和 enable_transfer,然后通过 ALTER SYSTEM MIGRATE UNIT 手动迁移UNIT 到想要的节点上,通过 ALTER SYSTEM TRANSFER PARTITION 语句用于将指定分区的迁移至指定的日志流。

这种方式可以按照自己需求来自定义分配,但是除非对OB有非常强的掌控力,否则不建议这个操作。因为这样操作以后,OB本身的负载均衡和迁移能力将不会再发挥作用。

租户隔离

租户隔离分为租户间的隔离和租户内的隔离。

租户间主要是通过指定UNIT配置,给到这个租户对应的资源大小以及权重,然后OB 会根据配置调度整个实例的资源给到不同的租户。租户内的隔离主要分为用户资源隔离和SQL资源隔离,通过配置用户和SQL的资源来对租户内的资源进行分配及隔离。

租户间资源隔离

咱们熟知的物理资源一般可以分为两类:一类是弹性资源,比如CPU,磁盘带宽等;另一类是刚性资源,比如内存,磁盘空间等。弹性资源是可以抢占的,刚性资源一旦被占用,除非占有者主动释放,否则是无法抢占的。

租户间资源隔离包含了弹性资源以及刚性资源,比如CPU、IOPS以及内存与磁盘空间,通过UNIT划分控制。

CPU隔离

CPU的隔离通过UNIT CONFIG中的MIN_CPU和MAX_CPU来配置,可以通过配置最小占用、最大占用以及可选择性的开启超卖来实现。

OB的CPU隔离主要有两种方式:基于线程数和基于Cgroup。

在了解CPU隔离之前,可以看一下这个文章,可能对这个内容会更容易理解:容器CPU(1):怎么限制容器的CPU使用?-CSDN博客

基于线程数的租户工作线程的 CPU 隔离

OBServer 最基础的CPU隔离是通过用户态调度,控制活跃线程数来实现的。每个租户有独立的线程池,线程池的规格是由租户规格和一些配置参数来决定的。

由于 SQL 执行过程中可能会有 IO 等待、锁等待等,所以一个线程无法用满一个物理 CPU,故在缺省配置下,OBServer 节点会给每个 CPU 启动 4 个线程,4 这个倍数可以通过配置 cpu_quota_concurrency 来控制。这就意味着如果一个 Unit 的 MAX_CPU 是 10,那么它能同时运行的活跃线程是 40,最大物理 CPU 的占用是 400%。

但是这种方式的隔离存在一些问题,就是只能限制线程数但是不能完全限制CPU使用率,因为每个线程对CPU的占用这个不可控,所以只能做软隔离。

基于 cgroup 的租户工作线程的 CPU 隔离

OBServer 也支持配置 cgroup 来实现 CPU 的隔离优化。cgroup 能对线程的 CPU 使用率进行精准的限制,达到租户之间 CPU 强隔离的效果。

observer
  ├── tenant1
  │   └── tasks
  │         ├── thread1
  │         ├── thread2
  │         └── ...
  ├── tenant2
  │   └── tasks
  │         ├── thread1
  │         ├── thread2
  │         └── ...
  └── other

开启 cgroup 后最大的变化是不同租户的工作线程放到不同的 cgroup 目录内,租户间的 CPU 隔离效果会更好。最后的隔离效果如下:

  • 如果一个 OBServer 上只有一个租户负载很高,其余租户比较空闲,那么这个负载高的租户的 CPU 也会受到 MAX_CPU 的限制。
  • 延续上面的场景,如果有多个空闲的租户的负载上升了,导致物理 CPU 不够了,cgroup 会按照权重分配时间片。

cgroup 方式可以做到硬隔离,因为可以严格控制每个租户的cpu使用率,所以可以更好的保证cpu之间相互不影响,尤其是在不超卖的情况下。4.2.x版本以后,通过OCP创建的集群,默认会使用cgroup做CPU隔离。

内存隔离

内存空间等资源属于刚性资源,因为这类资源的描述是标量,一块内存被 A 占用了,就不能再分配给 B 使用。所以对于内存隔离就不过多赘述了。

IOPS 隔离

OBServer 内所有的 IO 都是异步 IO,并且是绕过 OS 的 direct IO,磁盘带宽(IOPS)的隔离是通过控制 OBServer 提交异步 IO 的时间间隔来实现的。

OBServer 的 IO隔离没有借助cgroup,而是自研实现的,底层算法可以简单理解为多个租户共用一组io线程,所有租户都根据IO线程来分配资源以及执行租户IO队列中的IO请求,所以不同租户之间的IO请求正常情况下没有冲突,也能通过IO线程保证各个租户IOPS的使用量。

租户的IOPS受三个配置影响,MIN_IOPS、MAX_IOPS 和 IOPS_WEIGHT。

OBServer 内部会统一按照 16 KB 读的 IOPS 值作为有效值进行处理,所以建议MIN_IOPS和MAX_IOPS 根据当前磁盘计算出来的 16KB读对应的值来配置。MIN_IOPS总和建议不超过机器磁盘的IOPS,MAX_IOPS可以根据实际情况配置,可以超过。MAX_IOPS需要大于等于MIN_IOPS,如果没有指定具体的值,那么MIN_IOPS 和 MAX_IOPS 的值均为 INT64_MAX。

多租户之间的资源分配与抢占可以总结为一句话:闲时共享,忙时隔离。空闲带宽可以给有需求的租户或io类别共享,但忙碌时,需要按weight的比例隔离。

举个例子,如果磁盘IO的IOPS为10000,其中,

租户A,MIN_IOPS:4000,MAX_IOPS:8000

租户B,MIN_IOPS:6000,MAX_IOPS:10000

假设两个租户当前使用的IOPS都能达到设置的 MIN_IOPS的值,他们只会占用各自 MIN_IOPS 的 IOPS 大小,因为已经达到了磁盘本身IOPS的上限。如果租户 A 现在只用了2000,租户B是可以挤占的,比如用到8000的 IOPS。当租户A需要的时候,它会挤占回来,以满足MIN_IOPS的需求,并且这个优先级最高。

所以说,如果租户B需要的IOPS是1w,但是租户A至少也需要4000的IOPS,那么这个时候租户B是会受到影响的,因为当前场景下IO是不满足需求的,所以说对于IO也要提前做好规划,如果单台机器的IO满足不了需求可以通过扩容机器的方式来满足。

如果磁盘IO的IOPS为12000,那么剩余的这2000IOPS 租户AB需要使用的话如何分配则根据IOPS_WEIGHT来做权重。

验证磁盘 IO 隔离能力的实例

这里引用研发的文章实例可能更容易理解一些

原文链接:OceanBase 4.1解读:给用户足够灵活简单的IO隔离体验

为了验证磁盘 IO 隔离的能力,我们首先用单测做了一项仿真实验:我们设置 4 个租户,每个租户启动 64 个线程发送 IO 请求,IO 请求固定为 16KB 随机读,租户 1、2、4 的负载持续 20 秒,租户 3 的负载从第 10 秒开始,持续 10 秒。实验磁盘 IOPS 上限大概在 6w,如果不加限制,任意一个租户单独都可以打满磁盘。

首先验证租户间磁盘 IO 隔离,各租户的配置和实验结果如表 1 和图 1 所示:

  • 磁盘已经打满时,新加入的租户 3 依然拥有 1 万 IOPS,因为其通过 MIN_IOPS 预留了 1 万;
  • 租户 4 的 IOPS 没有超过 5 千,因为其通过 MAX_IOPS 设置了资源上限;
  • 无论负载如何变化,租户 1 和租户 2 的 IOPS 比值大概为 2:1,正如权重比例要求。

租户内隔离

租户内资源隔离通过DBMS_RESOURCE_MANAGER系统包的CREATE_PLAN_DIRECTIVE接口进行配置,会对资源使用组的CPU和IO资源进行限制

DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE (
    plan                      IN VARCHAR2, 
    group_or_subplan          IN VARCHAR2, 
    comment                   IN VARCHAR2 DEFAULT'', 
    mgmt_p1                   IN NUMBER   DEFAULT 100,
    utilization_limit         IN NUMBER   DEFAULT 100,
    MIN_IOPS                  IN NUMBER   DEFAULT 0,
    MAX_IOPS                  IN NUMBER   DEFAULT 100,
    WEIGHT_IOPS               IN NUMBER   DEFAULT 0,
);

其中,utilization_limit 表示CPU 资源使用比例上限。MIN_IOPS、MAX_IOPS和WEIGHT_IOPS用来配置管理IOPS。

目前支持配置租户内用户级和SQL 级的资源隔离,配置的方法可以参考官网:

配置用户级资源隔离:

OceanBase配置用户级资源隔离

配置SQL 级资源隔离:

OceanBase 配置 SQL 级资源隔离

大查询队列

除了上面提到的方式,其实OB还支持大查询队列。

默认情况下,如果TP业务请求的数据库,突然过来AP相关的请求,很有可能会影响到TP的业务甚至整个集群的访问,所以为了避免这类问题,OB提供了一个大查询队列,这个大查询队列默认情况下只会占用 30% 的CPU资源,大查询判断的条件默认为执行时间超过 5s。对于后面进来的大查询,如果在计划缓存中存在,并且预估执行时间超过5s,那么会直接判断它是大查询,然后放到大查询队列中。以此来避免问题SQL或者AP查询对TP业务的影响。

当然,如果当前集群内本身没有小查询,基本上都是大查询的时候,这个限制是不生效的,大查询可以用到全部的CPU资源。

相关参数:

large_query_threshold:用于设置查询执行时间的阈值,默认5s。

large_query_worker_percentage:用于设置预留给处理大查询的工作线程百分比,默认30%。

总结

OB的资源隔离还是涵盖了很多方面的,并且非常的灵活,可以更好的帮助我们管理集群、做业务优化等,在使用OB的过程中,可以按需使用OB的资源隔离能力来满足业务的需求。

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

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

相关文章

数据库系统原理实验报告5 | 数据查询

整理自博主本科《数据库系统原理》专业课自己完成的实验报告,以便各位学习数据库系统概论的小伙伴们参考、学习。 专业课本: ———— 本次实验使用到的图形化工具:Heidisql 目录 一、实验目的 二、实验内容 1.找出读者所在城市是“shangh…

垂起固定翼+多旋翼无人机+集群组网:高低空域协同组网通信技术详解

垂起固定翼、多旋翼无人机与自组网的结合,为高低空域协同组网通信技术提供了创新的解决方案。这种结合充分利用了各种技术的优势,使得无人机在高低空域中的协同作业和通信更加高效和灵活。 首先,垂起固定翼无人机以其垂直起降能力和长航时的…

第28章-PPPoE

1. 以太网接入的典型应用 1.1. IP技术的应用与发展 1.2. 以太网接入的典型应用场景之一——大型园区接入的典型应用 2. PPPoE技术的基本原理 2.1. 技术背景 2.2. PPPoE工作原理 2.3. PPPoE的两个阶段:Discovery阶段和PPPSession阶段 2.4. PPPoE的帧结构 2.5. PPPoE…

如何高效封装App?小猪APP分发平台一站式解决方案

在移动应用开发领域,App封装(App Packaging)是一个至关重要的环节,它不仅关乎应用的安全性,还直接影响到最终用户体验和市场推广策略。本文旨在通过实战指南,揭示如何高效完成App封装,并介绍如何…

python爬虫(二) 之 42号网汽车文章爬虫

python爬虫(二) 之 42号网汽车文章爬虫 今天在咸鱼上有个买家找我一个42号网汽车文章的爬虫,目前需求已经做完了,现在将这部分代码开源,供大家参考。爬虫能够抓取到网站上所有文章的数据,大概一小时左右就…

buuctf[pwn]

buuctf[PWN] 题目:rip(栈对齐) 知识点:栈对齐 题目地址:BUUCTF在线评测 (buuoj.cn)知识点:64位ubuntu18以上系统调用system函数时需要栈对齐,因为64位下的system函数有个movaps指令,这个指令要求内存地址…

​《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制德国每日风能和太阳能产量3D线图

在MATLAB中,要绘制3D线图,可以使用 plot3 函数。 在《MATLAB科研绘图与学术图表绘制从入门到精通》书中通过绘制德国每日风能和太阳能产量3D线图解释了如何在MATLAB中绘制3D线图。 购书地址:https://item.jd.com/14102657.html

读天才与算法:人脑与AI的数学思维笔记20_数学图灵测试

1. 数学图灵测试 1.1. 能不能将这种计算机证明语言翻译成易于与人交流的方式呢? 1.1.1. 剑桥大学的两位数学家蒂莫西高尔斯(Timothy Gowers)和莫汉加内萨林加姆(Mohan Ganesalingam)开展了此项研究 1.1.1.1. 他们决…

已解决SyntaxError: EOL while scanning string literal 亲测有效!!!

已解决SyntaxError: EOL while scanning string literal 亲测有效!!! 亲测有效 报错问题解决思路解决方法 报错问题 SyntaxError: EOL while scanning string literal 这个错误通常发生在Python代码中,表示字符串字面量没有被正确…

撸爆公众号流量主,简单无脑,单日变现2000+

详情介绍 目前公众号流量主的收益非常的好,不管你是小白还是老鸟,都能拿到一个很好的收益,轻轻松松日入2000,接下来我给大家带来一个保姆级的教学,大家跟着操作就可以了

360手机去除广告 360手机关闭弹窗广告 360手机刷机

360手机去除广告 360手机关闭弹窗广告 360手机刷机 360手机去广告 360手机刷机 360手机弹窗广告 永久去除360手机的各种广告教程 360手机禁止更新 360手机关闭广告 360手机去除内部广告 360手机资源网 360手机刷机资源下载链接:360rom.github.io 参考:…

C语言/数据结构——每日一题(链表的中间节点)

一.前言 今天我在LeetCode刷到了一道单链表题,想着和大家分享一下这道题:https://leetcode.cn/problems/middle-of-the-linked-list。废话不多说让我们开始今天的知识分享吧。 二.正文 1.1题目描述 1.2题目分析 这道题有一个非常简便的方法——快慢指…

xx学校(微信)挖掘

挖掘目标的部署在微信的资产(减少信息的收集,毕竟一般web站点没有账号密码不好进入后台,挖掘功能点少) 1. 寻找目标的微信小程序(非原图) 1. 招生小程序打不开,只能挖掘管理系统 进入后发现存在上报安全隐患功能,可以上传图片 1. 准备上传shell 发现控制上传名字参数为name,…

mysql数据库(排序与分页)

目录 一. 排序数据 1.1 排序规则 1.2 单列排序 1.我们也可以使用列的别名,给别名进行排序 2.列的别名只能在 ODER BY 中使用, 不能在WHERE中使用。 3.强调格式:WHERE 需要在 FROM 后, ORDER BY 之前 1.3 二级排序&…

【软考高项】三十三、质量管理

一、管理基础 质量定义 国际标准:反映实体满足主体明确和隐含需求的能力的特性总和。 国家标准:一组固有特性满足要求的程度。固有特性是指在某事或某物中本来就有的,尤其是那种永久的可区分的特征。 ➢ 对产品来说,例如…

【Windows】Windows电脑如何给hosts添加解析

前言 hosts是一个没有扩展名的系统文件,在浏览器输入一个我们想要登录的网站时,电脑系统会自动帮助我们在hosts文件中寻找对应的IP地址,然后打开网站,如果找不到对应IP,电脑就需要对域名和IP地址进行解析。当对一个网…

面向新手在无人机竞速场景下的飞行辅助系统——浙大 FAST-Lab 高飞团队 ICRA 论文三项 Best Paper 入围

恭喜浙江大学 FAST-Lab 钟宇航同学的论文 A Trajectory-based Flight Assistive System for Novice Pilots in Drone Racing Scenario 顺利发表 ICRA 2024,并同时入选三项 Finalist: the IEEE ICRA Best Conference Paper Awardthe IEEE ICRA Best Pape…

人工智能_大模型049_模型微调009_llama2模型训练_代码分析和实现_代码记录---人工智能工作笔记0184

以上是项目的整体结构,其中上一节我们看了chatglm3目录下,对chatglm3模型的训练部分的代码,然后 这里的llama2目录下是对llama2模型进行训练的代码. 然后web_demo目录是,对web浏览器中,使用chatglm3,以及llama2.py进行的封装下一节我们再看这个部分 E:\2024\人工智能\fine-tun…

c++函数返回指针和引用

写一个常量字符串复制函数 我们以为的方式 写不了,我们把指针指向了这个常量区,看似拥有了,其实不属于str 我们需要把常量字符拿出来,让指针指向栈区或者堆区 #include<iostream> using namespace std; int clen(const char* str) {int len 0;for (int i 0; str[i];…

车牌号识别系统:PyQT5+QT Designe+crnn/PaddleOCR+YOLO+OpenCV矫正算法。

PyQT5&QT Designecrnn/PaddleOCRYOLO传统OpenCV矫正算法。可视化的车牌识别系统项目。 车牌号识别系统 项目绪论1.项目展示2.视频展示3.整体思路 一、PyQT5 和 QT Designer1.简介2.安装3.使用 二、YOLO检测算法三、OpenCV矫正算法四、crnn/PaddleOCR字符识别算法五、QT界面…