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

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解析导致该问题。无法从客户端途径去解决,也就是说我们设备无法处理这种情形。

(0)

相关推荐

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

    一.如何新建独立帐号并设置权限 这里我使用Navicat作为我的数据库管理工具,打开Navicat. 选择"用户"--"新建用户" 输入用户名.主机.密码,需要注意的是,主机那不是写"localhost",而是写"%" 然后可以设置"服务器权限" 和指定数据库的权限,最后保存退出即可 二.远程连接慢 慢是一个很大的问题,网上的办法是在my.ini的"[mysqld]"下面加入一行&quo

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

    登陆到mysql,查看进程的信息 复制代码 代码如下: show processlist; 发现大量的进程的状态为 login 原来默认的时候mysql启动时是不使用 skip-name-resolve选项的,这样的话,从其它主机的连接会比较慢,因为mysql会对这个ip做dns反向查询,导致大量的连接处于 login状态..... 解决这个问题有两个办法 一是加入 skip-name-resolve参数重启mysql 二是在 /etc/hosts中加入一句 192.168.0.2 server

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

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢. 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve. 原因是默认安装的MySql开启了DNS的反向解析.如果禁用的话就不能在MySQL的授权表中使用主机名了而只能用ip格式. 附:How MySQL uses DNS When a new thread connects to mysqld, mysqld will spawn a new thread t

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

    在腾讯云上面搭建的mysql使用开发的电脑上navicat进行访问时总是特别的慢,原来是Mysql会对请求的地址进行域名解析,开发的电脑并没有域名,所以会导致特别的慢,使用以下进行解决 [mysqld] skip-name-resolve skip-grant-tables 官方的解释 How MySQL uses DNS When a new thread connects to mysqld, mysqld will spawn a new thread to handle the requ

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

    mysql 加了 skip-name-resolve不能链接的问题, 要确认 MySql 是否采用过主机名的授权 在 MySql Server 的配置文件 My.ini 中,增加如下两行: [mysqld] skip-name-resolve 它将禁止 MySql Server 对外部连接进行 DNS 解析,使用这一选项可以消除 MySql 进行 DNS 解析的时间. 但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求. 如果开启 ski

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

    MySQL数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名.用主机名在权限系统里面进行权限判断.反向DNS解析是耗费时间的,有可能让用户感觉起来很慢.甚至有的时候,反向解析出来的主机名并没有指向这个IP地址,这时候就无法连接成功了. 可以在配置文件里面禁止MySQL进行反向DNS解析,只需在my.cnf的[mysqld]段落中加入如下行即可: skip-name-resolve (windows与linux下一样的) 设备在连

  • MySQL使用ReplicationConnection导致连接失效解决

    引言 MySQL数据库读写分离,是提高服务质量的常用手段之一,而对于技术方案,有很多成熟开源框架或方案,例如:sharding-jdbc.spring中的AbstractRoutingDatasource.MySQL-Router等,而mysql-jdbc中的ReplicationConnection亦可支持. 本文暂不对读写分离的技术选型做过多的分析,只是探索在使用druid作为数据源.结合ReplicationConnection做读写分离时,连接失效的原因,并找到一个简单有效的解决方案.

  • 解决mysql连接超时和mysql连接错误的问题

    目录 mysql连接超时和mysql连接错误 连接MySQL错误create connection SQLException, url: jdbc:mysql://localhost:3306/*****? 解决方法 mysql连接超时和mysql连接错误 在生产环境中,偶尔且不规律的出现mysql连接超时和创建连接出错的问题: 15-09-2020 13:25:46 INFO - java.sql.SQLNonTransientConnectionException: Could not cr

  • mysql密码过期导致连接不上mysql

    mysql密码过期了,今天遇到了连接mysql,总是连接不上去, 错误现象1: An attempt by a client to checkout a Connection has timed out 第一次出现连接超时错误,第一反应是去修改cpool.checkoutTimeout参数为18000,初始为500,结果还是错误, 在修改为36000,并且加大了c3p0连接数cpool.maxPoolSize=100 这个时候出现下面错误现象2 Connections could not be

  • Spring Boot连接超时导致502错误的实战案例

    1.问题描述 内部系统之间通过Nginx来实现路由转发. 但最近发现有一个系统,经常报502错误,每天达到上百次,完全无法忍受. 2. 原因排查 于是进行排查, 发现配置人员把连接超时时间(server.tomcat.connection-timeout)的单位,理解为秒,实际上是毫秒. SpringBoot的部分配置如下: # Tomcat server: tomcat: uri-encoding: UTF-8 max-threads: 1000 min-spare-threads: 30 c

  • 低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限

    目录 现象 根因分析 getLastPacketReceivedTimeMs()方法调用时机 解决方案 现象 应用升级MySQL驱动8.0后,在并发量较高时,查看监控打点,Druid连接池拿到连接并执行SQL的时间大部分都超过200ms 对系统进行压测,发现出现大量线程阻塞的情况,线程dump信息如下: "http-nio-5366-exec-48" #210 daemon prio=5 os_prio=0 tid=0x00000000023d0800 nid=0x3be9 waiti

  • MongoDB查询字段没有创建索引导致的连接超时异常解案例分享

    今天在现场的哥们发来异常,让我解决,错误信息如下: 复制代码 代码如下: HTTP Status 500 - Read operation to server 192.168.1.110:20001 failed on database wpdb; nested exception is com.mongodb.MongoException$Network: Read operation to server 192.168.1.110:20001 failed on database wpdb

  • 解决JDBC连接Mysql长时间无动作连接失效的问题

    错误场景介绍 做的有一个项目使用JDBC手动创建Connection实现了一个简单的自定义数据库连接池,用来支持Canal解析数据库Binlog指定业务库的插入修改SQL来进行数据库分表备份(按照月份)操作. 但是发现当一个一段时间(较长)没有进行数据库操作时,连接都失效了,导致SQL执行失败失效提示为No operations allowed after connection closed 查明原因 经过搜索发现这个问题是由于Mysql默认一个已创建的长连接28800秒(八小时)内没有任何动作

  • 顺利做好IP反向解析(PTR记录)的步骤分析

    在垃圾邮件泛滥的今天,垃圾邮件给我们的生活.工作.学习带来了极大的危害.由于SMTP服务器之间缺乏有效的发送认证机制,即使采用了垃圾邮件识别阻拦技术效果仍旧一般,再者垃圾邮件识别阻拦技术主要是在收到信件后根据一定条件进行识别的,需要耗费大量服务器资源,如果能在信件到达服务器之前就采取一定手段,这样就能大大提高服务器效率了.因此,目前许多邮件服务器如sina.com,hotmail.com,yahoo.com.cn等等都采用了垃圾邮件识别阻拦技术+IP反向解析验证技术以更好的阻拦垃圾邮件.    

  • django反向解析URL和URL命名空间的方法

    本文介绍了django反向解析URL和URL命名空间,分享给大家,具体如下: 首先明确几个概念: 1.在html页面上的内容特别是向用户展示的url地址,比如常见的超链接,图片链接等,最好能动态生成,而不要固定. 2.一个django项目中一般包含了多个django应用(app). 3.一个视图(view)往往对应多个url地址. 在django中实现反向解析URL必备条件就是 url和view能一对一 的匹配. (通过view找到唯一一个对应的url,通过url也能找到唯一一个view) 最

随机推荐