欢迎各位兄弟 发布技术文章
这里的技术是共享的
今天有台数据库异常,登录服务器后执行show processlist,发现大量的 unauthenticated user 状态。如下:
于是第一时间想到DNS反向解析的问题,于是看看是否关闭DNS解析:
mysql> show variables like '%skip_name_resolve%'; +-------------------+-------+| Variable_name | Value |+-------------------+-------+| skip_name_resolve | ON | +-------------------+-------+1 row in set (0.00 sec) mysql>
可以看见已经打开禁止DNS解析的参数。在google很久后无解,最后发现是网络问题,由于web到数据库服务器丢包,延时非常严重导致。当时ping的延时已经达到20 ms,非常慢了。如下图。
网络恢复正常以后,延时在10 ms,最后大量的unauthenticated user状态消失。
来自 http://www.cnblogs.com/gomysql/p/4341851.html
linux服务器突然负载变重。在top中发现cpu被大量占用。网站反应很慢,并出现僵尸进程. 其实当时只有50个左右的并发呼叫。远远达不到正常水准. 重新启动机器问题也没得到解决。考虑到在top中看到mysqld占用的资源最多,就进入mysql控制台,运行show processlist命令, 发现某进程的信息很特殊:
发现这算是mysql系统上的特殊设定。不管连接是通过hosts还是ip的方式,MySQL都会对DNS做反查,IP到DNS,由于反查的接续速度过慢(不管是不是isp提供的dns服务器的问题或者其他原因),大量的查询就难以应付,线程不够用就使劲增加线程,但是却得不到释放,所以MySQL会“假死”。
因此只要关闭mysql的反向解析就可以了。
实现:
有2种方法关闭mysql反向解析功能:
1./usr/local/mysql/bin/mysqld_safe –skip-name-resolve –user=mysql&,启动mysql时添加–skip-name-resolve参数
2.修改mysql配置文件,编辑/etc/my.cnf,在[mysqld]段中加入skip-name-resolve,重启mysql即可。
附录:
1.mysqladmin简单监控mysql情况
# mysqladmin -uroot -p******** status -i 1
发现Queries per second avg只有200左右,可以说很低,但是Threads确非常不稳定,居然会瞬间升级200以上,一般情况下这个线程这个值都是不会高于5的个位数!
然后继续看
# mysqladmin -uroot -p******** processlist
2.发现大量unauthenticated user连接信息
mysql >show full processlist;
13012 unauthenticated user x.x.x.x:2501 None Connect Reading from net
10056 unauthenticated user x.x.x.x:2805 None Connect Reading from net
10311 unauthenticated user x.x.x.x:2306 None Connect writing to net
10326 unauthenticated user x.x.x.x:2715 None Connect login
10422 unauthenticated user x.x.x.x:2811 None Connect login
查阅网上资料,主要介绍解决方法如下:
1. 在 /etc/my.cnf 通过添加 skip-name-resolve 参数,关闭mysql的dns反查询,mysql使用IP授权
2. 在 /etc/hosts 添加IP与主机名对应关系 ,检查 /etc/resovle主DNS服务.
3. 调整mysql max_connections,max_allowed_packet ,wait_timeout,interactive_timeout 参数
经确认其实上面配置大部分参数生产环境都是已经配置过,出现大量unauthenticated user 信息时表明mysql没有给这些客户端连接请求确认凭证,也就是说mysql无法确认这些连接使用的数据库账号信息,在wait_timeout之内mysql一直等待这些连接完成, 通过测试 telnet x.x.x.x 3306 观察,在mysql数据库也会出现一条 unauthenticated user x.x.x.x:4706 None Connect Reading from net 连接, 因此这种现象不一定就是数据库问题 ,下面这些都有可能产生这种现象
1.如果应用安全问题出现大量数据库探测,出现大量这种未经授权的连接
2.应用服务压力过大出现线程异常中断导致出现大量异常数据库连接
3.应用服务异常,导致出现大量异常数据库连接
4. MySQL 客户端连接版本问题,验证协议不兼容,尤其注意old-password验证方式