mysql数据库有一台单独的服务器在做,WEB服务器有4台机器做集群。4台机器的web分别去连接mysql的数据库。

这个架构进行一段时间后,连续出现了几次怪问题,WEB连接mysql回常慢。光连接时间就达到十几秒。重启mysql,会好一点,但过不了多久,问题又会出现。

在故障排除的时候我发现一个问题,如果在mysql服务器上连接mysql并不慢。这样我又开始 怀疑是服务器间的网络问题了,但是服务器间copy文件速度非常快。说明网络是好的。

后来怀疑了很多问题,都被一一排除了。

我的mysql服务器上有两块网卡,发现:

mysql -h 127.0.0.1 很快,比较正常

mysql -h 192.168.x.xmysql -h 218.x.x.x就比较慢了。

这样看起来像是IP地址反向解析的问题。我在自己的dns server上加了一个mysql服务器IP 192.168.x.x的反向解析。发现mysql -h 192.168.x.x 就正常了。

说明确实是反向解析的问题了。查找mysql手册,发现其实mysql有一个参数skip-name-resolve可以解决这个问题。加入/etc/my.cnf内便可。看看手册内的解释:

你可以用–skip-name-resolve选项启动mysqld来禁用DNS主机名查找。然而,在这种情况下,你只可以使用MySQL中的授权表中的IP号。

如果你有一个很慢的DNS和许多主机,你可以通过用–skip-name-resolve禁用DNS查找或增加HOST_CACHE_SIZE定义(默认值:128)并重新编译mysqld来提高性能。

这样就可以得出一个结论了:

客户端去连mysql时默认是要反向解析的,因为权限的原因。mysql接到客户端第一次连接时会去做反向解析,并存在Host_cache内。下次就从cache内读了。所以除了第一次比较慢以外,后来的连接都是很快的。

因为我有多台服务器频繁的去连mysql数据库,造成host_cache不够用,所以每次连接时都要做反向解析,造成连接速度缓慢了。