TiDB 多租户方案和原理

news2024/12/23 10:39:22

作者: li_zhenhuan 原文来源: https://tidb.net/blog/a55c1d14

使用多租户

有很多文章介绍技术上如何使用多租户,在这里简单说明:

CREATE RESOURCE GROUP rg_oltp RU_PER_SEC=4000;

ALTER USER app1 RESOURCE GROUP "rg_oltp";

如上面 SQL 显示,业务1使用 app1 连接到 TiDB 之后可以控制业务1最多只使用 4000 RU 的负载,实现资源隔离。资源控制效果有很多文章已经有说明此处不再赘述。

多租户方案

使用 TiDB 多租户技术完成多业务系统使用统一 TiDB 集群,确保不同业务负载隔离,再利用 TiFlash 的 实时 HTAP 能力,实现跨业务数据关联查询,方案架构图如下:

  • 根据多个业务负载分别设置不同资源组和 RU(Request Unit),当 TiDB 整体资源繁忙时实现不同业务基于 RU 限流和负载隔离;
  • 为错峰且重要业务设置资源组 BURSTABLE 属性,实现跨业务错峰资源借用;
  • 设置重要业务优先级为 HIGH,确保集群优先保证重要业务资源可用;
  • 使用 TiFlash 完成跨业务统一视图和实时数据分析需求;

方案优势

  • 节约硬件成本

    • MySQL 主从架构从节点利用率低,TiDB 多活架构所有节点平等且资源利用率高;
    • 当 TiDB 统一资源池资源不够时可以随时在线扩展,无需为业务预留太多闲置资源,提升整体资源利用率;
    • 借助多租户 BURSTABLE 特性,实现不同业务资源借用,进一步提升整体资源利用率。
  • 降低开发和运维成本

    • TiDB对应用透明无侵入,可降低开发成本,缩短业务上线周期。从管理多套 MySQL 到管理一套 TiDB 集群,大幅降低了数据库运维成本。
  • 解决数据孤岛问题

    • 使用 TiFlash 支持跨业务强一致性数据查询,支持统一视图、实时数据分析、实时风控等业务。

评估业务 RU

根据 RU 的计算公式可以看到读取 RU 权重为 1/64,写入权重为 1 ,这是因为写入数据还需要进行多副本复制并且开启事务提交事务等操作,此过程涉及到更多资源开销。因此对于不同的业务读写占比差异大时会导致集群总 RU 评估差异巨大。

image.png

以云上标准 8C/64G TiKV * 3 的集群为例,使用 oltp_read_only 方式评估 RU 为1.4W,oltp_read_write 方式评估 RU 为2.9W,oltp_write_only 方式评估 RU 为 7.3W。不同负载的瓶颈点不同,消耗各模块的资源比例也不一样 。但是这个差异给用户带来 RU 评估的困惑,某个业务读写流量占比存在差异,无法直接参考Sysbench测试得到真实 RU 资源,在无法运行实际负载的时候,可以作为一个初始设置,之后再观察调整。具体方式如下:

给各个业务分配不同的用户,绑定不同的 Resource Group 并且设置 BURSTABLE 属性,业务跑一两天之后在观察 DashBroad 上业务真实 RU 消耗情况,比如业务1 这一两天峰值消耗最大的 RU 为 1000,则修改业务1 对应 Resource Group RU 为 1300 并且删除 BURSTABLE 属性,完成业务1资源评估和控制。建议只给集群中最重要且错峰的1-2个业务设置 BURTABLE 属性,保证重要业务资源借用。不建议给不重要的业务设置 BURTABLE 属性,以免不重要业务出现异常流量时超限额使用集群资源。

image.png

                                                                通过 DashBroad 观察业务 RU 消耗情况

补充:如果单机多实例部署 TiKV 需要使用 NUMA 或者 cgroup 等方式给每个实例加上资源限制,否则通过CALIBRATE RESOURCE资源评估时会返回过大的 RU 评估结果。

小结:读写RU权重不同,无法事前准确评估,先上业务观察 RU 消耗,再配置 RU 大小。

QoS 资源控制逻辑

TiDB 多租户使用 QoS(服务质量满足) 实现负载隔离,当周期资源用量超过 RU 限制时触发限流,具体限流逻辑如下:

假设业务1对应资源组 RU 为10,业务1执行查询语句 SQL1 生成执行计算之后有三次 RPC 请求 TiKV 。

第一次 RPC :假设请求 4 个 TiKV Region,参考之前 RU 计算公式,此时消耗 RU 为 4 * 0.25 = 1个 RU,这 4 个请求消耗了3ms CPU 并且读取了 64 KB 数据,TiKV 处理完这 4 个请求之后会将资源消耗信息返回给 TiDB ,TiDB 计算出此次消耗 RU 为 1 + 3*1/3 + 64*1/64 = 3 个 RU。

第二次 RPC:因为第一次 RPC 消耗了 3 个 RU 业务真实 RU 为 10,此时还有 RU 余量,可以直接继续第二次 RPC ,假设第二次 RPC 消耗了 20 个 RU ,因为 RU 是 TiKV 消耗 Response 之后 TiDB 事后统计,因此会存在突发超过 RU 限制的情况。

第三次 RPC:因为前面两次 RPC 累积消耗了 23 个 RU,已经超过业务 10 RU 资源限制,会形成负债并触发限流。第三次 RPC 会先等待 1.3 秒左右等待将 RU 负债还清再开始将 RPC 请求发送给 TiKV 。进而实现负载隔离。

Bad SQL 限流

基于 RU 和 SQL Binding 可以实现 Bad SQL 限流,假设集群忽然出现一个新的全表扫描 SQL 消耗大量资源,此时可以通过 SQL binding 将此 SQL 绑定到 RU 为 1 的 Resource Group 进而实现限流。具体操作如下:

创建 RU 为 1 Resource Group:

create resource group small_rg1 PER_RU_SEC=1;

为 Bad SQL 创建 SQL Binding :

create GLOBAL binding for select count(1) from big_table using select /*+ RESOURCE_GROUP(small_rg1) */ count(1) from big_table

观察限流效果:

Ud3HiZZUTa.jpg

可以发现此 Bad SQL 无法再次运行,实现了 SQL 禁用。

上面三次 RPC 分析时超过资源限制时可以通过等待一定时间周期来低速运行,但是为什么此时 Bad SQL 不是慢运行而是直接报错呢?因为 TiDB 多租户有负债上限,为了避免负债累计过多造成请求大量积压,当负债达到一定规模时,TiDB 就不再接收新的请求,当前版本是 30倍 RU 限额。 在这个case里,等待约 30 秒。

总结

为多个业务分别绑定不同 Resource Group,观察真实消耗情况,再基于真实消耗预留一定 Buffer ,只为重要且真实错峰的业务设置 BURSTABLE 属性,实现 TiDB 资源池化。

此时可以将 TiDB 当做一个资源池,不断将中小业务迁移到 TiDB ,资源不够时再单独添加 TiDB 或 TiKV 资源。

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

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

相关文章

java——Collection、Map 深度理解

Collection <类型>&#x1f349; List(Conllection的实现类) 可以重复&#xff0c;有顺序 可存放多个null值&#x1f95d; ArrayList 主选 &#x1f353; 结构&#xff1a;数组 特点&#xff1a;查找快&#xff0c;增删慢 线程不安全&#xff0c;效率高 Vector&#…

第十三章 原理篇:SWIN-transformer

累了&#xff0c;没写完 面试完了再来写 参考教程&#xff1a; swin-transformer/model.py 文章目录 概述transformer blockswindow_partionW-MSAwindow-reversePatch Merging 概述 在前面介绍了vision transformer的原理&#xff0c;加入transformer的结构后&#xff0c;这种…

HCIP(HCIA回顾)

OSI/RM 七层 应用层 表示层 会话层 传输层 区分不同的流量&#xff0c;定义传输方式。 端口号由16位二进制构成&#xff0c;范围为0~65535(其中0不作为传输层的端口使用)&#xff0c;所以真实取值范围为1~65535&#xff1b;其中&#xff0c;1~1023称为知名端口号。 1、可靠…

React Native 集成到iOS原有的项目上

1.官方说明地址&#xff1a; 集成到现有原生应用 2. 主要步骤说明 把 React Native 组件集成到 iOS 应用中有如下几个主要步骤&#xff1a; 配置好 React Native 依赖和项目结构。了解你要集成的 React Native 组件。使用 CocoaPods&#xff0c;把这些组件以依赖的形式加入到项…

【推式子 二项式定理】Wannafly挑战赛 B

B-求值2_Wannafly挑战赛17 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn2e610; const int mxe2e510; const int Inf0x3f3f3f3f; const int mod998244353;int N;…

碳排放预测模型 | Python实现基于RF随机森林的碳排放预测模型

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于RF随机森林的碳排放预测模型 研究内容 碳排放被认为是全球变暖的最主要原因之一。 该项目旨在提供各国碳排放未来趋势的概述以及未来十年的全球趋势预测。 其方法是分析这…

sql统计某一字段不同状态的数量,时间戳转日期格式、按月统计使用

背景 1、在sql语句中统计一个字段的不同状态时&#xff0c;需要将每个状态的数量查出来&#xff0c;在进行统一输出&#xff0c;涉及表多次查询&#xff0c;下面用一个聚合函数的方式进行查询&#xff0c;比较方便&#xff0c;容易理解。 2、有时候数据表中的时间字段存储的是…

谈高考志愿填报

目录 不如先说说我自己。 一、选专业还是选学校&#xff1a; 二、你想推荐/避雷的专业&#xff1a; 三、填报志愿的策略&#xff1a; 四、影响专业选择的因素&#xff1a; 各省高考成绩已出&#xff0c;又到一年高考季。张雪峰提到&#xff1a;“普通家庭不要光谈理想&…

OpenCV实战(27)——追踪视频中的特征点

OpenCV实战&#xff08;27&#xff09;——追踪视频中的特征点 0. 前言1. 追踪视频中的特征点2. 特征点追踪原理3. 完整代码小结系列链接 0. 前言 我们已经知道可以通过一些最独特的点来分析图像&#xff0c;对于图像序列同样如此&#xff0c;其中一些特征点的运动可用于了解捕…

机器视觉之表面缺陷检测

曾有一个科研项目&#xff0c;青岛啤酒厂委托&#xff0c;研究啤酒瓶的质量检测。 一般这种玻璃瓶会有一定次品、不良品&#xff0c;特征是&#xff0c;内部细细的裂缝纹路长度长于一定限制&#xff0c;那么这种啤酒瓶在运输或者开瓶盖的过程中就有炸裂的风险。 所以&#xf…

【实证分析】地区竞争、推广数字普惠金融与绿色经济效率

研究内容 基于考虑非期望产出的 Super-SBM 模型测算了 2011—2018 年中国 265 个地级市的绿色经济效率,综合运用面板模型、空间杜宾模型,系统分析了地区竞争下推广数字普惠金融对绿色经济效率的影响效应。研究发现:(1)绿色经济效率存在显著正向空间溢出效应,地理距离与经济差异…

mysql数据(添加,修改,删除,单表查询)操作

插入&#xff1a; 主键自增&#xff08;第一列&#xff09;&#xff0c;可以写null&#xff0c;自动生成 最后一列是空值null&#xff0c;即不给分配 如果设置了默认值&#xff0c;如性别设置了默认值男&#xff0c;就可以写default 1、 查询起别名&#xff0c;如果别名有特…

操作数据库DDL、DML

DDL 1、创建表 create table tb_user(id int,username varchar(20),password varchar(10) ) 2、数据类型 3、删除表 drop table 表名 4、修改表 修改表名 alter table 表名 rename to 新表名 添加一列 alter table 表名 add 列名 数据类型修改数据类型 …

Vue中watch与computed区别

<body><div id"root">姓&#xff1a;<input type"text" v-model"firstName"><br/><br/>名&#xff1a;<input type"text" v-model"lastName"><br/><br/>全名&#xff1a;&…

virtio-net前端-virtqueue

文章目录 1.概述2.数据结构3. 流程分析3.1 virtio总线创建3.3virtio-net3.3.1virtio-net初始化![在这里插入图片描述](https://img-blog.csdnimg.cn/7246c1705ac24f88b75fad63f8941ca5.png)3.3.2 virtio-net驱动发送3.3.3 Qemu virtio-net设备接收 4.virtqueue4.1数据结构4.2发…

模糊测试Fuzzing基础知识学习笔记

概念 模糊测试&#xff08;Fuzzing&#xff09;&#xff0c;是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。在模糊测试中&#xff0c;用随机坏数据&#xff08;也称做 fuzz&#xff09;攻击一个程序&#xff0c;然后观察哪里遭到了破坏。 模糊测试…

6.Mysql自连接

针对相同的表进行的连接被称为“自连接”&#xff08;self join&#xff09; 那么为什么要把相同的一张表连接起来呢&#xff1f;一开始还是挺难理解的。把它想象成连接两张不同的表&#xff0c;这样容易理解一些。事实上&#xff0c;自连接还是有很多用处的 1. 在同一张表内进…

模板初识与STL简介

初识模板 引言函数模板定义实例化隐式实例化显式实例化 类模板定义实例化 STL简介STL六大组件 总结 引言 模板是泛型编程的基础 在之前我们介绍过函数重载&#xff0c;可以定义许多函数名相同参数列表不同的重载函数&#xff0c;来实现不同类型的相似操作。调用重载函数时会根…

chatgpt赋能python:归一化在PyTorch中的运用

归一化在PyTorch中的运用 PyTorch是一种广泛使用的深度学习框架&#xff0c;它可以用于训练和预测各种类型的神经网络。在深度学习中&#xff0c;归一化是提高模型性能的一种常用技术。归一化是指将输入数据进行标准化或规范化处理&#xff0c;以确保数据的统一性和一致性。在…

golang硬核技术(二)go程序从启动到运行到底经历了啥

前言 go相对其他语言&#xff0c;对并发的支持更友好。这使得他的设计和其他程序迥然不同。让我们来看看它都是如何初始化程序的&#xff0c;从程序加载到运行到底经历的什么。 我们继续之前的版本1.18.4 汇编入口 首先我们编译一个hello world 程序。 package main impor…