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、核心配置项

属性用途是否必填默认值备注
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、成本:接入成本低,无代码侵入。

作者:京东物流 扈海涛

来源:京东云开发者社区

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机智能衣柜 智能衣橱 换气除湿制系统紫外线消毒的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前衣柜温湿度和柜门开启关闭状态&#xff1b;按键设置当前衣柜湿度上限值、衣柜门打开和关闭&#xff0c;杀菌消毒&#xff1b;当湿度超过设置上限&#xff0c;继电器闭合开启风扇进行除湿&#xff1b;进行杀菌消毒时&am…

zk-IMG:对抗虚假信息

1. 引言 前序博客&#xff1a; ZKP图片授权——PhotoProof&#xff1a;proofs of permissible photo edits Daniel Kang等人2022年论文《ZK-IMG: Attested Images via Zero-Knowledge Proofs to Fight Disinformation》&#xff0c;在该论文中提供了一个简单的deep fake ima…

Web安全——渗透测试基础知识下

渗透测试基础 Web安全一、VMware虚拟机学习使用1、虚拟机简单介绍2、网络模式2.1 桥接网络&#xff08;Bridged Networking&#xff09;2.2 NAT模式2.3 Host-Only模式 3、通俗理解 二、Kali的2021安装与配置1、简单介绍2、Kali的版本3、配置3.1 安装虚拟机open-vm-tools-deskto…

IDEA中集成zookeeper的插件

IDEA中集成zookeeper的插件 一、IDEA中集成插件 搜索插件并安装&#xff1a; 安装完成&#xff0c;重启IDEA 配置zk集群 连接成功

哪家好用?四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk

一、前言 远程桌面软件对于职场人来说并不陌生&#xff0c;可以说是必备的办公软件之一。在经历过新冠疫情后&#xff0c;大家对于远程办公的认识越来越深入&#xff0c;也就在这段期间&#xff0c;远程桌面软件大范围的应用起来&#xff0c;真正走进大众视野并融入我们的工作和…

记一次阿里云被挖矿处理记录

摘要 莫名其妙的服务器就被攻击了&#xff0c;又被薅了羊毛&#xff0c;当做免费的挖矿劳动力了。 一、起因 上班&#xff08;摸鱼&#xff09;好好的&#xff0c;突然收到一条阿里云的推送短信&#xff0c;不看不知道&#xff0c;两台服务器被拉去作为苦力&#xff0c;挖矿去…

wireshark学习

抓包原理 哪种网络情况可以抓到包&#xff1f;&#xff08;1&#xff09;本机环境&#xff08;2&#xff09;集线器环境&#xff08;3&#xff09;交换机环境 交换机环境目前较为常用&#xff0c;这也分为三种情况&#xff08;1&#xff09;端口镜像&#xff08;2&#xff09…

生产环境 kafka 平滑迁移之旅

文章目录 背景分析测试环境验证现实很残酷两种抉择-----leader分区切换方案选择实施步骤手工副本集增加步骤手工leader分区切换步骤 总结 背景 线上kafka集群&#xff0c;3台机器&#xff0c;3个broker&#xff1b;其中某台机器因为硬件故障&#xff0c;需要停机维修&#xff…

HTML5 游戏开发实战 | 黑白棋

黑白棋&#xff0c;又叫反棋(Reversi)、奥赛罗棋(Othello)、苹果棋、翻转棋。黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子&#xff0c;最后以棋盘上谁的棋子多来判断胜负。黑白棋的棋盘是一个有88方格的棋盘。开始时在棋盘正中有两白两黑四个棋子交叉放置&#xff0…

《PyTorch深度学习实践》第十一讲 循环神经网络(基础篇 + 高级篇)

b站刘二大人《PyTorch深度学习实践》课程第十一讲循环神经网络&#xff08;基础篇 高级篇&#xff09;笔记与代码&#xff1a; https://www.bilibili.com/video/BV1Y7411d7Ys?p12&vd_sourceb17f113d28933824d753a0915d5e3a90 https://www.bilibili.com/video/BV1Y7411d7Y…

【MySQL】在Linux下删除和安装MySQL

文章目录 一、前言二、检查、卸载内置环境三、获取mysql官方yum源四、正式安装MySQL服务五、登录MySQL配置my.cnf设置开机启动 一、前言 大家好久不见&#xff0c;今天开始分享关系型数据库Mysql的一些知识。 二、检查、卸载内置环境 2.1 首先使用命令查询当前mysql的运行状…

走向 Native 化:SpringDubbo AOT 技术示例与原理讲解

作者&#xff1a;刘军 Java 应用在云计算时代面临“冷启动”慢、内存占用高、预热时间长等问题&#xff0c;无法很好的适应 Serverless 等云上部署模式&#xff0c;GraalVM 通过静态编译、打包等技术在很大程度上解决了这些问题&#xff0c;同时针对 GraalVM 的一些使用限制&a…

Kubernetes service服务的发布 - kube-proxy(负载均衡器)-IPVS

目录 Service Service将内部的pod暴露到外面&#xff0c;让用户可以访问 负载均衡策略&#xff1a; Service 的类型&#xff1a; 案例&#xff1a;Service服务发布案例 扩展&#xff1a;我们在案例再加入一个探针的使用 更改后的my_nginx.yaml文件&#xff1a; 创建Pod&…

jar-protect Jar 包加壳工具

jar-protect 是 java 的 jar 加密加壳工具&#xff0c;对 class 文件进行加密防护&#xff0c;避免反编译破解。 java 本身是开放性极强的语言&#xff0c;代码也容易被反编译&#xff0c;没有语言层面的一些常规保护机制&#xff0c;jar 包很容易被反编译和破解。 受 classfi…

OpenCV 入门教程:自适应阈值处理

OpenCV 入门教程&#xff1a;自适应阈值处理 导语一、自适应阈值处理二、示例应用2.1 图像二值化2.2 图像去噪 总结 导语 自适应阈值处理是图像处理中常用的技术之一&#xff0c;它能够根据图像的局部特征自动调整阈值&#xff0c;从而提高图像的处理效果。在 OpenCV 中&#…

vue element select下拉框树形多选

components 文件下新建 SelectTree文件 index.vue SelectTree index.vue <!--* 下拉树形选择 组件--> <template><el-select ref"select" style"min-width: 260px" :value"value" v-model"valueName" collapse-tags :…

【LeetCode热题100】打卡第33天:环形链表LRU缓存

文章目录 【LeetCode热题100】打卡第33天&#xff1a;环形链表&LRU缓存⛅前言 环形链表&#x1f512;题目&#x1f511;题解 LRU缓存&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第33天&#xff1a;环形链表&LRU缓存 ⛅前言 大家好&#xff0c;我是知…

Chapter 3: Conditional | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Chapter 3: Conditional executionBoolean expressionsLogical operatorsConditional executionAlternative executionChained conditionalsNested conditionalsCatching exceptions using try and exceptShort-circuit evaluation of lo…

运维开发面试题第一期

1.tail -f和tail -F的区别是什么? tail -f 根据文件描述符进行追踪&#xff0c;当文件改名或被删除&#xff0c;追踪停止。 tail -F 根据文件名进行追踪&#xff0c;并保持重试&#xff0c;即该文件被删除或改名后&#xff0c;如果再次创建相同的文件名&#xff0c;会继续…

Tomcat相关

1. 运行项目 将java项目打包为war或者war所对应的文件夹&#xff0c;放置于tomcat的webapps目录下。其实tomcat运行时会解压war到项目中并运行class文件&#xff0c;延伸开来&#xff0c;为啥不能用jar包&#xff0c;因为jar可能可以表示项目但也能表示依赖&#xff0c;tomcat…