前两天碰到的一个mysql怪问题
mysql数据库有一台单独的服务器在做,WEB服务器有4台机器做集群。4台机器的web分别去连接mysql的数据库。
这个架构进行一段时间后,连续出现了几次怪问题,WEB连接mysql回常慢。光连接时间就达到十几秒。重启mysql,会好一点,但过不了多久,问题又会出现。
在故障排除的时候我发现一个问题,如果在mysql服务器上连接mysql并不慢。这样我又开始 怀疑是服务器间的网络问题了,但是服务器间copy文件速度非常快。说明网络是好的。
后来怀疑了很多问题,都被一一排除了。
我的mysql服务器上有两块网卡,发现:
mysql -h 127.0.0.1
很快,比较正常
mysql -h 192.168.x.x
和mysql -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不够用,所以每次连接时都要做反向解析,造成连接速度缓慢了。