`
tcxiang
  • 浏览: 89517 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

 
阅读更多

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

作者: 字体:[增加 减小] 类型:转载
 
从其它地方连接MySQL数据库的时候,有时候很慢。慢的原因有可能是MySQL进行反向DNS解析造成的,这里简单介绍下原理,需要的朋友可以参考下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论坛的提问:

http://forums.mysql.com/read.php?11,250982,250982#msg-250982

该问题的答复 
http://forums.mysql.com/read.php?11,250982,254683#msg-254683

从答复中来看,貌似是某些版本的问题,临时的解决方案是对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解析导致该问题。无法从客户端途径去解决,也就是说我们设备无法处理这种情形。

分享到:
评论

相关推荐

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

    在确认问题原因后,通过在MySQL配置文件中添加`skip-name-resolve`,可以消除因反向DNS解析导致的连接超时现象。这样,MySQL将仅使用IP地址进行验证,从而提高了连接速度。同时,对于那些依赖于主机名验证的场景,...

    mysql启用skip-name-resolve模式时出现Warning的处理办法

    MySQL中的`skip-name-resolve`模式是一个配置选项,它的主要作用是禁止数据库服务器在处理连接请求时进行DNS(域名系统)解析。这个设置通常用于优化性能,因为DNS查询可能会增加延迟,尤其是在网络环境不稳定或者...

    mysql 加了 skip-name-resolve不能链接数据库问题的解决方法

    MySQL数据库系统在配置时,有时为了提高性能或者避免DNS解析带来的延迟,会在配置文件`my.ini`中启用`skip-name-resolve`选项。这个选项的作用是禁止MySQL服务器对远程主机名进行DNS解析,而是直接使用IP地址进行...

    关于skip_name_resolve参数的总结分享

    作为MySQL调优的一部分,很多人都推荐开启skip_name_resolve。这个参数是禁止域名解析的(当然,也包括主机名)。很多童鞋会好奇,这背后的原理是什么,什么情况下开启这个参数比较合适。 基于以下原因,MySQL服务端...

    mysql SKIP-NAME-RESOLVE 错误的使用时机造成用户权限

    MySQL中的`SKIP-NAME-RESOLVE`参数是一个关键设置,用于控制服务器在处理客户端连接时是否执行DNS反向解析。这个参数的不当使用可能导致用户权限问题,特别是在服务器管理过程中。当我们启动MySQL服务时不使用`SKIP-...

    连接MySql速度慢的解决方法(skip-name-resolve)

    原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能在MySQL的授权表中使用主机名了而只能用ip格式。 附:How MySQL uses DNS When a new thread connects to mysqld, mysqld will spawn a new thread to...

    远程连接mysql数据库注意事项记录(远程连接慢skip-name-resolve)

    远程连接MySQL时,如果感到速度缓慢,可能是因为MySQL在尝试进行DNS反向解析,验证客户端的主机名。这可能导致因DNS服务器响应时间过长或质量问题而引起的延迟。 3. **解决远程连接慢的方法:skip-name-resolve**...

    MySql使用skip-name-resolve解决外网链接客户端过慢问题

    总结来说,`skip-name-resolve`是一个非常有用的工具,尤其在面临DNS解析延迟或大量客户端连接时,它可以显著提高连接速度。但是,它也限制了使用域名进行权限管理,所以需要权衡其利弊。同时,了解如何正确配置和...

    禁止mysql做域名解析(解决远程访问mysql时很慢)

    通过在MySQL服务器端添加`skip-name-resolve`配置,可以避免DNS解析导致的延迟,从而提高连接速度。同时,确保PHP的MySQL驱动程序配置正确,以及PHP与MySQL之间的网络连接稳定,也是优化远程连接性能的关键。 总之...

    解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)

    您可能感兴趣的文章:C#访问SqlServer设置链接超时的方法SQL查询超时的设置方法(关于timeout的处理)Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve)PHP访问MySQL查询超时处理的方法SQL语句执行

    MySQL数据库远程连接很慢的解决方案

    总的来说,当面临MySQL远程连接速度慢的问题,尤其是在没有外网连接,DNS解析无法完成的环境中,开启`skip-name-resolve`是一个值得考虑的解决方案。通过禁用DNS查找,可以显著减少由于DNS解析延迟引起的连接延迟,...

    Linux mysql访问慢

    skip-name-resolve 语句的作用是跳过 DNS 解析,避免 DNS 解析过程中的延迟。skip-grant-tables 语句的作用是跳过权限表检查,减少权限检查的开销。 重启数据库服务 修改 my.cnf 文件后,需要重启 MySQL 数据库服务...

    远程连接MySQL速度慢的解决方法以及MySQL解析DNS的流程图[附PDF下载]

    在MySQL配置文件中,有一个选项`skip-name-resolve`,当设置为启用(即为`ON`状态)时,MySQL将跳过DNS解析过程,直接使用IP地址连接到MySQL服务器。这种方式可以显著减少解析域名所需的时间,特别是在DNS响应较慢的...

Global site tag (gtag.js) - Google Analytics