当前位置: 首页 > news >正文

TiDB v7.1.0 跨业务系统多租户解决方案

本文介绍了 TiDB 数据库的资源管控技术,并通过业务测试验证了效果。资源管控技术旨在解决多业务共用一个集群时的资源隔离和负载问题,通过资源组概念,可以限制不同业务的计算和 I/O 资源,实现资源隔离和优先级调度,提高系统利用率和稳定性。

业务背景

随着业务对 TiDB 的使用不断扩大和深入,在多业务共用一个集群的情况下,相信不少用户也遇到过不同负载之间相互影响的问题。在之前的版本里,TiDB 也在尝试不同的方法来缓解或解决这类问题。比较典型的例子就是通过引入 TiFlash 列存组件,在存储引擎层面区分 TiKV 上的在线处理事务和在 TiFlash 上的分析型任务,在存储层物理隔离不同的负载。这种架构优化有很多的好处,但如果业务都是需要访问 TiKV 才能得到结果的场景,就没办法来处理。

我们线上十几个生产集群,考虑成本、运维等问题都是多业务共用一个集群,在我们尽可能将 TP 业务和 AP 业务分离部署的前提下,通常还是会遇到下面的问题:

● 当一个业务处于高峰期时,会过多占用别的业务使用的资源,进而影响别的业务正常运行。

○ 我们希望能保护不同业务的资源持有情况,保证业务能分配到基本的运行资源而不被挤兑。

● 当集群中的重要业务处于低谷值时,有较多的剩余资源,如果我们能把错峰的业务引进来就可以充分使用资源,可以降本增效。但这要求错峰运行的业务需要能得到控制,其他时候不会占用过多资源。

● 当集群遇到临时的问题 SQL 引发的性能问题时,只能停掉 S QL 。

○ 我们更希望不是干掉它的执行,而是临时限制它资源消耗,允许它缓慢运行,但又不会影响集群其他业务。

在这样的业务痛点背景下 TiDB v7.1.0 提出了资源管控技术,我们第一时间跟进该技术,并尝试探讨解决融合系统中多租户资源使用的隔离方案。

TiDB 资源管控技术

资源管控技术(Resource Control)可以在负载剧烈变化时保证服务质量,同时提供了数据库的多租户隔离能力,能够有效地降低数据库运行成本。

2.1 原理说明

TiDB 资源管控特性提供了两层资源管理能力,包括在 TiDB 层的流控能力和 TiKV 层的优先级调度的能力。将用户绑定到某个资源组后,TiDB 层会根据用户所绑定资源组设定的配额对用户的读写请求做流控,TiKV 层会根据配额映射的优先级来对请求做调度。通过流控和调度这两层控制,可以实现应用的资源隔离,满足服务质量 (QoS) 要求。

● TiDB 流控:TiDB 流控使用 令牌桶算法 ( https://en.wikipedia.org/wiki/Token_bucket )做流控。如果桶内令牌数不够,而且资源组没有指定 BURSTABLE 特性,属于该资源组的请求会等待令牌桶回填令牌并重试,重试可能会超时失败。

● TiKV 调度:可以为资源组设置绝对优先级 (PRIORITY),不同的资源按照 PRIORITY 的设置进行调度, PRIORITY 高的任务会被优先调度。如果没有设置 PRIORITY,TiKV 会将资源组的 RU_PER_SEC 取值映射成各自资源组读写请求的优先级,并基于各自的优先级在存储层使用优先级队列调度处理请求。

TiDB 资源管控技术利用资源组 (Resource Group) 将集群划分为多个逻辑单元,每个资源组都能限制其所需的计算和 I/O 资源。当集群有空闲资源时,通过特定设置可以允许一部分资源组超越其限制,充分利用集群资源。它基本上解决了在多种业务合并后,造成资源争抢的问题,保证了业务的稳定性。如下是该技术的一个概念图:

Resource Control 是基于 TiDB 的流控和 TiKV 的调度功能来完成的。同时 BURSTABLE 功能允许其超过资源组的约束配额,使其可以保证服务正常运行。

2.2 管理方式

资源管控引入了资源组(Resource Group)的概念,通过设置“用户”和“资源组” 的对应关系,把会话与用户组进行绑定,利用“用量 (RU)”对资源限额进行定义。结构如下 ( https://tidb.net/blog/67d82266 ):

关于资源组、资源限额、调度优先级等特性具体可以参考官网( https://docs.pingcap.com/zh/tidb/stable/tidb-resource-control )。

这里特地说明资源组设定是很灵活的,很方便管理员根据业务的使用场景,我觉得这也对 TiDB 的易用性有很好的提升, 分别设置不同的级别:

● 用户级别。将用户绑定到特定的资源组。绑定后,对应的用户新创建的会话会自动绑定对应的资源组。

● 会话级别。通过 SET RESOURCE GROUP 设置当前会话的资源组。

● 语句级别。通过优化器 hint RESOURCE_GROUP() 设置当前语句的资源组。

2.3 技术应用点

总结之,该技术主要解决了下面业务常见问题:

● 当系统中存在多业务负载时,资源隔离,保证交易类业务的响应时间不受数据分析或批量业务的影响。

● 在系统负载较低时,繁忙的应用允许超过设定的读写配额,最大化利用资源,提升硬件利用率,降低运行成本。

● 限制突发 SQL 的资源消耗,避免引起集群性能问题。

● 提供用量统计的精确反馈,完成不同业务合理的成本分摊

○ 通过监控面板获取实际用量的使用情况,协助用户合理改进配置。同时,配合企业管理目标,TiDB 能够协助企业精确统计各部门数据库资源的使用情况,完成合理的成本分摊。

● 提供灵活的资源绑定手段。

○ 支持在用户级,会话级,和语句级指定资源的绑定方式,满足不同场景的资源控制需要。

经过梳理它的基本原理和设计目标等内容,看起来可以很好解决我们实际生产环境的业务痛点,所以我们开启进一步的实际测试和验证。

业务验证

TiDB 可以基于硬件部署或实际负载估算集群的总体 RU 容量,我们在测试时是直接参考基于硬件部署的估算量。

3.1 业务资源模拟

为了模拟我们生产环境最常见的不同业务,这里我们创建三个租户,分别表示三种不同的业务负载,每类业务有不同的管控目标。下表是我们的不同业务运行在同一个 TiDB 集群中,每个业务不同的运行需求:

在资源管控技术的基础上,我们可以为这三类用户分别创建资源组:

● 为租户 app_oltp 分配一个较高的用量,租户 app_olap 和 租户 app_other 则相对低

○ 在系统资源紧张的情况下,最优先保证租户 app_oltp 的服务质量。

● 租户 app_oltp 和 app_olap 的资源组设置为 burstable

○ 租户 app_oltp 发生超预期的负载,仍旧可能会保证质量;

○ 而当整个集群负载有空余时, 租户 app_olap 可以利用空闲资源加速其工作。

● 创建资源组

 CREATE RESOURCE GROUP IF NOT EXISTS rg_oltp RU_PER_SEC = 1000 BURSTABLE PRIORITY = HIGH; CREATE RESOURCE GROUP IF NOT EXISTS rg_olap RU_PER_SEC = 400 BURSTABLE; CREATE RESOURCE GROUP IF NOT EXISTS rg_other RU_PER_SEC = 100;

● 我们线上的业务是已经存在了的,换言之上线该功能时业务账号也一定是已经存在的,所以模拟时直接对业务绑定资源组

 ALTER USER app_oltp RESOURCE GROUP rg_oltp; ALTER USER app_olap RESOURCE GROUP rg_olap; ALTER USER app_other RESOURCE GROUP rg_other;

3.2 业务运行模拟

我们在测试环境启动短连接业务实时访问数据,不断进行读取和写入操作,分别用来模拟几个租户不同的负载,观测业务侧吞吐量 (QPS) 和 数据库 TiDB 的资源消耗情况 (RU 用量趋势)。整个场景大概模拟下面几个场景:

  1. 对有设置使用上限且正在运行的业务,在线调整集群资源分配操作:

a. 临时扩大租户 app_other 的可用资源,模拟临时给在线业务增加资源

b. 临时缩小租户 app_other 配额,模拟临时给在线业务缩减资源

c. 允许租户 app_other 突破资源限额,模拟临时取消在线业务资源使用限制

d. 不允许租户 app_other 突破资源限额使其回到最开始的限额状态,模拟临时限制在线业务资源使用

  1. 模拟不同业务在同一个集群融合共存,观察全部租户经历最重要业务的一个波峰、波谷完整周期的运行情况

a. 首先三类负载同时运行,表示业务正常共存情况

b. 业务流量高峰来临,租户 app_oltp 达到峰值负载

c. 租户 app_oltp 峰值过去,回到平时状态

d. 租户 app_oltp 的负载到低谷值,其他不变

e. 租户 app_oltp 低谷过去,回到平时状态

在线增加/减少业务可用资源

对有设置使用上限且正在运行的业务,临时调整租户 app_other 的可用资源,模拟临时给在线业务增加或减少资源。

● 初始:租户 app_other 的业务初始资源配额

 ALTER RESOURCE GROUP rg_other RU_PER_SEC = 100;

● 扩大:临时扩大租户 app_other 业务的可用资源

 ALTER RESOURCE GROUP rg_other RU_PER_SEC = 400;

● 缩小:临时缩小租户 app_other 业务的可用资源

 ALTER RESOURCE GROUP rg_other RU_PER_SEC = 50;

如上图所示,可以看到租户 app_other 的业务初始资源配额为 100,期间业务在稳定运行。

假设有某个原因需要我们临时调大它的可用资源,此时调大可用资源 RU_PER_SEC = 400,业务能使用到的 RU 会立即响应 分配到需要的资源,曲线会不断上升。反之我们缩小可用资源 RU_PER_SEC = 50 时,曲线会下降到我们预期的设定值。

● 总结:

○ 说明 TiDB 的资源管控技术可以在线调整业务资源使用状态,实时对业务进行资源配置,大大提高业务响应速度。

○ 如果这类业务是突发的异常 SQL,我们可以临时限制它的资源消耗,避免引起集群性能问题。

在线取消业务配额限制

允许租户 app_other 突破资源限额,模拟临时取消在线业务资源使用限制场景。

  • 初始:租户 app_other 的业务初始资源配额
 ALTER RESOURCE GROUP rg_other RU_PER_SEC = 50;
  • 取消限制:允许租户 app_other 业务突破可用资源的限额
 ALTER RESOURCE GROUP rg_other RU_PER_SEC = 50 BURSTABLE;

如上图所示,可以看到租户 app_other 的业务初始资源配额为 50,期间业务在稳定运行。此时我们临时取消它的可用资源限制,在集群收到配置后其 RU 曲线不断上升,直到需要的最大值。

● 总结:

  • ○ 说明 TiDB 的资源管控技术可以在线调整业务资源使用状态,实时取消对业务资源使用限制

在线限制业务最大可用资源

不允许租户 app_other 突破资源限额,模拟临时限制在线业务资源使用

  • 初始:允许租户 app_other 业务突破可用资源的限额
 ALTER RESOURCE GROUP rg_other RU_PER_SEC = 50 BURSTABLE;
  • 不允许突破限额:不允许租户 app_other 突破限额
 ALTER RESOURCE GROUP rg_other RU_PER_SEC = 50;

如上图所示,可以看到租户 app_other 的业务初始资源配额没有限制,可以使用到其所需的最大资源,业务在稳定运行。此时我们临时增加限制,不允许突破限额,在集群收到配置后其 RU 曲线不断下降,直到回到最初的限制状态。

● 总结:

  • ○ 说明 TiDB 的资源管控技术可以在线调整业务资源使用状态,实时添加硬上限,不允许业务突破限额

● 小结:

我们整理一下上面的模拟操作,如下面图示过程,经过测试和验证,证明 TiDB 的资源管控技术可以在线调整业务资源使用状态,允许 TiDB 管理员根据业务运行动态,实时扩大、缩小、取消限额、添加硬上限不允许业务突破限额等操作,非常灵活和方便,大大降低运维的难度,也极大提高集群的资源使用效率。

跨业务共存测试

我们通过调整租户 app_oltp 业务的压测 QPS,产生出租户 app_oltp 业务的波峰和波谷。这里我们模拟不同业务在同一个集群融合共存,所有业务经历最重要业务的一个波峰、波谷完整周期,观察运行情况。流程如下:

● 首先三类负载同时运行,表示业务正常共存情况

● 业务流量高峰来临,租户 app_oltp 达到峰值负载

● 租户 app_oltp 峰值过去,回到平时状态

● 租户 app_oltp 的负载到低谷值,其他不变

● 租户 app_oltp 低谷过去,回到平时状态

如上图可以看到,刚开始时集群的几个业务正常共存,三类负载同时运行着。

● 租户 app_oltp 达到峰值负载其业务流量高峰来临,系统会分配给它更多的资源,于此同时由于集群可用资源不足租户 app_olap 分配得到的 RU 有所减少,等到租户 app_oltp 的峰值过去,租户 app_olap 分配得到的 RU 有所增加回到最初的状态。

● 经过一段时间后,租户 app_oltp 达到其运行的业务谷值其所需要的 RU 下降,此时集群空闲 RU 增多,由于租户 app_olap 设置的是 BURSTABLE, 允许突破限额使用资源,所以租户 app_olap 的可用 RU 上升,等到租户 app_oltp 的谷值过去,租户 app_olap 分配得到的 RU 有所减少回到最初的状态。

● 由于租户 app_other 自始至终有配额限制且需要较少的 RU ,所以其稳定维持在一个较低的水平,不影响别的业务运行。

前面的过程我们是从集群资源使用的角度看的问题,现在换个视角从业务 QPS 角度来看,如上图所示不同的业务的运行 QPS,基本随着可用资源的增多而升高,随着可用资源的减少而下降,服务业务预期。由此得出, 利用 TiDB 提供的资源管控和调度能力,多个不同诉求的租户能够共存在一套系统中,在保证各自服务目标的基础上,提升资源使用效率。

总结

我们验证了针对单个在线业务的资源调整,以及模拟了重要业务在经历完整波峰、低谷的运行周期内各个业务的运行情况,每个要点的测试数据和结果都符合我们的预期,证明了该资源管控技术的可行性。同时也表明了:

● TiDB 的资源管控技术能动态跟踪业务负载情况,实时分配所需的资源,证明其操作具有良好的实时性。

● 当系统中存在多业务负载时,能够实现资源隔离,保证重要的业务不受其他访问的影响。

● 在系统负载较低时,繁忙的应用允许超过设定的配额,能最大化利用资源,提升硬件利用率,降低运行成本。

跨业务系统多租户解决方案

基于我们线上 TiDB 的使用方式,就可以制定出一个初步的跨业务系统多租户解决方案,其他业务系统的部署架构需要具体情况具体分析。

这里使用 TiDB 多租户技术,能完成多个业务系统使用统一的集群,保证不同业务负载相互隔离,互不干扰,互不影响,然后对于有统计分析类需求也可以再利用 TiFlash 的 实时 HTAP 能力,实现跨业务数据关联查询,这部分能力通过 TiFLash 与 TiKV 也进行了物理隔离,不会影响线上运行的 TP 业务。这个方案架构图大致如下:

方案说明

● 根据不同的业务设置不同资源组和 RU,当集群整体资源繁忙时实现不同业务基于 RU 限流和负载隔离;

● 为重要业务设置资源组 BURSTABLE 属性,实现跨业务错峰资源借用;

● 为重要业务设置优先级为 HIGH,确保集群优先保证重要业务资源可用;

● 引入 TiFlash 解决实时数据分析需求;

● 如果业务有必要,还可以针对 tidb-sever 划分不同的业务节点,真正达到整个集群的资源隔离

方案总结

● 优势

○ 通过控制应用、会话、SQL 放入到对应的资源组中,高优先级的业务可以优先被满足,剩余的算力可以去满足次优的业务,达到资源的充分利用

○ 系统可扩展性强,在系统负载较低的情况下,繁忙应用即使超过设定的 RU,也仍然可以获得所需的系统资源,从而提高了系统的可扩展性

○ 不同业务可以混合部署在同一个集群上,减少硬件成本

○ 不同业务错峰使用资源,提升整体资源利用率,降低运行成本

○ 节约硬件成本

○ 高可扩展

○ 资源灵活管控

○ 解决数据孤岛问题

● 劣势

○ 资源划分策略难以确定,先根据硬件情况估计分配,在运行一段时间后负载校准,再介入调整,这需要运维人员有很高的技术和经验,容易出错

○ 集群系统复杂度变高,要手动对集群资源池进行划分和管理,增加系统的复杂度,维护难度变高

○ 系统复杂度高

○ 资源分配策略不好制定

未来展望

● 笔者在测试验证中发现,资源如何划分是一个比较棘手的问题,通过硬件配置校准 RU 的估算容量并不准确,真实容量往往偏差较大,所以需要我们先给较大的资源配额,观察一段时间后通过负载校准得到真实 RU 消耗再设置正确值,如果这块后续能够更加智能、更加自动化,减少人工的介入可能会更完美,期待官方后续优化。

● 目前 RU 包括的资源是 CPU 、磁盘 IO 和网络 IO,暂时还不支持内存资源的管控,期待后续官方把内存的使用管控也加进来。

● 调整资源组配置后,只对用户新建的会话生效,我们线上不少业务是长连接,这会导致无法生效,期待官方后面也能优化这方面的内容。

相关文章:

TiDB v7.1.0 跨业务系统多租户解决方案

本文介绍了 TiDB 数据库的资源管控技术,并通过业务测试验证了效果。资源管控技术旨在解决多业务共用一个集群时的资源隔离和负载问题,通过资源组概念,可以限制不同业务的计算和 I/O 资源,实现资源隔离和优先级调度,提高…...

【题解】二叉树中和为某一值的路径(一)

二叉树中和为某一值的路径(一) 题目链接:二叉树中和为某一值的路径(一) 解题思路1:递归 我们或许想记录下每一条从根节点到叶子节点的路径,计算出该条路径的和,但此种思路用递归稍麻烦,我们可以试着把和转换为差&am…...

css中变量和使用变量和运算

变量: 语法:--css变量名:值; --view-theme: #1a99fb; css使用变量: 语法:属性名:var( --css变量名 ); color: var(--view-theme); css运算: 语法:属性名…...

数据结构之线性表的类型运用Linear Lists: 数组,栈,队列,链表

线性表 定义 一个最简单,最基本的数据结构。一个线性表由多个相同类型的元素穿在一次,并且每一个元素都一个前驱(前一个元素)和后继(后一个元素)。 线性表的类型 常见的类型:数组、栈、队列…...

成瘾机制中微生物群的神秘角色

谷禾健康 成瘾是一种大脑疾病,受害者无法控制地对某种物质或行为产生强烈的依赖和渴求,尽管这种行为会产生有害的后果。成瘾包括一系列物质滥用障碍,例如药物、酒精、香烟,过度饮食。近年来,吸毒成瘾急剧上升&#xff…...

arm安装docker与docker-copose

一、银河麒麟Arm64安装docker 1、docker 安装包地址: https://download.docker.com/linux/static/stable 2、解压,然后将docker目录下文件拷贝到/usr/bin里 tar -xf docker-18.09.3.tgz mv docker/* /usr/bin/ 3、准备 docker.service系统配置文件 &…...

9.文件基本操作

第四章 文件管理 9.文件基本操作 ​    “打开文件和关闭文件”与平常鼠标双击打开文件和点击“X”关闭文件是有所不同的。 ​    操作系统在处理open系统调用时主要做了以下两件事情,①根据我们提供的文件存放路径在外存当中找到这个目录对应的目录表&#x…...

【Java】Spring——Bean对象的作用域和生命周期

文章目录 前言一、引出Bean对象的作用域1.普通变量的作用域2.Bean对象的作用域 二、Bean对象的作用域1.Bean对象的6种作用域2.设置Bean对象的作用域 三、Bean对象的生命周期总结 前言 本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也…...

数字孪生助力智慧水务:科技创新赋能水资源保护

智慧水务中,数字孪生有着深远的作用,正引领着水资源管理和环境保护的创新变革。随着城市化和工业化的不断推进,水资源的可持续利用和管理愈发显得重要,而数字孪生技术为解决这一挑战提供了独特的解决方案。 数字孪生技术&#xf…...

css 实现文字横向循环滚动

实现效果 思路 ## 直接上代码,html部分 //我这里是用的uniapp <view class"weather_info_wrap"><view class"weather_info">当前多云&#xff0c;今晚8点转晴&#xff0c;明天有雨&#xff0c;温度32摄氏度。</view><view class&qu…...

VuePress 数学公式支持

前言 博主在为 VuePress1.0 博客添加数学公式支持过程中遇到如下问题 问题一 在配置诸如 markdown-it-texmath,markdown-it-katex,markdown-it-mathjax3 这些插件后遇到 Error: Dynamic require of "XXX" is not supported 问题二 配置插件 vuepress-plugin-ma…...

stm32控制蜂鸣器源代码(附带proteus线路图)

说明&#xff1a; 1 PB0输出0时&#xff0c;蜂鸣器发生&#xff1b; 2 蜂鸣器电阻值如果太大会导致电流太小&#xff0c;发不出声音&#xff1b; 3蜂鸣器额定电压需要设置得低一点&#xff0c;可以是2V&#xff0c;但不能高于3V&#xff0c;这更右上角的电阻值有关系&#x…...

selinux

一、selinux的说明 二、selinux的工作原理 三、selinux的启动、关闭与查看 Enforcing和permissive都是临时的&#xff0c;重启还是依据配置文件中&#xff0c;禁用selinux&#xff0c;修改配置文件&#xff1a; 之后重启生效 四、selinux对linux服务的影响...

使用opencv4.7.0部署yolov5

yolov5原理和部署原理就不说了&#xff0c;想了解的可以看看这篇部署原理文章 #include <fstream> #include <sstream> #include <iostream> #include <opencv2/dnn.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp>/…...

Python - 协程基本使用详解【demo】

一. 前言 协程&#xff08;Coroutine&#xff09;是一种轻量级的线程&#xff0c;也被称为用户级线程或绿色线程。它是一种用户态的上下文切换方式&#xff0c;比内核态的线程切换更为轻量级&#xff0c;能够高效的支持大量并发操作。 2. 使用协程的好处 Python 中的协程是通…...

Android MVVM架构模式,详详详细学习

MVVM&#xff08;Model-View-ViewModel&#xff09; 是一种基于数据绑定的架构模式&#xff0c;用于设计和组织应用程序的代码结构。它将应用程序分为三个主要部分&#xff1a;Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;和ViewModel&#xff08;视…...

亿赛通电子文档安全管理系统 RCE漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…...

星际争霸之小霸王之小蜜蜂(三)--重构模块

目录 前言 一、为什么要重构模块 二、创建game_functions 三、创建update_screen() 四、修改alien_invasion模块 五、课后思考 总结 前言 前两天我们已经成功创建了窗口&#xff0c;并将小蜜蜂放在窗口的最下方中间位置&#xff0c;本来以为今天将学习控制小蜜蜂&#xff0c;结…...

JS的解析与Js2Py使用

JS的解析与Js2Py使用 JS的解析事件监听器搜索关键字请求关联JS文件 Js2PyJs2Py的简单使用安装Js2Py执行JavaScript代码调用JavaScript函数 Js2Py的应用示例创建JavaScript文件使用JavaScript JS的解析 在一个网站中&#xff0c;登录密码通常是会进行加密操作的&#xff0c;那么…...

Spring Bean的生命周期总结(包含面试题)

目录 一、Bean的初始化过程 1. 加载Spring Bean 2. 解析Bean的定义 3. Bean属性定义 4. BeanFactoryPostProcessor 扩展接口 5. 实例化Bean对象 6. Aware感知 7. 初始化方法 8. 后置处理 9. destroy 销毁 二、Bean的单例与多例模式 2.1 单例模式&#xff08;Sin…...

SpringjDBCTemplate_spring25

1、首先导入两个包&#xff0c;里面有模板 2、transtion事务 jDbc操作对象&#xff0c;底层默认的是事务&#xff1a; 3、我们java一般对实体类进行操作。 4、第一步写好坐标。 创建一个Account表 数据修改用update 数据进去了...

设计模式——桥接模式

引用 桥我们大家都熟悉&#xff0c;顾名思义就是用来将河的两岸联系起来的。而此处的桥是用来将两个独立的结构联系起来&#xff0c;而这两个被联系起来的结构可以独立的变化&#xff0c;所有其他的理解只要建立在这个层面上就会比较容易。 基本介绍 桥接模式&#xff08;Br…...

改进YOLO系列:2.添加ShuffleAttention注意力机制

添加ShuffleAttention注意力机制 1. ShuffleAttention注意力机制论文2. ShuffleAttention注意力机制原理3. ShuffleAttention注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. ShuffleAttention注意力机制论文 论文题目:SA-NET: SHUFFLE ATTENTION …...

利用Opencv实现人像迁移

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用Opencv实现人像迁移&#xff0c;欢迎大家一起参与探讨交流~ 本文目录&#xff1a; 一、实验要求二、实验环境三、实验原理及操作1.照片准备2.图像增强3.实现美颜功能4.背景虚化5.图像二值化处理6.人…...

Lnton羚通算法算力云平台在环境配置时 OpenCV 无法显示图像是什么原因?

问题&#xff1a; cv2.imshow 显示图像时报错&#xff0c;无法显示图像 0%| | 0/1 [00:00<…...

【JavaEE进阶】MyBatis的创建及使用

文章目录 一. MyBatis简介二. MyBatis 使用1. 数据库和数据表的创建2. 创建Mybatis项目2.1 添加MyBatis框架支持2.2 设置MyBatis配置信息 3. MyBatis开发流程4. MyBatis查询数据库测试 三. MyBatis 流程1. MyBatis 查询数据库流程2. MyBatis 框架交互流程图 一. MyBatis简介 M…...

职业学院物联网实训室建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…...

3 个 ChatGPT 插件您需要立即下载3 ChatGPT Extensions You need to Download Immediately

在16世纪&#xff0c;西班牙探险家皮萨罗带领约200名西班牙士兵和37匹马进入了印加帝国。尽管印加帝国的军队数量达到了数万&#xff0c;其中包括5,000名精锐步兵和3,000名弓箭手&#xff0c;他们装备有大刀、长矛和弓箭等传统武器。但皮萨罗的军队中有100名火枪手&#xff0c;…...

屏蔽socket 实例化时,握手阶段报错信息WebSocket connection to ‘***‘ failed

事情起因是这样的&#xff1a; 我们网站是需要socket链接实行实时推送服务&#xff0c;有恶意竞争对手通过抓包或者断网&#xff0c;获取到了我们的socket链接地址&#xff0c;那么他就可以通过java写一个脚本无限链接这个socket地址。形成dos攻击。使socket服务器资源耗尽&…...

单发多框检测(SSD)【动手学深度学习】

单发多框检测模型主要由一个基础网络块和若干多尺度特征块串联而成。基本网络用于从输入图像中提取特征,可以使用深度卷积神经网络,原论文中选用了在分类层之前阶段的VGG,现在也常用ResNet替代。 我们可以设计基础网络,使它输出的高和宽较大,这样基于该特征图生成的锚框数…...

“RFID与光伏板的完美融合:探索能源科技的新时代!“

随着科技的不断发展&#xff0c;人类创造出了许多令人惊叹的发明。其中&#xff0c;RFID&#xff08;Radio Frequency Identification&#xff09;技术的应用在各个领域日益广泛。最近的研究表明&#xff0c;将RFID技术应用于光伏板领域&#xff0c;不仅可以提高光伏板的效率&a…...

算法leetcode|71. 简化路径(rust重拳出击)

文章目录 71. 简化路径&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;样例 4&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 71. 简化路径&#xff1a;…...

网络技术Vlan技术STP(第一课)

一 Vlan技术的学习 对命令的增删改查 #### 1&#xff09;创建vlan[SW1]vlan 2 [2-4094] 创建vlan[SW1]vlan batch 10 20 30 创建多个不连续的vlan[SW1]display vlan 查看vlan信息[SW1]vlan batch 50 to 60创建多个连续的vlan[SW1]vlan2[SW1-vlan2]description caiwu添加描述信…...

SpringBoo t+ Vue 微人事 (十一)

职位修改操作 在对话框里面做编辑的操作 添加对话框 <el-dialogtitle"修改职位":visible.sync"dialogVisible"width"30%"><div><el-tag>职位名称</el-tag><el-input size"small" class"updatePosIn…...

自动驾驶卡车量产-第一章-用户需求

1、中国干线物流行业现状 万亿级市场&#xff0c;规模巨大。由中重卡承运的干线运输占到整体公路货运市场的82%&#xff0c;全国中重卡保有量约730 万台1&#xff0c;市场规模达4.6 万亿元1&#xff0c;体量全球第一&#xff0c;超过同城物流及乘用出租市场规模之和。同样&…...

Nginx 配置文件的完整指南 (一)

文章目录 一、简介1.1 配置文件一览 二、全局配置2.0 user2.1 worker_processes2.2 events模块2.3 http模块 三、server模块3.1 listen3.2 server_name3.3 location&#xff1a;请求处理位置 Nginx 配置文件的完整指南 (二) 一、简介 Nginx是一款高性能的Web服务器和反向代理服…...

css3+js 画出爱心特效

要使用CSS3和JavaScript绘制爱心特效&#xff0c;可以使用CSS3的动画和过渡效果来创建爱心的形状&#xff0c;并使用JavaScript来控制动画的触发和交互。以下是一个简单的示例代码&#xff1a; HTML: <div class"heart"></div> <button onclick&quo…...

蔚来李斌卖手机:安卓系统,苹果售价,一年一发

‍作者 | Amy 编辑 | 德新 车圈大佬的玩法真让人寻不着套路&#xff01; 苹果的库克和小米的雷布斯&#xff0c;甚至是FF贾老板准备许久&#xff0c;都想分一块新能源车的蛋糕&#xff0c;蔚来李斌却反手进军手机界&#xff0c;从宣布造手机到手机入网仅仅隔了一年。 近期&a…...

0008__浏览器层面缓存 Etag If-None-Match等详解

浏览器层面缓存 Etag & If-None-Match等详解_if-none-match:_shadow_zed的博客-CSDN博客...

Idea 快捷键整理

Idea快捷键和自动代码补全汇总 idea快捷键汇总 Ctrl 快捷键说明Ctrl F在当前文件进行文本查找 &#xff08;必备&#xff09;Ctrl R在当前文件进行文本替换 &#xff08;必备&#xff09;Ctrl Z撤销 &#xff08;必备&#xff09;Ctrl Y删除光标所在行 或 删除选中的行 &am…...

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——假言——第一节 充分条件

文章目录 第一节 充分条件假言命题-那么,就,则真题(2013-29)-假言-充分假言-那么,就,则-变形推理真题(2014-44)-假言-充分假言-那么,就,则-(1)建模-“那么/就/则”-前推后真题(2018-37)-假言-充分假言-那么,就,则-(1)建模-“那么/就/则”-前推后;-(2)A→…...

LSTM模型

目录 LSTM模型 LSTM结构图 LSTM的核心思想 细胞状态 遗忘门 输入门 输出门 RNN模型 LRNN LSTM模型 什么是LSTM模型 LSTM (Long Short-Term Memory)也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比能够有效捕捉长序列之间的语义关联,缓解梯度消失或爆炸现象.同时LS…...

抢红包小程序

抢红包小程序 红包大战 # urls.pyfrom django.urls import pathfrom . import viewsurlpatterns [ path(login/, views.login, namelogin), path(create_red_packet/, views.create_red_packet, namecreate_red_packet), path(join_red_packet/<int:red_packet_id…...

UVA 10006 埃氏筛法+快速幂

本题目使用费马定理时&#xff0c;我随机定义了10个数字&#xff0c;循环用费马小定理判断&#xff0c;数组中的值不用和我的相同&#xff0c;随机即可。 #include <iostream> using namespace std; typedef unsigned long long ll; bool isPrime[65007]; ll a[10]; voi…...

C++--红黑树

1.什么是红黑树 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩倍&#xff0c;因…...

Unity 找不到 Navigation 组件的解决

当我们想利用unity 里面的Navigation 组件来实现我们的物体的自动导航时&#xff0c;有时竟然会发现我们的菜单栏里面找不到 该组件 这时我们应该怎么办&#xff1f; 请确保你的项目中已经导入了Unity的AI模块。要导入该模块&#xff0c;请打开"Project Settings"&am…...

【js】时间和时间戳转换、日期格式化

1、时间戳转换日期方法 &#xff08;格式&#xff1a;2023-08-17&#xff09; function timestampToDate(date) {var date new Date(date);var YY date.getFullYear() -;var MM (date.getMonth() 1 < 10 ? 0 (date.getMonth() 1) : date.getMonth() 1) -;var DD …...

glog体验第一天(0)glog介绍和安装

在Ubuntu上安装glog&#xff0c;可以按照以下步骤进行操作&#xff1a; 打开终端&#xff0c;使用以下命令更新本地软件包列表&#xff1a; sudo apt-get update然后&#xff0c;使用以下命令安装glog库及其开发工具&#xff1a; sudo apt-get install -y libgoogle-glog-de…...

Android 13像Settings一样获取SIM卡信息

一.背景 由于客户定制的Settings里面需要获取到SIM卡信息,所以需要实现此功能。 目录 一.背景 二.前提条件 三.调用api 二.前提条件 首先应用肯定要是系统应用,并且导入framework.jar包,具体可以参考: Android 应用自动开启辅助(无障碍)功能并使用辅助(无障碍)功能_…...

Can‘t find end of central directory : is this a zip file ? at XMLHttpRequest

导出woed出现这个报错,原因其实很简单,路径写错了, 这个word首先必须是docx格式,然后必须放在public文件包下 如果放在public文件包下还没有用,则放在public包下 参考帖子: https://www.cnblogs.com/hejun26/p/13647927.html...