写在文章开头
早起笔者进行数据库操作实验时,会习惯性通过内网虚拟机安装MySQL
,在完成部署并进行操作过程中发现MySQL
操作无论是连接还是操作都非常耗时,结合之前SSH
连接慢大抵推测MySQL
连接操作耗时也是卡在DNS
反向解析上,遂以此文章记录一下笔者的解决方案。
Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一,熟悉 Java 也会一点 Go ,偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客,也还在研究并输出技术的路上,希望我的文章对你有帮助,非常欢迎你关注我的公众号: 写代码的SharkChili 。
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。
现象描述
无论是连接查询还是插入,笔者在执行SQL
语句时发现,每个操作都需要等待5-6s
,因为笔者虚拟机配置采用的是仅主机模式,所以排除了路由不可达等问题或者路由配置不当等问题。
解决方案
查阅MySQL
的配置信息得出,每当客户端连接MySQL
服务时,MySQL
服务会进行如下操作:
- 定位到客户端的连接请求,并得到对应
IP
地址。 MySQL
服务得到用户IP、账户、密码进行权限校验。- 考虑到某些用户是通过域名进行配置的,于是服务器会主动通过
DNS
进行反向解析获取客户端ip的域名地址。
因为笔者配置的MySQL
服务在内网,所以MySQL
在进行方向解析时查看本地hosts文件没有对应的IP映射的域名地址后,会尝试通过外网的DNS
服务器配置进行反向解析,正是这样一个不可达的操作直至超时,等待长时间后的timeout
,MySQL
服务才会通过客户端的IP地址进行匹配完成校验,使得用户看起来MySQL
连接非常慢。
所以对应的解决方案也非常简单,对于内网的MySQL服务我们只需关闭DNS反向解析即可,我们直接编辑MySQL
的my.cnf
文件,对应路径和指令如下:
vim /etc/my.cnf
在[mysqld]
下面插入语句意为跳过MySQL
反向解析,如下所示:
[mysqld]
skip-name-resolve
完成后重启MySQL
服务即可,最终问题得以解决。
systemctl restart mysqld.service
小结
当网络操作出现非正常耗时时,我们就需要从网络连接通信过程的角度进行覆盖式排查,即从客户端连接、网络路由、端口或者防火墙配置、当前网络服务程序配置等顺序进行逐一排查。
我是 sharkchili ,CSDN Java 领域博客专家,开源项目—JavaGuide contributor,我想写一些有意思的东西,希望对你有帮助,如果你想实时收到我写的硬核的文章也欢迎你关注我的公众号: 写代码的SharkChili 。
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。
参考
mysql配置中采用mysql skip-name-resolver提高性能
:https://blog.csdn.net/qq_21445563/article/details/102626647