写点什么

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

  • 2023-07-06
    北京
  • 本文字数:2721 字

    阅读完需:约 9 分钟

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

背景

大促备战,最大的隐患项之一就是慢 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、核心配置项

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、成本:接入成本低,无代码侵入。


作者:京东物流 扈海涛

来源:京东云开发者社区

发布于: 刚刚阅读数: 4
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
Mybatis-SQL分析组件 | 京东云技术团队_mybatis_京东科技开发者_InfoQ写作社区