TiDB 资源管控的对撞测试以及最佳实践架构

作者: GreenGuan 原文来源: https://tidb.net/blog/bc405c21

引言

TiDB 是一个存算分离的架构,资源管控对这种分离的架构来说实现确实有非常大的难度,TiDB 从 7.1 版本开始引入资源管控的概念,在社区也有不少伙伴测试,测试结果大部分在 RU 的隔离上得到了验证,资源管控在业务上带来的价值是利用提高用户密度的方式来降低成本,同时还可以通过资源管控的方式抑制不同类型的业务来避免集群抖动,但是随着我们业务在不断发展,用户在增加,集群的资源也在变化(缩容,扩容),在这种动态发展的模式下,如何评估我们的 TiDB 动态容量,以及什么架构才能发挥资源管控的最大能力是本文讨论的点,本文会从业务的角度作为切入点来反向观察集群的状态。

资源管控验证目标

  1. OLTP vs OLTP 是否存在相互影响情况,包括 业务层(TPS、QPS、duration)
  2. OLTP vs OLAP 是否存在相互影响情况,包括 业务层(TPS、QPS、duration)
  3. OLAP vs OLAP 是否存在相互影响情况,包括 业务层(TPS、QPS、duration)

环境介绍

最小化部署 3pd,3tidb,3tikv

TiDB 节点:为了公平 pd 和 tidb 为混合部署,所有组件类如 Prometheus grafana alertmanager pd(L|UI)都放在一个 pd 机器上,让剩余的两个 tidb 的计算节点负载相同

TiKV 节点:单机多实例部署,每个实例在部署 tikv 时都做了资源隔离,这样做的意义在于当 tikv 节点跑满时,最多用到 16c

resource_control:    memory_limit: 150G    cpu_quota: 1600%

实验设计

TiDB 是存算分离的分布式数据库,多种不同类别的 SQL 难免会集中到一个 tidb 的计算节点上,而数据库中我们分为 OLTP 类业务和 OLAP 类业务,在这里我想说明下这两种业务的区别

OLTP 类的业务特点是短小的 SQL 语句,考验的是数据库处理高并发量的能力,常用的模拟工具有 sysbench,tpcc 等工具;

OLAP 类的业务特点是计算型的 SQL 语句,考验的是数据库优化器的能力,常用的模拟工具有 tpch 等工具;

综上所述,我们可以到如下集中测试的基本场景

压力来自相同的计算节点

image.png

压力来自不同的计算节点

image.png

再下来我们设计一下压测的样例,压测需要有如下的限制和数据

  1. 基于我们的验证目标(验证资源管控是否生效),那么无论是 tidb, tikv 的各种资源 (cpu,mem,network) 就不能打满,因为打满必定受到影响

  2. 得到基线数据,基线数据是指无负载情况下的 qps 和 p95 响应延时,为了后续做对比

  3. tidb 的资源管控组和用户为强绑定关系,我们为每个用户都单独设置一个资源组,也就是 1 对 1 的对应关系,这样可以让单租户把资源吃满

TiDB 租户和资源组对应关系

image.png

压测样例

压测编号 压测场景 压测样例 压测用户 备注
t1_s1vss2 oltp vs oltp 相同 tidb S1 vs S2
t1_s2vss1 oltp vs oltp 不同 tidb S1 vs S2
t2_s1vss3 oltp vs oltp 相同 tidb S1 vs S3
t2_s3vss1 oltp vs oltp 不同 tidb S1 vs S3
t3_s1bvss2 oltp vs oltp 相同 tidb S1(b) vs S2 b 的是超卖场景在我们的场景中采用 64 并发
t3_s2vss1b oltp vs oltp 不同 tidb S1(b) vs S2
t4_s1bvss3 oltp vs oltp 相同 tidb S1(b) vs S3
t4_s3vss1b oltp vs oltp 不同 tidb S1(b) vs S3
t5_s2vss3 oltp vs oltp 相同 tidb S2 vs S3
t5_s3vss2 oltp vs oltp 不同 tidb S2 vs S3
t6_s1vss4 oltp vs olap(Q16) 相同 tidb S1 vs S4
t6_s4vss1 oltp vs olap(Q16) 不同 tidb S1 vs S4
t7_s1vss5 oltp vs olap(Q16) 相同 tidb S1 vs S5
t7_s5vss1 oltp vs olap(Q16) 不同 tidb S1 vs S5
t8_s2vss4 oltp vs olap(Q16) 相同 tidb S2 vs S4
t8_s4vss2 oltp vs olap(Q16) 不同 tidb S2 vs S4
t9_s2vss5 oltp vs olap(Q16) 相同 tidb S2 vs S5
t9_s5vss2 oltp vs olap(Q16) 不同 tidb S2 vs S5
t10_s2vss6 oltp vs olap(Q16) 相同 tidb S2 vs S6
t10_s6vss2 oltp vs olap(Q16) 不同 tidb S2 vs S6
t11_s1bvss6 oltp vs olap(Q16) 相同 tidb S1(b) vs S6
t11_s6vss1b oltp vs olap(Q16) 不同 tidb S1(b) vs S6
t12_s4vsS6 olap vs olap (Q16) 相同 tidb S4 vs S6
t12_s6vsS4 olap vs olap (Q16) 不同 tidb S4 vs S6
t13_s4vsS6 olap vs olap (Q11) 相同 tidb S4 vs S6
t13_s6vsS4 olap vs olap (Q11) 不同 tidb S4 vs S6
t14_s4vsS6 olap vs olap (Q7) 相同 tidb S4 vs S6
t15_s6vsS4 olap vs olap (Q7) 不同 tidb S4 vs S6
t12_s4vsS6_f olap vs olap (Q16) 相同 tidb S4 vs S6 f 的是加入了 tiflash
t12_s6vsS4_f olap vs olap (Q16) 不同 tidb S4 vs S6
t13_s4vsS6_f olap vs olap (Q11) 相同 tidb S4 vs S6
t13_s6vsS4_f olap vs olap (Q11) 不同 tidb S4 vs S6
t14_s4vsS6_f olap vs olap (Q7) 相同 tidb S4 vs S6
t15_s6vsS4_f olap vs olap (Q7) 不同 tidb S4 vs S6

枯燥的压测过程和数据见压测过程章节,如果想省时间直接看结论,当然压测过程章节也会有一些解读

实验结论

  1. OLTP vs OLTP:

    1. RU 管控方面,相同资源管控组的不同用户,在同时执行 SQL 时,不会超出资源管控所设置的最大 RU 值(超卖参数除外)
    2. 不同资源管控组的不同用户,在不同的 TiDB 计算节点上的 QPS 基本持平(有时还会超出基线数据),P95 相同
    3. 不同资源管控组的不同用户,在相同的 TiDB 计算节点上会有相互影响的情况,大约会有 8% ~ 10% 的影响
    4. 关于资源组的优先级,经测试不同资源管控组的优先级几乎没有差别( T5 场景);
    5. 如果两个不同的资源组运行在不同的计算节点则没有影响(最佳实践)
  2. OLTP vs OLAP:

    1. 当 OLTP 平稳运行时遭遇 OLAP 业务会产生抖动,具体抖动延时需要看 OLAP 业务的 SQL 语句造成的影响
    2. 当 OLTP 和 OLAP 在相同计算节点上执行时,P95 会有 8% 的下降,总体可以接受
    3. 当 OLTP 和 OLAP 在相同计算节点上执行时,并且分配给 OLAP 业务的 RU 较少(一般为 OLAP 业务的 1/5 ),P95 会有 20% 的下降
    4. 当 OLTP 和 OLAP 在相同计算节点上执行时,OLAP 业务表现会有 20% 左右的衰减(不过感觉 AP 类业务多个几秒钟无所谓)
    5. 如果 AP 和 TP 类 SQL 分别运行在不同的 TiDB 计算节点上时,则影响最小(既做 AP 类资源限制又在计算层做资源隔离为最佳实践)
  3. OLAP vs OLAP:

    1. 当 OLAP 和 OLAP 在相同计算节点上执行时,查询效率会有下降(实测中发现过原来 300s 跑出的语句,时间翻倍)
    2. 从返回结果看 OLAP 的资源优先级在实测过程中 medium 和 low 的差别不大
    3. 加入 TiFlash  后,OLAP 的 SQL 语句在相同与不同的计算同时执行时,耗时相差不大
    4. 运维方面的问题:不确定SQL 语句在 TiFlash 中占用了多少 RU
    5. OLAP 的业务在不同的计算节点上的效率最高

最佳实践架构

image.png

这个 TiDB 架构应该是我理解的最佳实践了,从实验数据我们可以看到,即使我们开启了资源管控,两种不同业务类型同时请求同一个计算节点时,对其他的用户也是有一些抖动的,而从运维层面来说,要么降低租户的 RU,要么在计算节点进行隔离,从架构的角度出发,计算资源用 VIP 隔离开来,来达到专机专用的目的,存储节点通过 RU 来进行限制 IO,两层保护对稳定性有正向收益

实验过程

基线数据

用户 32 64
S1  单独 12496.5 23012.84
S2  单独 12126.05 16500.92
S3  单独 12754.42 16514.15

OLTP vs OLTP

实验场景 t1_s1vss2、t1_s2vss1

image.png

image.png

S2 QPS 的基线确是很奇怪,在进行基线压测的时候不确定集群发生了什么,导致基线 S2 用户的基线数据较低,不过不影响结论

image.png

image.png

延时越小越好

实验场景 t2_s1vss3、t2_s3vss1

image.png

image.png

image.png

image.png

实验场景 t3_s1bvss2、t3_s2vss1b

1.png

可以看到超卖参数生效了 S1 在的 RU 在 50000,QPS 应该在 15000 ~ 16000,但是在 64 并发下来到了 20000+

image.png

在 S1 超卖的场景下,S2 在同一个 TiDB 计算节点上收到的影响比较严重大约有 12% 的影响

image.png

image.png

实验场景 t4_s1bvss3、t4_s3vss1b

image.png

image.png

S3 用户的优先级是 low 与 S2 用户 medium 相比,他们的 QPS 并没有差多少,S1 用户已经超卖了,讲道理应该优先保证 S1 用户的资源使用,这里难道是资源没有打满吗?

image.png

image.png

实验场景 t5_s2vss3、t5_s3vss2

image.png

image.png

image.png

image.png

符合预期,因为在同一个 tidb 节点上会有相互影响的情况

OLTP vs OLAP

实验场景 t6_s1vss4、t6_s4vss1、t7_s1vss5、t7_s5vss1

说明:S4 和 S5 的区别为:S4 RU 25000;S5 RU 800

image.png

由上图可以观察到,最糟糕的情况就是 TP 业务和 AP 业务同时在一个计算节点上,延时几乎翻倍(当然也要看是什么类型的 SQL),其次是相同 TIDB 下的对 AP 业务进行 RU 限制,总体来说响应延时增加了 25%,接下来就是两个不同 TIDB 的不做限制(黄)和做限制(浅蓝),抖动可忽略不计

实验场景 t8_s2vss4、t8_s4vss2、t9_s2vss5、t9_s5vss2

1.png

S1 和 S2 的图形基本相似

实验场景 t10_s2vss6、t10_s6vss2

说明:S6 的优先级为 Low

image.png

当初我还以为 low 的优先级不会影响 medium 的优先级,但是从图形来看并不是这样的

实验场景 t11_s1bvss6、t11_s6vss1b

说明:S1b 代表 S1 用户会突破自己的 RU 50000,采用 64 并发压测

image.png

和上图基本相似

OLTP vs OLAP 的测试中,如果我们调转视角,从 OLAP 的角度,看 OLTP 是否影响了 OLAP 的响应时间,直接说结论(这里就不放图了),经过测试,影响的因素有两个,第一、是否在同一个 TiDB 上运行(差几秒 AP 类业务可忽略);第二、看 RU 设置的多少,其中第二为主要影响的因素。

OLAP vs OLAP

实验场景 t12_s4vsS6、t12_s6vsS4、t13_s4vsS6、t13_s6vsS4、t14_s4vsS6、t15_s6vsS4

说明:S4 和 S6 RU 都一样,只有优先级不一样,S4 是 medium,S6 是 low

image.png

image.png

从优先级角度来说,返回速度不到明显的差异,还有 S6 视角有两个 0 ,出现在 Q11 和 Q7,这次都没有出结果,Q11的报错:Exceeded resource group quota limitation ,Q7 的报错 Query execution was interrupted,不确定这两个没有出结果的测试是否和 S6 用户的 low 有关,顺带说一句 Q11 和 Q7 这两个大 SQL,把没有 tiflash 的集群的 tidb 网卡直接跑满了,这肯定会影响其他业务的,可见资源管控对网卡的控制(或者说 RU 的计算)有待加强。

实验场景 t12_s4vsS6_f、t12_s6vsS4_f、t13_s4vsS6_f、t13_s6vsS4_f、t14_s4vsS6_f、t15_s6vsS4_f

image.png

image.png

好消息是把 AP 的表加入到 TiFlash 中没有出现 SQL 无法跑出结果的情况,大部分 SQL 的结果大致相似,在运维层面,这几个 SQL 明显是走了 TiFLash 的,但是在 grafana 监控中,只有 RU(max)的监控有 SQL 资源组的消耗情况,RU 并没有,希望补充一下

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

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

相关文章

STM32实现独立看门狗和窗口看门狗

文章目录 1. WDG 2. IWDG独立看门狗 2.1 main.c 3. WWDG窗口看门狗 3.1 main.c 1. WDG 对于WDG看门狗的详细解析可以看下面这篇文章: STM32单片机WDG看门狗详解-CSDN博客 看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原…

论文速递 | Management Science 4月文章合集(下)

编者按 在本系列文章中,我们梳理了运筹学顶刊Management Science在2024年4月份发布有关OR/OM以及相关应用的13篇文章的基本信息,旨在帮助读者快速洞察领域新动态。本文为第二部分(2/2)。 推荐文章1 ● 题目:Social Le…

模拟面试之外卖点单系统(高频面试题目mark)

今天跟大家分享一个大家简历中常见的项目-《外卖点单系统》,这是一个很经典的项目,有很多可以考察的知识点和技能点,但大多数同学都是学期项目,没有实际落地,对面试问题准备不充分,回答时抓不到重点&#x…

SpringBoot中使用MQTT实现消息的订阅和发布

SpringBoot中使用MQTT实现消息的订阅和发布 背景 java框架SpringBoot通过mQTT通信 控制物联网设备 还是直接上代码 第一步依赖&#xff1a; <!--mqtt相关依赖--><dependency><groupId>org.springframework.integration</groupId><artifactId>s…

百度百科词条创建的前提条件

随着互联网的发展&#xff0c;人们获取信息越来越依赖于搜索引擎&#xff0c;而百度百科作为百度搜索的核心产品在百度中一般能够稳居首位&#xff0c;而且百科词条具有权威性&#xff0c;可信度比较高&#xff0c;非常适用于企业和人物的形象宣传。 最近&#xff0c;小马识途营…

JS-数组扁平化方法合集(递归,while循环,flat)

前言 数组扁平化也是面试常考题之一&#xff0c;今天就和大家简单分享一下常见的数组扁平方法。这题其实主要考察的是递归思想&#xff0c;因为当数组里面嵌套非常多层数组的时候只能通过循环递归来进行扁平。本次分享主要也是分享本题的递归思想。话不多说&#xff0c;开始分…

基于Spring Boot构建淘客返利平台

基于Spring Boot构建淘客返利平台 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将讨论如何基于Spring Boot构建一个淘客返利平台。 淘客返利平台通过…

计算机网络地址划分A-E(自学)

1、网络地址组成 &#xff08;1&#xff09;物理地址MAC&#xff08;Media Access Control Address&#xff09; 网卡生产商分配&#xff0c;全球唯一&#xff0c;48/64位二进制 &#xff08;2&#xff09;逻辑地址IP(Internet Protocol) 网络层地址&#xff0c;用于在不同网…

Handling `nil` Values in `NSDictionary` in Objective-C

Handling nil Values in NSDictionary in Objective-C When working with Objective-C, particularly when dealing with data returned from a server, it’s crucial (至关重要的) to handle nil values appropriately (适当地) to prevent unexpected crashes. Here, we ex…

VBA递归过程快速组合数据

实例需求&#xff1a;数据表包含的列数不固定&#xff0c;有的列&#xff08;数量和位置不固定&#xff09;包含组合数据&#xff0c;例如C2单元格为D,P&#xff0c;说明Unit Config有两种分别为D和P&#xff0c;如下图所示。 现在需要将所有的组合罗列出来&#xff0c;如下所示…

git上传本地项目及更新项目

1、注册GitHub账号和下载git 2、在GitHub上新建一个仓库&#xff0c;点击号——>New repository&#xff0c;给仓库起一个名字&#xff0c;点击Create repository 3、进入要上传的项目中&#xff0c;右键点击git back here&#xff0c;命令行输入git init初始化&#xff0c…

19、复杂链表的复制?、 二叉搜索树与双向链表

题目&#xff1a; 复杂链表的复制&#xff1f; 描述&#xff1a; 输入一个复杂链表&#xff08;每个节点中有节点值&#xff0c;以及两个指针&#xff0c;一个指向下一个节点&#xff0c; 另一个特殊指针指向任意一个节点&#xff09;&#xff0c;返回结果为复制后复杂链表的h…

全球电力电子测试方案专业提供商「艾诺仪器」×企企通召开项目启动会,推进企业采购数智化升级

导读 供应链管理已成为企业的核心竞争力之一&#xff0c;为应对快速变化的市场环境&#xff0c;艾诺仪器亟需强化采购管理和供应链协同的竞争力。SRM涉及到各事业部、各所属企业等多个层面&#xff0c;希望通过双方优势资源的整合&#xff0c;打造高效协同、科学智能的数字化采…

第十三站:Java蓝宝石——云计算的浩瀚天空

Java作为一门成熟且广泛使用的编程语言&#xff0c;在云计算领域扮演着重要的角色。以下是对Java在云计算领域应用的详细讲解&#xff1a; 云服务提供商的Java SDK: Amazon Web Services (AWS): 提供了AWS SDK for Java&#xff0c;允许开发者在Java应用程序中轻松集成AWS服务&…

数据挖掘概览

数据挖掘(Data Mining)就是从大量的,不完全的,有噪声的,模糊的,随机的实际应用数据中,提取隐含在其中的,人们事先不知道的,但又是潜在有用的信息和知识的过程. 预测性数据挖掘 分类 定义&#xff1a;分类就是把一些新的数据项映射到给定类别中的某一个类别 分类流程&#x…

深入理解Java集合框架:使用与实现

深入理解Java集合框架:使用与实现 引言 集合框架是Java语言的重要组成部分,提供了用于存储和操作数据的各种集合类和接口。无论是数组、列表、集合还是映射,Java集合框架都为开发者提供了丰富的工具和灵活的解决方案。在本篇文章中,我们将深入探讨Java集合框架的基本概念…

Python | Leetcode Python题解之第189题轮转数组

题目&#xff1a; 题解&#xff1a; def reverse(nums: List[int], left, right) -> None:i, j left, rightwhile i < j:nums[i], nums[j] nums[j], nums[i]i1j-1 class Solution:def rotate(self, nums: List[int], k: int) -> None:n len(nums)k % nreverse(num…

Midway + TypeORM项目部署到BT后启动失败,MySQL报错

Midway TypeORM项目部署到BT后启动失败&#xff0c;MySQL报错 前沿 您需要先了解这篇文章&#xff1a;https://blog.csdn.net/weixin_45687201/article/details/139336111 错误日志 服务状态开启后就失败项目日志&#xff0c;输出 \> my-midway-project1.0.0 start \&…

python练习题—传染问题(治愈)

传染(infect)某种传染病第一天只有一个患者&#xff0c;前五天为潜伏期&#xff0c;不发作也不会传染人第6天开始发作&#xff0c;从发作到治愈需要5天时间&#xff0c;期间每天传3个人 求第N天共有多少患者 思路&#xff1a; 开始时认为可以进行判断五天或者五天十天后进行计算…

[modern c++][11] 非类型模板参数

前言&#xff1a; 我们再使用 std::get 的时候发现其模板并不是一个类型&#xff0c;而是一个整数值&#xff0c;用来标识从某个位置获取值&#xff0c;比如 std::pair 类型的数据 tmppair&#xff0c;那么就可以通过 std::get<0>(tmppair)来获取key的值&#xff0c;通过…