mysql invalid conn排查

news2024/11/26 16:47:46

mysql invalid conn排查

问题背景

服务使用golang ,客户端库是go-mysql-driver ,系统测试环境频繁但是不总是报出invalid conn 错误,但实际拿sql执行时却是正常执行。

排查思路

原因分析

客户端使用了无效连接

由于连接无效,首先考虑客户端使用了过期连接。

mysql服务器端和客户端都能配置各自连接的最大生命周期。

如果客户端配置的连接最大生命周期大于服务端,并且客户端没有无效连接重连的机制,则会导致服务端的连接在过期以后,客户端使用已经过期的连接,从而引发invalid conn。

查询mysql 连接的最大空闲生命周期 s为单位

show global variables like 'wait_timeout';

image.png
客户端最大生命周期配置

db.SetConnMaxLifetime(time.Duration(timeout) * time.Hour) //reconnect after 1 hour

mysql server的最大生命周期大于golang客户端的连接最大生命周期,所以排除此原因。

连接被莫名的原因关掉了,抓包分析

一时间陷入僵局,连接究竟是为何无效。直接抓包分析。

sudo tcpdump -i lo port 3306 -w conn.pcap

专家系统发现异常包

将pcap文件用wireshark打开,用专家系统对抓到的包做一个整体的分析。
看到有8个异常的RST包,正常的连接开关是不会有RST产生的,着重分析下RST产生的原因。
在这里插入图片描述

发现问题

image.png

看到具体发生异常的地方,mysql服务器在回复客户端一个ACK消息后,客户端等了10s对mysql服务器发起了Request Quit(mysql 协议)关闭连接的命令。

具体看下异常前后。
选择菜单栏的Statistics->Flow Graph,就可以打开数据流图窗口。
image.png可以看到过程如下:
1,11:55:49.05 在客户端向mysql 发起 Request Execute Statement 执行sql的命令,

2,mysql 回复Ack

3, 但是mysql并没有把执行结果返回给客户端,所以客户端等待了10s后发起关闭连接的命令。

4,mysql 在11:55:59.27才返回了执行结果。

5,但是这个时候客户端已经把连接关闭了,对已经关闭的连接发送数据触发了RST信号,所以客户端回应服务器RST

看到这里,已经可以很明确的任务是服务器执行sql超时了,或者说是服务器返回结果时超时了。

回到客户端代码确认报错原因

在进一步,是不是超时导致的报警呢?
可以看到在读取缓冲区数据时,有可能报出ErrInvalidConn

// read packet header
		data, err := mc.buf.readNext(4)
		if err != nil {
			if cerr := mc.canceled.Value(); cerr != nil {
				return nil, cerr
			}
			errLog.Print(err)
			mc.Close()
			return nil, ErrInvalidConn
		}

继续查看mc.buf.readNext,发现超时代码

if b.timeout > 0 {
			if err := b.nc.SetReadDeadline(time.Now().Add(b.timeout)); err != nil {
				return err
			}
		}

mysql受到什么因素导致sql过长

因为是数据库,首先想到了磁盘,再次回到top,iostat ,iotop分析。
此次发现异常。
image.png发现磁盘io使用率偶尔会飙高,所以mysql执行速率受到了影响。

解决问题

占用磁盘使用率的几个项目主要是视频转码项目,转码的时间不是固定的,所以当转码的时候,在同一台主机上的mysql受到了影响,引发了超时,导致应用层报出invalid conn 错误。

经过确认,测试环境可暂时关闭转码功能,关闭后,再也没有报警出现。

正常情况下,当抓包看到mysql返回超时是,应该立即就去看系统io等硬件指标了,这里由于是测试环境,所以我还是去看了go-mysql-client 库的代码,进一步确认。

反思

测试环境监控体系不够完善,没有监控界面,不然应该一眼能看出磁盘io异常。

其次是回归到应用层看代码的时机较晚,还是被invalid conn迷惑了,其实如果go-mysql库报错为超时错误可能会更符合这个场景。

其实从一开始,就用了top和iostat 去分析系统磁盘占用情况,但是由于那段时间内指标并无异常,加上报错信息是invalid conn 导致我首先把问题定位到是网络连接上出的问题,并抓包分析。
看到这种偶发的错误,应该持续性的观察系统指标,这次只是看了十几秒钟就转而去分析其他因素了,实属不该。

测试环境开启慢日志

show variables like 'slow_query%';

image.png
开启慢日志

set global slow_query_log=1 

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

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

相关文章

AI绘画StableDiffusion实操教程:冰霜旗袍美女

飞书原文链接,获取更多资源:AI绘画StableDiffusion实操教程:冰霜旗袍美女 前几天分享了StableDiffusion的入门到精通教程:AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通 但是还有人就问&#xff1a…

数学专题训练1 概率dp

数学专题训练1 1. RollingDiceDivOne 有 n n n​ 个骰子,第 i i i​ 个骰子拥有 d i c e [ i ] dice[i] dice[i] 面,每面包含 1 , 2 , . . . , d i c e [ i ] 1,2,...,dice[i] 1,2,...,dice[i] 的点数。同时掷这 n n n 个骰子,问掷出来…

JavaWeb——类的加载过程

目录 一、类加载的过程 1、加载 2、连接 (1)、验证 (2)、准备 (3)、解析 3、初始化 二、类加载的触发 三、双亲委派模型 1、定义 2、过程 3、优点 (1)、避免重复加载类 …

Redis持久化AOF和RDB,学习总结篇!

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 前面笔者写了一篇关于Redis 数据结构和数据类型的博客总结,这篇博客总结一下关于 Redis 持久化。部分图片来自作者:小林哥,小林哥y…

JS debug跳过的几种方法

JS debug跳过的几种方法 第一种反调试解决方法: 禁用断点法 禁用所有断点,包括自己打的断点,无法调式。第二种反调试解决方法: 从来不执行法 在debug处 点击右键,选择 Nerver pause here,点击确定。第三种反调试解决方法: 条件…

常见的JS内置对象之数组

数组(Array) 1)定义数组 直接push的话,值放在了创建的大小之后,用下标进行操作值在创建大小里 创建两个空对象 2)数组的遍历: for in 循环 迭代数组:迭代出的是下标 拿到的不是值&am…

CnosDB x LangChain: 聊着天来查询时序数据库

本篇我们将主要介绍如何使用 LangChain 连接 CnosDB 数据库,实现使用自然语言和数据库的交流。 大模型等的相关话题已经霸榜半年有余,在讨论关注之余,CnosDB技术团队将大模型与人工智能相关技术与数据库开发与实践进行融合。继CnosDB全面整合…

实现最大子段和的计算,输入数据从文件读取。

1.设计思路   求解该题可以用分治法解题,总共有三种情况,最大子段在我们数组的左侧;最大子段在我们数组的右侧;最大子段跨过了左右两侧,在中间最大。第一种和第二种将两个子问题递归解出。分开的位置就是我们的中心位…

ios oc button 设置

Button调整内部的子控件的位置

图书借阅系统

系统描述 该图书借阅系统是一个用于图书馆或类似机构管理图书借阅流程的在线平台。系统主要包括管理员模块和读者模块,分别提供相应的功能和权限。 - 管理员模块: - 注册:允许管理员创建新的管理员账号。 - 登录:允许管理员使用账…

centos7 安装vmware17

vmware17 下载 官网 VMware Hong Kong - Delivering a Digital Foundation For Businesses | HK | HK 下载链接 Download VMware Workstation Pro 下载链接,直接点击下载即可 https://download3.vmware.com/software/WKST-1702-LX/VMware-Workstation-Full-17.0…

Unity自定义后处理——校色

Unity自定义校色后处理 大家好,我是阿赵。   之前介绍了一些后处理的做法,包括了PostProcessing和CommandBuffer。其实如果我们只是实现一些比较单一的全屏效果,也没必要搞那么复杂,直接在OnRenderImage里面写Graphics.Blit就可…

最近很火的 LangChain 你了解吗

最近 ChatGPT 很火,AIGC 很火,各类国产化 AI 很火。周边的 AI 工具集、框架也很火。各类新词也层出不穷。今天和大家学习和分享的是重量级新选手 LangChain。 一、什么是 LangChain LangChain 是一个 2023 年 1 月(v0.0.64)在 G…

网页聊天室测试

1.项目介绍: 该项目是一个基于网页的聊天室应用,具有用户注册、登录、会话列表、好友列表、发送消息等功能。下面是更详细的项目介绍: 用户注册和登录功能:用户可以通过输入用户名和设置密码来注册新账户,在注册过程中…

实施工程师需要了解的mysql知识

一、前言 做为实施工程师,在现场有时候是需要协助开发人员做一些简单的sql查询、更新动作的,不需要多复杂,下面就简单介绍下mysql的安装以及举一些最简单常用的sql用例。 二、安装mysql 2.1 下载安装包 第一步:在百度搜索"…

vue 通过多组复选框来过滤数据

1.通过if else 来筛选数据 <template> <div><div><label><input type"checkbox" v-model"checkedNames" value"北京"> 北京</label><label><input type"checkbox" v-model"chec…

使用python进行AI选股之同花顺问财

通过问财python库&#xff0c;可以输入中文就能获取AI选股结果&#xff0c;而不需要写很多代码来进行股票选取&#xff0c;如上图就是输入中文”均线多头排列的股票”获取的结果。本文主要介绍问财python库的选股功能和使用步骤。 什么是问财python库 同花顺i问财是同花顺旗下…

Echarts 定制化日历图

目录 改造一&#xff08;变化X轴、Y轴label&#xff09;&#xff1a; 改造二&#xff08;单元格、图例改造&#xff09;&#xff1a; 改造三&#xff08;tooltip、细节优化&#xff09;&#xff1a; 最近在做可视化&#xff0c;发现日历图挺有意思&#xff0c;分享一波吧&am…

SpringBoot项目打包Docker镜像

1、创建springboot项目&#xff0c;并在根目录新建Dockerfile文件 Dockerfile文件内容 FROM adoptopenjdk/openjdk8:jre8u-nightly ADD target/test-k8s-0.0.1-SNAPSHOT.jar test-k8s-0.0.1-SNAPSHOT.jar ENTRYPOINT ["java","-jar","/test-k8s-0.0.…

Python编程——字符串的拼接

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 前言 本文将讲解字符串的拼接与使用%进行拼接。 目录 ​编…