eBPF实战教程五|如何使用USDT探针定位MySQL异常访问(含源码)

news2025/1/11 16:46:58

前言

各位小伙伴们,非常感谢你们对我们eBPF专题系列文章的持续关注和热情支持!在之前的文章中,我们深入探讨了如何手写一个uprobe探测用户态程序。许多热心的小伙伴给我们发私信表达了他们对eBPF技术在数据库领域应用的浓厚兴趣,并希望我们能分享更多的相关案例。为了满足大家的期待,本文将带您深入了解用户态探测的另一种强大工具——USDT探针,以及它在数据库优化和监控中的潜在应用。

本文是我们的eBPF专题系列第五篇纯技术分享文章——如何手码eBPF程序探测MySQL5.6 USDT,来实时识别数据库可疑的连接访问来源(user/host)。

USDT原理介绍

USDT(User Statically-Defined Tracing)是动态追踪系统 DTrace 的一部分,允许在用户态应用程序中定义静态探针。这些探针提供了一个强大的调试和性能分析工具,可以在运行时捕获和分析应用程序的行为,而无需修改应用程序代码或重新编译。

  • 探针定义

开发人员在代码中插入静态探针点。这些探针点通常是一些宏定义,用于标记需要追踪的代码位置。例如,在 MySQL 中可以看到类似于 #define MYSQL_COMMAND_START(arg0, arg1, arg2, arg3) 这样的探针定义。

  • 探针注册

编译应用程序时,这些探针会被注册到探针表中,生成相应的探针元数据。探针在正常运行时是无操作的(noop),不会影响应用程序性能。

  • 探针启用

当需要调试或分析时,调试器或追踪工具(如 DTrace、SystemTap 或 BPF)可以附加到这些探针上,并启用它们。当探针被启用时,它们会执行指定的动作,例如记录日志、捕获堆栈跟踪或收集性能数据。

  • 捕获数据

当应用程序运行并触发探针时,探针会调用附加到它们的追踪程序,执行指定的调试或分析任务。这些任务可以包括打印变量值、收集性能指标等。

  • 数据分析

通过收集的数据,开发人员可以分析应用程序的行为,找出性能瓶颈、调试问题或优化代码。

MySQL5.6 DTrace探针

MySQL5.6源码probes_mysql_nodtrace.h中定义了大量的DTrace探针,我们从中选取了以下两个探测:

#define  MYSQL_COMMAND_START(arg0, arg1, arg2, arg3)#define  MYSQL_COMMAND_DONE(arg0)

备注:MySQL源码编译指定编译选项DENABLE_DTRACE=1才能开启Dtrace探针。关于使用DTrace跟踪mysqld更多信息可查看该链接文档(https://mysql.net.cn/doc/refman/5.6/en/dba-dtrace-server.html)

MySQL源码调用上述两个Dtrace的位置:

bool dispatch_command(enum enum_server_command command, THD *thd,          char* packet, uint packet_length){  NET *net= &thd->net;  bool error= 0;  DBUG_ENTER("dispatch_command");  DBUG_PRINT("info",("packet: '%*.s'; command: %d", packet_length, packet, command));
  /* SHOW PROFILE instrumentation, begin */#if defined(ENABLED_PROFILING)  thd->profiling.start_new_query();#endif
  /* DTRACE instrumentation, begin,start探针 */  MYSQL_COMMAND_START(thd->thread_id, command, &thd->security_ctx->priv_user[0], (char *) thd->security_ctx->host_or_ip);
...  ...  /* DTRACE instrumentation, end,End探针 */  if (MYSQL_QUERY_DONE_ENABLED() || MYSQL_COMMAND_DONE_ENABLED())  {    int res MY_ATTRIBUTE((unused));    res= (int) thd->is_error();    if (command == COM_QUERY)    {      MYSQL_QUERY_DONE(res);    }    MYSQL_COMMAND_DONE(res);    }
  /* SHOW PROFILE instrumentation, end */#if defined(ENABLED_PROFILING)  thd->profiling.finish_current_query();#endif
  DBUG_RETURN(error);}

start探针中四个参数分别为:

  • thread_id : MySQL内部分配的线程ID,即MySQL的Connection ID

  • command: SQL命令的枚举类型

  • priv_user: 连接的用户名

  • host_or_ip: 连接的客户端IP

end探针中只存在一个res参数,该参数为会话执行SQL的返回状态,非0表示SQL执行异常。

eBPF USDT如何实时识别MySQL异常访问来源?

1)环境准备

准备一台 Linux 机器,安装好g++和bcc

2)基于BCC工具实现探测MySQL5.6的Dtrace探针

接下来我们将基于BCC,利用USDT写一个eBPF程序,实时全量采集MySQL的访问来源(User/Host)。

a)使用BCC对探针进行探测​​​​​​​
#!/usr/bin/python
from bcc import BPF,USDT
# BPF program to attach to the command__start USDT probebpf_text = """#include <uapi/linux/ptrace.h>
int trace_command__start(void *ctx) {    struct {        unsigned long conn_id;        int command;        char user[48];        char host[48];    } args;
    bpf_usdt_readarg(1, ctx, &args.conn_id);    bpf_usdt_readarg(2, ctx, &args.command);    bpf_usdt_readarg_p(3, ctx, args.user, sizeof(args.user));    bpf_usdt_readarg_p(4, ctx, args.host, sizeof(args.host));
    bpf_trace_printk("Command start:");    bpf_trace_printk("Timestamp: %llu",bpf_ktime_get_ns());    bpf_trace_printk("ConnectionId= %llu",args.conn_id);    bpf_trace_printk("Command=%ld",args.command);    bpf_trace_printk("User= %s",args.user);    bpf_trace_printk("Host= %s",args.host);    return 0;}
int trace_command__done(void *ctx){    bpf_trace_printk("Command done:");    bpf_trace_printk("Timestamp: %llu",bpf_ktime_get_ns());    int res = 0;    bpf_usdt_readarg(1, ctx, &res);    bpf_trace_printk("Res= %d",res);    return 0;}"""
parser = argparse.ArgumentParser(description="Attach USDT probes to a running process")parser.add_argument("pid", type=int, help="The PID of the target process")args = parser.parse_args()pid = args.pidusdt = USDT(pid=pid)usdt.enable_probe(probe = "command__start", fn_name = "trace_command__start")usdt.enable_probe(probe = "command__done", fn_name = "trace_command__done")bpf = BPF(text = bpf_text, usdt_contexts = [usdt])bpf.trace_print()

b)效果演示

pid即为需要探测的mysqld的进程号,指定pid执行python invoke_static.py即可开启探测,当该mysqld有SQL执行时,该探针将触发并得到日志打印。如下示例:

图片

远程执行连接MySQL的命令

图片

打印观测的结果

图片

从上面的演示中我们能看到,客户端和MySQL建立连接,显示当前连接的会话id、访问来源(user/host)、SQL Command、SQL执行开始时间、SQL结束时间、SQL是否正常执行完成(Res)等信息。然后我们针对采集上来的数据就可以做分析了:

  • 如果存在user和host为非业务网段或者非业务账号,说明存在异常来源访问。

  • 如果存SQL执行耗时过长,可能存在可疑账号在抽取数据。

总结

借助eBPF技术的强大能力,我们可以利用MySQL的USDT探针来捕获和深入分析与数据库SQL连接相关的操作活动。通过本文的详细阐述,您对否对eBPF技术在数据库性能监控和优化方面的应用有了更深层次的理解和认识?

您的MySQL异常来源访问识别出来了吗?欢迎加入技术交流群与我们讨论!

图片

  1. eBPF专题一 | 手把手教你用eBPF诊断MySQL(含源码)
  2. eBPF实战教程二|数据库网络流量最精准的量化方法(含源码)
  3. eBPF实战教程三|数据库磁盘IO最精准的量化方法(含源码)
  4. 用蜜蜂(eBPF)来追踪海豚(MySQL),性能追的上吗​​​​​​​

图片

DBdoctor推出长久免费版

DBdoctor是一款企业级数据库全方位性能监控与诊断平台,致力于解决一切数据库性能问题。可以对商业数据库、开源数据库、国产数据库进行统一性能诊断。

图片具备:SQL审核巡检报表监控告警存储诊断审计日志权限管理等免费功能,不限实例个数,可基于长久免费版快速搭建企业级数据库监控诊断平台。

图片同时拥有:性能洞察、锁分析、根因诊断、索引推荐、SQL发布前性能评估等高阶功能,官网可快速下载,零依赖,一分钟快速一键部署。

如果您想要试用全部功能可添加公众号自助申请专业版license。成为企业用户可获得产品定制、OpenAPI集成、一对一专家等高阶服务。欢迎添加小助手微信了解详细信息!

1️⃣ 产品介绍:

DBdoctor产品介绍

2️⃣免费下载/在线试用:

https://dbdoctor.hisensecloud.com/col.jsp?id=126

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

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

相关文章

2024建博会|博联AI大模型全屋智能引领智能体验新纪元

7月8日&#xff0c;2024中国建博会&#xff08;广州&#xff09;在广交会展馆及保利世贸博览馆盛大启幕。BroadLink博联智能携AI大模型全屋智能以及AI商业照明解决方案惊喜亮相&#xff0c;全方位展示AI大模型在智能家居领域的前沿应用成果。 本次建博会&#xff0c;博联智能带…

《大语言模型的临床和外科应用:系统综述》

这篇题为《大语言模型的临床和外科应用&#xff1a;系统综述》的文章对大语言模型&#xff08;LLM&#xff09;目前在临床和外科环境中的应用情况进行了全面评估。 大语言模型&#xff08;LLM&#xff09;是一种先进的人工智能系统&#xff0c;可以理解和生成类似人类的文本。…

如何在不关闭防火墙的情况下,让两台设备ping通

问题现象 如题&#xff0c;做虚拟机实验的时候&#xff0c;有一台linux系统的虚拟机配置的ip地址是192.168.172.181 物理主机的ip地址是192.168.172.1 此时物理主机可以ping通虚拟机 但是虚拟机不能ping通物理主机 此时我们可以想到&#xff0c;有可能是物理主机防火墙的原因。…

S32V234平台开发(一)快速使用

快速使用 准备供电复位选择串口通信启动选择显示登陆系统 准备供电 s32v234可以使用两种电源供电 一种是左边电源端子&#xff0c;一种是右边电源适配器(12V 3A) 注意:不要同时使用两种电源同时供电 复位选择 Pressing POR RESET pulls active low EXT_POR signal on S32V2…

基于蓝牙iBeacon定位技术的商场3D楼层导视软件功能详解与实施效益

在现代商场的繁华与复杂中&#xff0c;寻找目的地往往令人头疼。维小帮3D楼层导视软件以其创新技术&#xff0c;为顾客带来无缝、直观的跨楼层导航体验&#xff0c;让每一次商场消费都成为享受。 商场3D楼层导视软件功能服务 3D多楼层导视地图&#xff0c;商场布局一览无遗 …

卷技术还是卷应用?李彦宏给出了明确答案

如何理解李彦宏说的“不要卷模型&#xff0c;要卷应用” 引言 7月4日&#xff0c;2024世界人工智能大会在上海世博中心召开。百度创始人兼CEO李彦宏在产业发展主论坛上呼吁&#xff1a;“大家不要卷模型&#xff0c;要卷应用&#xff01;”这句话引起了广泛讨论。李彦宏认为&a…

安装nodejs | npm报错

nodejs安装步骤: 官网&#xff1a;https://nodejs.org/en/ 在官网下载nodejs: 双击下载下来的msi安装包&#xff0c;一直点next&#xff0c;我选的安装目录是默认的: 测试是否安装成功&#xff1a; 输入cmd打开命令提示符&#xff0c;输入node -v可以看到版本&#xff0c;说…

ByteMD富文本编辑器的vue3配置

Git地址&#xff1a;GitHub - bytedance/bytemd: ByteMD v1 repository 控制面板输入 npm install bytemd/vue-next 下载成功后在src/main.ts中引用 import "bytemd/dist/index.css";引入后保存&#xff0c;下面是一些插件&#xff0c;比如说我用到gmf和hightLight&…

Spring Cloud 引入

1.单体架构&#xff1a; 定义&#xff1a;所有的功能实现都打包成一个项目 带来的后果&#xff1a; ①后端服务器的压力越来越大&#xff0c;负载越来越高&#xff0c;甚至出现无法访问的情况 ②业务越来越复杂&#xff0c;为了满足用户的需求&#xff0c;单体应用也会越来越…

linux使用chattr与lsattr设置文件/目录防串改

背景 linux服务器下,防止某个文件/目录被串改(增删改),可以使用chattr与lsattr设置,这是一种保护机制,用于防止意外地修改或删除重要的文件内容。 chattr与lsattr使用 1.设置目录 图中/tmp/zhk,设置目录属性文件可能被设置为不可更改(immutable)或者只追加(append …

STM32智能仓库管理系统教程

目录 引言环境准备智能仓库管理系统基础代码实现&#xff1a;实现智能仓库管理系统 4.1 数据采集模块 4.2 数据处理与控制算法 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;仓库管理与优化问题解决方案与优化收尾与总结 1. 引言 智能仓库管理系统通…

吴恩达机器学习作业ex8:K 异常检测和推荐系统(Python实现)详细注释

文章目录 1 异常检测1.1 高斯分布1.2 估计高斯参数1.3 选择阈值 ε1.4 高维数据集 2 推荐系统2.1 电影评分数据集2.2 协作过滤学习算法2.2.1 协同过滤成本函数2.2.2 梯度协同过滤2.2.3 Regularized cost function2.2.4 正则梯度 2.3 学习电影推荐2.3.1 推荐 后记 1 异常检测 在…

绩效管理为什么难?

几乎所有企业都知晓绩效管理的重要性&#xff0c;但许多企业陷入了把绩效考核当绩效管理的误区。绩效考核只是绩效管理过程中的一个环节&#xff0c;如果只重视“考核”这个环节&#xff0c;会极大限制员工个人和组织的成长。 绩效管理是一个动态过程&#xff0c;包括绩效目标设…

15.分频器设计--偶分频

设计一个六分频时钟信号 &#xff08;1&#xff09;visio视图&#xff1a; &#xff08;2&#xff09;Verilog代码&#xff1a; module divider_six(clk,reset_n,clk_out);input clk;input reset_n;output reg clk_out;reg [1:0]cnt;//计数器模块设计 always(posedge clk o…

gitee及git的简单使用、下载教(保姆级教程)

前言&#xff1a; GitHub&#xff0c;一个由外国研发的代码开源网站&#xff0c;我们可以通过它获得别人优秀的项目源码&#xff0c;也可以在上面上传自己的劳动成果。但是&#xff0c;我们很难访问外网。于是&#xff0c;我们将目光转向国内一个类似的网站---码云&#xff08…

Docker镜像拉取失败/下载缓慢?如何正确的更换Docker镜像源?(含镜像源,亲测有效!)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Docker镜像源 📒📝 为何更换镜像源📝 如何更换Docker镜像源📝 验证镜像源更换成功📝 一些可用的Docker镜像源⚓️ 相关链接 ⚓️📖 介绍 📖 在当今快速迭代的软件开发环境中,Docker以其轻量级、可移植和高效的特…

Softmax回归中的损失函数

目录 一、损失函数介绍&#xff1a; 因为Softmax回归时逻辑回归的推广&#xff0c;所以Softmax回归的损失函数是逻辑回归损失函数的推广。 原文链接&#xff1a;逻辑回归中的损失函数 一、损失函数介绍&#xff1a; 与回归问题成本函数不同的是&#xff0c;Softmax回归模型&a…

大数据基础:Hadoop之HDFS重点架构原理

文章目录 Hadoop之HDFS重点架构原理 一、什么是Hadoop 二、HDFS简介 三、HDFS架构 3.1、NameNode 3.2、SecondaryNameNode 3.3、DataNode 3.4、Client 四、fsimage和editslog合并 五、Block副本放置策略 六、读写流程 6.1、HDFS写文件流程 6.2、HDFS读文件流程 Ha…

2,区块链、数字货币及其应用场景(react+区块链实战)

2&#xff0c;区块链、数字货币及其应用场景&#xff08;react区块链实战&#xff09; 一、什么是区块链&#xff1f;1 ibloackchain&#xff08;1&#xff09;安装ibloackchain&#xff08;2&#xff09;Blance查询余额&#xff08;3&#xff09;Mine挖矿&#xff08;4&#x…

新技术引领商业智能新时代:从 AI 到自助分析的演变

最新技术资源&#xff1a; https://www.grapecity.com.cn/resources/ 引言&#xff1a;商业智能的新技术浪潮 在当今数据驱动的世界中&#xff0c;技术进步不断改变着商业智能&#xff08;BI&#xff09;领域。特别是人工智能&#xff08;AI&#xff09;和自助分析工具的发展&…