全部博文(321)
分类: LINUX
2013-06-07 13:38:52
今天在与本地开发人员沟通过程中得知,使用本地局域网MySQL数据库配置时Web应用响应速度极慢,因此不得不采用开发人员本机的数据库做项目开发。
在带宽和网络无故障的情况下通常该问题是由数据库配置造成,由于使用数据库域名配置(数据库IP配置效果一样),使得MySQL数据库在响应Web请求时增加了DNS反向解析的过程,具体过程如下:
当客户端(此处为Web浏览器)向数据库服务mysqld发起新的连接时,mysqld会分配一个响应线程处理接收到的请求连接。响应线程首先会在主机名缓冲区中检查发送请求的主机是否存在,如果不存在,该线程会尝试做主机名解析操作:
1、响应线程获取到连接请求的IP地址,并通过gethostbyaddr()函数获取到一个主机名,然后根据获取到的主机名使用 gethostbyname()函数反向解析得到一个IP,最后对该IP地址与连接请求的IP以确认其为源IP地址。
2、如果操作系统支持安全线程函数gethostbyaddr_r()和gethostbyname_r(),则响应线程会使用安全线程函数执行主机名解析。
3、如果操作系统不支持安全线程函数,响应线程将通过线程互斥执行gethostbyaddr()和gethostbyname(),在该线程没有释放线程互斥之前其他响应线程无法做主机名解析操作(主机名不在主机名缓冲区内)。
因此,在MySQL数据库配置文件(Windows下为My.ini,Linux下为My.cnf)中添加
skip-name-resolve
可让MySQL禁用DNS反向解析,从而提升远程访问MySQL的速度,此外也可以增加MySQL配置的HOST_CACHE_SIZE值(默认为128)来达到相同效果。
但禁用DNS反向解析后会影响MySQL数据库授权表user中的host字段,使得以主机名为授权的用户无法正常访问MySQL,因此该表中的host字段值应全部使用IP地址或通配符,比如“192.168.1.%”或“%”,但不能用类似“%.domain.com”的值。
*补充说明:
在禁用DNS反向解析后,MySQL数据库中user表的host字段中若有localhost值,即便是在数据库所在系统的hosts文件中localhost指定IP,也会影响数据库的无法正常响应请求,因为MySQL解析主机名过程也包含对hosts文件的查询。
转自:http://blog.idf.cn/archives/282.html