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

news/2024/10/17 22:16:02/

背景

大促备战,最大的隐患项之一就是慢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.ppmy.cn/news/746960.html

相关文章

【Bootstrap 学习笔记】bootstrap css 布局容器 栅格系统

1 概述 1&#xff09;HTML 5 文档类型 Bootstrap 使用到的某些 HTML 元素和 CSS 属性需要将页面设置为 HTML5 文档类型。 <!DOCTYPE html> <html lang"zh-CN">... </html>2&#xff09;移动设备优先 Bootstrap 是移动设备优先的。为了确保适当…

记一次上电不当引起的开机花屏

调试一款BOE lvds屏幕时&#xff0c;出现开机花屏(必现)&#xff0c;休眠唤醒后正常。 查看开机时5v ldo的波形如下(异常波形维持3s以上&#xff0c;下面的图是改善后的&#xff0c;减低到420ms&#xff0c;开机的瞬间无法直接控制到该gpio) 相应的ldo电路如下 由于使能脚没有…

WIN10 启动后花屏

WIN10 启动后花屏 解决方案 win10里&#xff0c;右键点击开始按钮&#xff0c;在菜单中选择“控制面板”&#xff0c;然后&#xff0c;控制面板 - 硬件和声音 - 电源选项 - 更改电源按钮的功能 - 更改当前不可用的设置 - 取消“启用快速启动”&#xff0c;点击“保存修改”按…

Win7系统开机花屏处理方法

我们日常在对电脑的使用过程中&#xff0c;经常都会遇到这样或那样的问题。比如说win7开机花屏&#xff0c;当遇到这个问题时该如何解决呢&#xff1f;别着急还有小编在呢&#xff0c;接下来我就来给大家详细的介绍一下Windows7系统开机花屏如何处理。 windows7系统开机花屏怎么…

Ubuntu19.04或Ubuntu20.04版本安装后开机花屏的解决办法

Ubuntu19.04或Ubuntu20.04版本安装后开机花屏的解决办法 注意&#xff1a;我是笔记本电脑&#xff0c;解决办法是我无意间发现的&#xff0c;本人啥都不懂&#xff0c;可能只对于本人电脑有效 首先花屏是这个样子的&#xff1a;很多条横杠&#xff08;甚至比图中的更多&#…

安装ubuntu出现花屏_ubuntu安装成功,开机花屏问题

解释&#xff1a;此方法本人经过测试并没有成功【文章转自CSDN】&#xff0c;由于时间有限把这个问题记录一下有空会继续测试&#xff0c;抛砖引玉…… 题描述&#xff1a; ubuntu正常开机花屏&#xff0c;进不入登录界面。从恢复模式进入没有问题。首先说下本人的是NVIDIA的显…

virtualBox ubuntu 虚拟机开机之后界面花屏、黑屏等处理方法

virtualBox ubuntu 虚拟机开机之后界面花屏、黑屏等处理方法 有时候更新完windows之后就会出现这种现象&#xff0c;有可能是两个原因&#xff1a; 1、显卡驱动问题 2、ubuntu无法正常加载desktop ** 解决办法&#xff1a; 1、首先 我们要进入命令行界面 按下 CtrlF1&#…

花屏以后计算机重启怎么办,电脑有时候花屏然后重启就好了怎么办

突然间遇到电脑花屏的情况怎么办&#xff0c;其实现有很多用户都不知道电脑花屏的原因的&#xff0c;那遇到了花屏怎么办?下面是学习啦小编为大家整理的关于电脑有时候花屏然后重启就好了的相关资料&#xff0c;希望对您有所帮助! 电脑有时候花屏然后重启就好了的解决方法 电脑…