Mybatis-SQL分析组件 | 京东云技术团队

news2024/11/28 2:46:17

背景

大促备战,最大的隐患项之一就是慢sql,带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,而且对sql好坏的评估有一定的技术要求,有一些缺乏经验或者因为不够仔细造成一个坏的sql成功走到了线上,等发现的时候要么是造成了线上影响、报警、或者后置的慢sql采集发现,这时候一般无法快速止损,需要修改代码上线、或者调整数据库索引。

核心痛点:

1、无法提前发现慢sql,可能恶化为慢sql的语句

2、线上出现慢sql后,无法快速止损

解决思路

1、把问题解决在上线之前,最好的办法就是在测试阶段,甚至在开发阶段就发现一个sql的好坏

2、线上发现慢sql后除了改代码上线、调整数据库表索引的方式外,支持热更新的方式替换sql语句

部门内部,目前大部分数据库框架采用的mybatis,然后基于mybatis本身的实现机制中,开发一个mybatis组件,可以自动对运行的sql进行提取和分析,定制一套默认的分析规则,让sql在开发环境和测试环境执行的时候,就能够做初步的评估,把有问题的慢sql在这个阶段暴露出来;同时具备sql替换功能,在线上出现问题sql的时候,可以通过ducc配置快速完成对一个sql的在线替换,大大降低线上问题的止损时间。

开源方案调研

目前,主流的sql分析组件,核心功能主要放在了两个方向:1、慢sql的分析和优化建议 2、sql的优化重写功能,而且主要偏运维的辅助功能无法做到无侵入的和应用代码进行集成。也就无法实现我们的核心痛点,慢sql提前分析预警和动态sql替换。

设计方案

核心功能:SQL分析预警能力、SQL替换能力

详细设计

主要分为8个功能模块

模块一:core 主要负责组件的接入到mybatis,以及其它模块的编排调用

模块二:config 主要负责组件配置信息的初始化

模块三:extrat 主要通过解析mybatis 相关对象,提取完整的待执行sql

模块四:analysis 主要拼接分析语句,执行explain分析语句并获取分析结果

模块五:rule sql分析规则的加载和初始化,支持自定义规则

目前默认规则(持续扩展):

1、查询未匹配索引

2、匹配索引过滤效果较差

3、返回行数过多

4、使用了文件排序

模块六:score 基于分析结果和配置的评分规则进行匹配打分,优化建议组装

模块七:out 输出模块,对于输出结果进行输出,目前已error日志、MQ两种输出方式

模块八:replace替换模块,可以对sql语句基于ducc配置进行动态替换

使用方法

1、引入依赖jar包

<dependency>
    <groupId>com.jd.sql.analysis</groupId>
    <artifactId>sql-analysis</artifactId>
    <version>1.2-SNAPSHOT</version>
</dependency>

2、配置组件xml

<configuration>
    <plugins>
        <plugin interceptor="com.jd.sql.analysis.core.SqlAnalysisAspect" >
            <!-- 开启sql分析功能最简配置 -->
            <property name="analysisSwitch" value="true"/>

            <!-- 开启sql替换功能最简配置 -->
            <property name="sqlReplaceModelSwitch" value="true"/>
            <property name="duccAppName" value="workbench-backend"/>
            <property name="duccUri" value="ucc://workbench-backend:2d6991cb865f4e6bac6c3e1cf7794cdf@test.ducc.jd.local/v1/namespace/workbench_backend/config/default/profiles/test?longPolling=60000&necessary=false"/>
            <property name="duccMonitorKey" value="refundBugFlag"/>
        </plugin>
    </plugins>
</configuration>

3、核心配置项

属性用途是否必填默认值备注
analysisSwitch是否开启分析功能false
onlyCheckOnce是否对一个sqlid只分析一次true
checkInterval每个sqlid分析间隔300000毫秒onlyCheckOnce 为false才生效
exceptSqlIds需要过滤不分析的sqlid
sqlType分析的sql类型默认select、update支持
scoreRuleLoadClass评分规则加载器,用于扩展自定义规则
outModel默认输出方式默认值:LOG支持LOG、MQ两种方式
outputClass评分结果输出类,用于扩展自定义结果输出方式
sqlReplaceModelSwitchsql替换模块是否开启默认 false
duccAppNameducc配置的应用名称(jdos)
duccUriducc uri配置
duccMonitorKeysql替换配置文件对应的key

4、默认分析效果展示

4.1、慢sql分析效果

4.2、sql动态替换效果

5、实践使用方案

5.1、慢sql分析-日志输出+关键词告警

<configuration>
    <plugins>
        <plugin interceptor="com.jd.sql.analysis.core.SqlAnalysisAspect" >
            <property name="analysisSwitch" value="true"/>
        </plugin>
    </plugins>
</configuration>

5.2、慢sql分析-日志输出+mq输出+es存储+Kibana分析

<configuration>
    <plugins>
        <plugin interceptor="com.jd.sql.analysis.core.SqlAnalysisAspect" >
            <property name="appName" value="workbench-backend"/>
            <property name="analysisSwitch" value="true"/>
            <property name="outputModel" value="mq"/>
            <property name="mqApp" value="qlstation"/>
            <property name="mqUser" value="qlstation"/>
            <property name="mqPassword" value="D1BCC547"/>
            <property name="mqAddress" value="jmq-testcluster.jd.local:50088"/>
            <property name="mqTopic" value="jdl_kds_key_node_log"/>
        </plugin>
    </plugins>
</configuration>

最终效果

5.3、慢sql替换-ducc配置动态更新sql语句

<configuration>
    <plugins>
        <plugin interceptor="com.jd.sql.analysis.core.SqlAnalysisAspect" >
            <property name="sqlReplaceModelSwitch" value="true"/>
            <property name="duccAppName" value="workbench-backend"/>
            <property name="duccUri" value="ucc://workbench-backend:2d6991cb865f4e6bac6c3e1cf7794cdf@test.ducc.jd.local/v1/namespace/workbench_backend/config/default/profiles/test?longPolling=60000&necessary=false"/>
            <property name="duccMonitorKey" value="sqlReplaceConfig"/>
        </plugin>
    </plugins>
</configuration>

发现慢sql

ducc配置

线上sql被动态替换

注意:功能正式修复后,需去掉该配置,该功能仅供应急处理线上问题,不建议作为功能长期使用

性能测试

测试环境千次普通sql查询,每种场景进行了5次测试

未启用插件耗时:11108ms,10237ms,9482ms,7938ms,8196ms

开启sql分析耗时:16619ms,17333ms,16321ms,19057ms,18164ms

实际配置,只有首次执行或者间隔时间执行,单次影响10ms左右)

开启sql替换耗时:10642ms,8803ms,8353ms,8830ms,9170ms

基本无影响

适用场景

1、慢sql预防

2、线上问题止损

优势

1、核心优势:执行时分析sql,区别于传统的依赖sql执行耗时来评估慢sql,直接基于语法和索引进行前置分析,不仅能预防某些坏sql在上线后发现是慢sql,还能给出sql优化建议,可以大限度的避免线上产生慢sql。支持动态对线上sql进行替换,可以对线上问题快速止损。

2、性能:基于性能和不同的使用场景考虑,支持定制化配置,每个sql是否仅进行一次检查、或者按某个时间间隔进行配置。sql替换几乎无损耗。

3、扩展:基于后续sql评分规则的扩展、以及分析结果以不同的方式输出的考虑,支持评分规则、输出方式的自定义扩展。

4、成本:接入成本低,无代码侵入。

作者:京东物流 扈海涛

来源:京东云开发者社区

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

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

相关文章

SpringBoot使用EasyExcel实现Excel的导入导出

一、概念 EasyExcel 是一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具。它能让你在不用考虑性能、内存的等因素的情况下&#xff0c;快速完成 Excel 的读、写等功能。 二、EasyExcel常用注解 注解名称属性介绍ExcelProperty value属性设置表头的名称 i…

CSPM是什么?

背景 2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开…

【lora模块调试:亿百特lora-型号E22-400T30D-V=代码调试-STM32H7xx/F4xx/F1xx-基础样例(2)】

【lora模块调试&#xff1a;亿百特lora-型号E22-400T30D-V代码调试-STM32H7xx/F4xx/F1xx-基础样例&#xff08;2&#xff09;】 1、概述2、实验环境3、实验说明3-1调试开发板H71、先了解硬件H72、测试keil版本的H7软件代码&#xff08;1&#xff09;找到样例代码。&#xff08;…

3.清除浮动

3.1 为什么需要清除浮动? 由于父级盒子在很多情况下&#xff0c;不方便给高度&#xff0c;但是子盒子浮动又不占有位置&#xff0c;最后父级盒子高度为0时&#xff0c;就会影响下面的标准流盒子。 ●由于浮动元素不再占用原文档流的位置&#xff0c;所以它会对后面的元素排…

java开发微信公众平台之素材上传

微信公众平台官方文档 我在本地使用工具请求接口一切正常。 当我开始写代码的时候 我蒙了 后台怎么模拟form表单上传图片 放参考文章链接https://blog.csdn.net/subaiqiao/article/details/122059076 首先引入依赖 <dependency><groupId>com.squareup.okhttp3&l…

环状二肽:16364-36-6,cyclo(Ala-Glu),环(-丙氨酸-谷氨酸),具有明确的生物活性

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ Cyclo(Ala-Glu) 是一种环状二肽&#xff0c;环二肽(2,5-哌嗪二酮)是Z小的环肽&#xff0c;许多天然环二肽化合物都具有明确的生物活性&#xff0c;环二肽结构的特殊性使得这类化合物的合成自成体系&#xff0c;通常由N端游离…

sap abap,forms,smartforms 导出pdf

4种方法&#xff1a; 1.安装pdf程序&#xff0c;Foxit Reader,先敲回车 自动带出&#xff0c;如下图&#xff1a; 直接打印就会弹出保存pdf文档路径&#xff0c;点保存。这种方式是最简单的&#xff0c;可 forms 和 smartforms 。 2. forms 和 smartforms 打印到spool 中&…

Django搭建图书管理系统03:编写博客文章的Model模型

Django 框架主要关注的是模型&#xff08;Model&#xff09;、模板&#xff08;Template&#xff09;和视图&#xff08;Views&#xff09;&#xff0c;称为MTV模式。 它们各自的职责如下&#xff1a; 层次职责模型&#xff08;Model&#xff09;&#xff0c;即数据存取层处理与…

【设计模式】第六章:装饰器模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

STM32外设系列—ESP8266(WIFI)

文章目录 一、ESP8266简介二、固件库烧录三、常用AT指令四、访问API4.1 获取IP地址4.2 GET天气信息4.3 访问结果展示 五、实战项目5.1 串口配置5.2 检测WIFI模块连接状态5.3 发送配置指令5.4 解析天气信息 六、成果展示 一、ESP8266简介 ESP8266是嵌入式和物联网开发中常用的模…

js实现用时间戳生成13位随机数

效果如图&#xff1a; methods里面写方法&#xff1a; changeTime(val) {//去掉-var reg new RegExp("-", "g");var a val.replace(reg, "");//去掉空格var regs new RegExp(" ", "g");var b a.replace(regs, "&qu…

MBD stm32开发 脉冲->GPIO

matlab1028b以上 stm32cubemx5.6.0以上 从正点原子下载&#xff0c;百度的可能存在java问题 stm32-mat/target 教程与代码分享 - 知乎 安装好这些后&#xff0c;打开matlab&#xff0c;打开路径STM32-MAT\STM32 打开MATLAB&#xff0c;在设置路径中添加STM32-MAT/TARGET文件…

港联证券|股指预计维持震荡格局 关注汽车、半导体等板块

6月全行业、全部非金融行业景气继续回落&#xff0c;中报或确认1Q23为本轮全A非金融盈利增速底&#xff0c;但价格支撑偏弱→复苏或缺弹性。结合本轮PPI见底时间、历次去库周期时长以及周期底部的合意库存水平&#xff0c;本轮库存周期大约3Q23见底&#xff0c;Q3市场或进入“补…

关于公安部三所开展网络安全产品认证工作的公告

各网络安全产品厂商&#xff1a; 2023年7月3日&#xff0c;国家互联网信息办公室、工业和信息化部、公安部、国家认证认可监督管理委员会发布了《关于调整<网络关键设备和网络安全专用产品目录>的公告》&#xff08;2023年第2号&#xff09;&#xff0c;调整了网络安全专…

最新kali Linux2023.1镜像下载链接

我们一般推荐使用国内镜像下载 kali linux-2023.1下载地址&#xff1a;国内镜像阿里云开源镜像站下载地址&#xff1a;kali-images-kali-2023.1安装包下载_开源镜像站-阿里云 kali linux-2023.1下载地址&#xff1a;国内镜像网易开源镜像站下载地址&#xff1a;http://mirror…

Spring Boot 中的模板引擎是什么,如何使用

Spring Boot 中的模板引擎是什么&#xff0c;如何使用 在 Web 应用程序中&#xff0c;模板引擎是一种用于动态生成 HTML、XML、JSON 等文档的工具。Spring Boot 内置了多种常见的模板引擎&#xff0c;例如 Thymeleaf、Freemarker、Velocity 等&#xff0c;让我们可以轻松地创建…

赋值CString时导致程序崩溃的一个问题

使用GetWindowTextW将vgj容器内指定结构体的opinion变量赋值 GetDlgItem(IDC_EDIT2)->GetWindowTextW(vgj.at(i).opinion);//将opinion赋值导致程序出现崩溃&#xff0c;通常这种崩溃是由于访问野指针造成的 检查之前的代码有 memset(&vgj.at(i), 0, sizeof(vgj.at(i…

TextFuseNet:具有更丰富融合特征的场景文本检测

计算机视觉 文章目录 计算机视觉摘要1.介绍2.相关工作3.方法3.1框架3.2 多层次特征表示3.3 多路径融合体系结构3.4 弱监督学习 4.实验4.1 数据集4.2 细节4.3消融实验4.4 与最新的形状文本检测方法的比较 5. 结论 论文地址&#xff1a;https://www.ijcai.org/Proceedings/2020/7…

Python教程(2)——开发python常用的IDE

为什么需要IDE 在理解IDE之前&#xff0c;我们先做以下的实验&#xff0c;新建一个文件&#xff0c;输入以下代码 total_sum 0 for x in range(1,101):total_sum x print(total_sum)非常非常简单的一个程序&#xff0c;主要就是计算1加到100的值&#xff0c;我们将它重命名…

阿里云国际站:阿里云究竟是如何胜出的?

标题&#xff1a;阿里云究竟是如何胜出的&#xff1f;   "阿里云究竟是如何胜出的&#xff1f;"这是一个引人入胜的问题&#xff0c;值得我们深挖细究。作为中国市场上引领潮流的云计算服务供应商&#xff0c;阿里云的成功并不是偶发事件&#xff0c;而是其在技术创…