防止繁重的服务器查询导致 Apache/Mysql 过载

防止繁重的服务器查询导致 Apache/Mysql 过载

我对理解高服务器负载以及在常见场景中使用 Apache、MySQL 和 PHP 5 等解决方案实现某种类型的负载平衡有一些疑问。

在这个问题上我很了解贝宁格,想听听您的意见,因为我已经阅读了很多资料,但我完全不知道可能的产品或技术如何实现一个简单的、如果可能的话是免费的解决方案:
需要有关负载平衡的建议/意见+一些技术问题!
https://blogs.oracle.com/oswald/entry/easy_http_load_balancing_with

想象一个简单的示例,其中只有 1 个服务器和 2 个用户同时连接,用户 A用户 B

  • 用户 A 进行查询并请求大量数据,该查询可能会使 MySQL 服务器过载几分钟。即:

    从'包含 10GB 数据的表'中选择 *;

  • 用户 B 询问另一个小型快速查询,但 MySQL 服务器仍在忙于第一个查询。

上面的例子只是一个非真实的场景,具有糟糕的数据库表模式,以及一个可怕的查询,目的是询问在这些情况下 MySQL 和 Apache 会发生什么。

我想知道他们如何处理或解决这个问题,以及如何平衡它的负载,以便 MySQL 和 Apache 服务器永远不会因为来自单个用户的糟糕或缓慢的查询而挂断,同时他们仍然可以处理来自其余用户的其他查询。

非常感谢,如果我的问题在某些概念上存在错误,请见谅。请随意添加任何提示、有用的书籍或您自己的服务器和应用程序经验。

答案1

简短回答:如果您想防止因愚蠢查询而导致服务器过载,只需防止愚蠢查询即可。

长答案:

正如您所提到的,负载平衡在具有大量独立查询的环境中更为有效。大型、繁重的查询总是会导致服务器过载。但您可以通过设置配额来限制用户的发生率。搜索 Apache 的相关内容,或返回此处获取更多信息。

但最好的解决方案仍然是分析查询并针对每个查询确定:

  1. 它应该运行而无需采取任何进一步的行动
  2. 应该跳过并显示错误消息
  3. 它应该被发送到另一台服务器;这是一种预测平衡

现在,以便我们能够更详细地帮助您,您可以与我们分享更多细节,例如数据库结构、查询类型等。我们可以找到一些算法在 3 种情况之间切换。

答案2

正如你所说,Ninj,配额 Apache 模块可能是限制每个用户带宽的一个不错的选择。
如果它们具有以下功能,它将非常有用:

  • 设置最大和最小带宽以防止服务器过载。
  • 自动检测服务器负载并根据服务器负载自动限制每个用户。这个功能可能比较复杂,我不知道是否有任何 Apache mod 具有此功能。

找到以下 Apache 模块:

  • 阿帕奇黑匣子
  • Apache mod 限制
  • Apache mod 配额

mod_throttle 的替代方案

当然,首先应该需要防止简单查询导致 MySQL 过载。一个选项是设置配额,实现负载平衡,并检测和禁止不良或过载查询,如您所解释的那样。

相关内容