如何限制每个用户的MySQL最大连接数

发布于:2020-12-19 19:02:30

0

2722

0

MySQL 最大连接数 限制

是单个站点在MySQL服务器上造成了严重破坏吗?

通过设置每个用户的MySQL连接限制,可以保护服务器上的其他站点免受单个站点的影响,从而导致连接过载。

如果是,您并不孤单。

在我的MySQL优化服务中,我经常看到服务器上有几个站点占用100%的可用MySQL连接。

您可能熟悉my.cnf中的max_connections设置;但是您知道吗,还有一个max_user_connections变量?

所述MAX_USER_CONNECTIONS设置限制在每个用户的基础数据库的连接数。

如果您想学习如何将此变量应用于共享主机服务器,请继续阅读。

最大用户连接数

这个变量的作用恰如其名,它设置了一个限制,即每个用户可以同时连接到MySQL数据库的最大最大连接数。

在共享主机系统上,这是一项功能强大的设置,因为您可以使用它来防止单个用户用尽所有MySQL连接。

设定极限

通常,我建议您将max_user_connections设置为max_connections设置的50-75%。您可以在my.cnf的mysqld部分中设置此值:

1个
2
3
4
5
6
7
cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
max_connections = 400
max_user_connections=200

在此示例中,我们总共允许400个连接,一个用户最多可以使用200个连接。

我从哪里得到这个号码?

这基于我在100台MySQL服务器上的工作。通常,我发现只有一两个用户参与了大多数MySQL连接。通过将此数字设置为50-75%,您可以有效地为其他用户和站点保留MySQL连接插槽的25-50%。

如果您想更精确地进行调整,建议您监视MySQL以找出高峰连接时间何时发生。然后在此期间,对服务器进行轮询,以查看谁在建立最多的连接。

我对此不太科学。我通常只在MySQL命令行上运行show process list。我将其与通过诸如NewRelic,ServerDensity之类的工具或安装的任何服务器监视工具提供给我的跟踪结合起来。

然后,我设置了一个限制,该限制将阻止用户接管数据库,但仍允许足够的连接以使站点正常运行。

好处

通过设置max_user_connections,可以减少单个用户帐户对服务器上所有站点产生负面影响的可能性。这在共享主机设置中特别有用,在共享设置中,您可能无法控制最终用户生成的代码或流量。

如果DoS或搜索漫游器为网站带来了大量流量,这也将有所帮助。我已经看到过攻击性搜索机器人可能淹没MySQL系统的情况。与正常流量不同,搜索引擎会访问多个页面-大多数页面不太可能缓存在MySQL的查询缓存或其他缓存中。结果,负载和MySQL连接可能会激增。设置max_user_connections限制可以帮助解决这种情况。

每个应用一个用户

您应该始终为每个应用程序使用唯一的MySQL用户帐户。这样可以提高安全性,并使连接问题的诊断更加容易。

我在单个租户服务器上看到的一个常见问题是,倾向于仅将一个用户用于所有数据库连接。

这是个错误。

对于每个应用程序,建议您创建一个特定的用户名和密码。出于安全和性能方面的考虑,这很好。

通过为每个应用程序使用特定用户,您可以轻松确定哪个应用程序正在与数据库建立大量连接。通过组合使用max_user_connections,可以减少单个应用程序使系统过载的可能性。

例如,在最近的MySQL优化案例中,我发现对论坛的搜索请求触发了长时间运行的MySQL查询。这些查询填满了整个服务器的连接插槽。结果,博客和购物车失败了。

通过使用max_user_connections,我们能够保护其他应用程序免受论坛讨论的困扰。

缺点

主要缺点是,如果将该数字设置得太低,则可能在繁忙的站点上偶尔引起错误。由于这些错误可能是零星的,因此可能很难检测到。

如果达到这些限制,大多数PHP应用程序将返回MySQL错误,提示与MySQL服务器的连接过多。如果您需要提高此限制,则Apache或PHP错误日志也可能提供线索。

带走

在繁忙的MySQL服务器上使用max_user_connections可以确定特定的MySQL用户活动,以免对其他用户造成负面影响。我建议将max_user_connections设置为您的总max_connections的50-75%。