欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve)

程序员文章站 2024-02-22 11:17:34
mysql数据库收到一个网络连接后,首先拿到对方的ip地址,然后对这个ip地址进行反向dns解析从而得到这个ip地址对应的主机名。用主机名在权限系统里面进行权限判断。反向d...
mysql数据库收到一个网络连接后,首先拿到对方的ip地址,然后对这个ip地址进行反向dns解析从而得到这个ip地址对应的主机名。用主机名在权限系统里面进行权限判断。反向dns解析是耗费时间的,有可能让用户感觉起来很慢。甚至有的时候,反向解析出来的主机名并没有指向这个ip地址,这时候就无法连接成功了。

可以在配置文件里面禁止mysql进行反向dns解析,只需在my.cnf的[mysqld]段落中加入如下行即可:

skip-name-resolve (windows与linux下一样的)

设备在连接mysql时候,等待服务器的banner信息需要4s左右,影响了mysql服务的连接速度。
通过如下方式进行验证:

1、telnet端口验证

通过设备和虚拟机(linux系统)分别telnet mysql服务的端口,会出现一下现象:

设备(uag/scanner): telnet后,等待mysql的服务器端回应大概需要等10s左右。

[dptech-developer-shell]telnet 10.101.0.206 3308
trying 10.101.0.206...
connected to 10.101.0.206.
escape character is '^]'.
e
5.0.67-community-nt-log?hc95
虚拟机(ubuntu):telnet后,立即得到了mysql服务器的返回

[root]~# telnet 10.101.0.206 3308
trying 10.101.0.206...
connected to 10.101.0.206.
escape character is '^]'.
e
5.0.67-community-nt-log?d%(;1$]+,¢!zdh`'?g)6r]yconnection closed by foreign host.   //这里耗时很短

2、通过程序进行验证

具体源代码见附件:验证程序源代码
源代码基本上是设置了recv超时后,建立socket连接之后接受数据,收到后计时并输出。

在设备上和虚拟机中的结果分别如下:
设备:

[dptech-developer-shell]/tcpclient_mips 10.101.0.1 3306
花费时间:19553
recved 68 bytes
@
5.5.2-m2-community%ud3q`n)

虚拟机:

[root]tcp_demo# ./tcpclient 10.101.0.1 3306
花费时间:10525
recved 68 bytes
@
5.5.2-m2-communitd~k~y";b

可以发现,设备上大约比linux服务器多耗时9s,其中10秒钟可能是recv本身超时的时间。

3、通过不同操作系统进行telnet验证

通过windows系统和linux虚拟机、设备,分别通过telnet进行连接尝试,通过抓包分析得知,只有设备的耗时比较长,其他的耗时都比较短。
抓包时发现设备中的socket建立之后,mysql服务器需要发送很多次的nbns报文后,才会传输banner信息,而linux虚拟机和windows系统的主机在这个过程中都没有出现这个问题。
查找了一些资料,关于mysql nbns报文的问题:

mysql论坛的提问:



该问题的答复


从答复中来看,貌似是某些版本的问题,临时的解决方案是对mysql服务器进行配置,不启用named pipes,即 命名管道 功能即可解决这个问题。

后经查找相关资料得知,远程连接超时可能由于mysql默认开启了dns反向解析的缘故,每次连接时服务器都尝试解析连接客户端的主机名,导致时间比较长。

解决方法是在服务器端的my.ini文件中,[mysqld]这个节下配置一个skip-name-resolve以关闭mysql默认开启的dns反向解析就可以了。

再次通过设备和虚拟机或者windows系统进行telnet,可以发现连接超时的现象明显不存在了。

另外通过自己写的c代码进行连接的时候也存在同样的问题,修改skip-name-resolve以后,实际上就可以发现该问题已经不存在了:

设备:

[dptech-developer-shell]/tcpclient_mips 10.101.0.1 3306
花费时间:10520
recved 68 bytes
@
5.5.2-m2-community[z44e>g)
虚拟机:
[root]tcp_demo# ./tcpclient 10.101.0.1 3306
花费时间:10521
recved 68 bytes
@
5.5.2-m2-community7eve5wyx

通过虚拟机telnet连接另外一个ip 10.101.0.206时候发现速度也比较慢,消耗的时间基本上和设备中相当,可能是由于虚拟机和宿主主机之前不需要进行反向域名解析,或者说是应为系统本身就知道虚拟机ip地址(nat模式)对应的主机名,所以不需要进行dns反向解析,导致在虚拟机中出现了特殊情况。
最后得出结论,可能这个问题实际上和设备或者虚拟机,linux系统、windows系统没有多大关系,主要由于服务器的反向dns解析导致该问题。无法从客户端途径去解决,也就是说我们设备无法处理这种情形。