Fixing Poor MySQL Default Configuration Values

原文地址:http://jeremy.zawodny.com/blog/archives/011421.html

[几句废话:本人英文很烂,今天很无奈地第一次认真地看英文文档,很纠结,花了好长时间才看了那么一丁点儿,回过头看,竟又忘记自己刚看的内容了~速度太慢,汗||于是想想试着翻译并记下来吧,顺便大家也给我指出错误啊~Thank you~]

    我最近一直在积累一些MySQL在大的生产环境会产生问题的默认配置变量。它们都具有相同的特性那就是,一两次网络波动就会触发一些非常不想看到的结果。

max_connect_errors

    如果客户端连接到MySQL时遇到问题,服务器过了connect_timeout 时间后将不再等待,并且增加连接主机错误的次数。当这个错误次数达到max_connect_errors后,客户端将被拒绝连接,直到你执行FLUSH HOSTS命令。更加糟糕的是,如果你的网络时不时地波动,并且没有重新启动MySQL,这个错误数就会日积月累,最后指不定哪天晚上突然出故障,让你忙碌整夜。

        在MySQL的docs里看到主机被阻止了,可悲的是,这时没有办法去彻底阻止这个检查。却不能实现设置变量为0,你的真正解决方案只有(a)设置一个非常大的值(max_connect-error=1844674407370954751);(b)临时运行FLUSH HOSTS命令。

connect_timeout

         这跟上面的问题相关,在网络拥塞的情况下(不管是客户端或者服务端),刚开始连接可能要花费几秒才能完成,默认的connect_timeout 时间是5秒。当你被这种情况所牵绊,上面的这个max_connect_errors问题就会很有冲击力。

        为了避免这种情况,首先可以尝试设置connect_timeout一个值像15 或 20。并且考虑设置thread_cache_size为一个非零值。当服务器在非常短的时间周期里,时常保持高的新连接数,这个设置将帮助改善这种情况。

skip-name-resolve

       在默认情况下,MySQL做一个反向DNS查询对每个过来的连接,这就太糟糕了,似乎不论你有多么好的基础设施,在DNS服务器有标志。 MySQL的主机缓存存在,让那些查找降到最低值。我曾经见过由于这个原因导致了至今8年的麻烦。当这种情况发生的时候,我只能假定这个主机缓存存在一个bug或分析lib库。

       我建议在/etc/my.cnf里添加skip-name-resolve来完全跳过个DNS。仅仅用IP地址或你授权的范围。似乎减缓从DNS服务器的回复也能帮助你改善connect_timeout的牵绊。试想有2、3台DNS服务器配置,但是第一个不可用。

slave_net_timeout

      当主从数据库的网络连接在某种程度上被中断,任何一方都不能检测(像防火墙或路由改变),你必须等待直到slave_net_timeout设置的时间过后,从数据数才知道连接错误了。它将尝试再次连接主服务器并且采集哪里使它停止。这真是太可怕了。

       然而,这个默认值是3600秒,整整一个小时!太不好了。

      谁会希望他们的从服务器在检查它们哪里出问题之前,闲置那么长时间时间?我觉得任何人都不想要这种结果。

      我的建议,如果你处在一个繁忙的环境,设置你的值大约30秒。