合理设置max_user_connections以避免MySQL宕机

本文的原文地址在此:http://www.percona.com/blog/2014/07/29/prevent-mysql-downtime-set-max_user_connections/,以下是译文。

-----------------------------------------------------------这是一条分割线-----------------------------------------------------------

July 29, 2014 by Peter Zaitsev

MySQL宕机的原因之一是用户连接数耗尽。你见过这个错误吗:“ERROR 1040 (00000): Too many connections."如果你用过很长时间的MySQL,一定遇见过。这是一个让人很不爽的错误,而且有可能导致MySQL彻底宕掉。transient errors with successfultransactions mixed with failing ones as well as only some processes stopping torun properly causing various kinds of effects if not monitored properly.(这句话看不懂)

造成连接数耗尽的原因有很多,最常见的原因是Web/App服务器没有限制最大连接数或连接泄漏,导致产生了太多连接。

我见过的最普遍的解决办法是简单的增大最大连接数,使MySQL不会出现耗尽连接数的情况。但这种做法会造成资源利用的问题——大量的连接数必然需要大量的内存,这会导致MySQL被交换(swap)或被OOM killer进程杀掉,或者性能变得非常差。

其实面对这个错误(Too many connections.)有个更好的解决办法:给不同的程序分配不同的账户,并对每个账户设置不同的最大连接数。

mysql> GRANT USAGE ON *.* TO 'batchjob1'@'localhost'
    ->     WITH MAX_USER_CONNECTIONS 10;
这个源自MySQL 5.0版本的语句有很多好处:

安全:给子账户只分配必要的权限,可以使你的程序在遇见开发错误和入侵者时,显得更安全。

阻止连接数耗尽:如果程序有会耗尽连接数的bug,也只会使系统的这一部分受到影响,而其他的应用程序依然可以正常地使用数据库。

过载保护:连接数会限制并发查询的数量。过大的并发量也是导致宕机的常见原因,限制连接数可以降低程序并发查询带来的压力。

 在我看来,仅仅只设置my.cnf/my.ini中max_user_connection的值是很粗糙的解决方式,最好根据不同程序的实际情况分配不同的账户和连接数。只有在多租户(multi-tenant)的环境, max_user_connection才会显得非常有价值,因为该环境下的大量同级用户会共享整个系统。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章