【问题标题】:PHP Gearman too much mysql connectionsPHP Gearman mysql 连接过多
【发布时间】:2016-11-13 14:36:00
【问题描述】:

我在自定义 Joomla 应用程序中使用 Gearman,并使用 Gearman UI 来跟踪活跃的工人和工作编号。

我遇到了 MYSQL 负载和连接数的问题,我无法跟踪问题,但我有几个问题可能对我有帮助。

1- Gearman Workers 是否为每个作业启动一个新的数据库连接,或者它们是否共享相同的连接?

2- 如果 Gearman 每次运行作业时都会启动一个新连接,我该如何更改它以使所有作业共享相同的连接?

3- 如何平衡多个服务器之间的负载?

4- 是否有类似“现收现付”的 MYSQL 托管包?如果是,请提及。

非常感谢!

【问题讨论】:

  • 我不知道您的应用程序运行得如何。 Gearman 本身仅使用持久队列来写入队列并在重新启动后从中读取。所以 Gearman 只使用一个连接。我相信你的工作每次都会启动一个新的mysql连接,因为这是你的工作,gearman在这里帮不了你。你必须在你的工作代码中修复它。 php.net/manual/en/features.persistent-connections.php 可能会在这里提供帮助。到 3) 那是什么齿轮人?只有一个服务器和来自世界各地的多个客户端...gearman 会处理它..4) - 抱歉,不知道 :(
  • @dominik.mank 3) 我想在多台服务器上运行工作人员,而不是在一台服务器上。使用 Gearman 可以吗?
  • 请查看来自分销商gearman.org 的图片gearman.org/img/cluster.png。是的,这是可能的,但我不能说它是如何为您的应用程序完成的,因为这取决于您如何使用 gearman。

标签: php mysql pdo joomla gearman


【解决方案1】:

在对工作人员使用任何类型的作业队列时,这通常是一个被忽视的问题。 100 个工作人员将分别打开一个单独的数据库连接(它们是单独的 PHP 进程)。如果 MySQL 配置允许 50 个连接,worker 将开始失败。回答您的问题:

1) 每个工作人员各自在一个 PHP 进程中运行,该进程将打开 1 个数据库连接。 Worker 不共享数据库连接。

2) 如果只有一名工作人员正在处理作业,则只会打开一个数据库连接。如果您有 50 个工作人员正在运行,那么预计会有 50 个数据库连接。由于这些不是 Web 请求,因此持久连接将不起作用,共享将不起作用。

3) 您可以通过添加 READ 从属服务器来平衡负载,并使用 MySQL 代理来分配负载。

4) 我从未见过按需付费的 MySQL 托管解决方案。要求您的提供商增加您的连接数。如果他们不这样做,可能是时候运行您自己的服务器了。

另外,gearman 服务器进程本身将只使用一个数据库连接来维护队列(如果您启用了 mysql 存储)。

您可以用来尝试使您的工作代码与数据库很好地配合使用的策略:

  1. 在每个作业之后,终止工作程序并重新启动它。在收到新作业之前不要打开新的数据库连接。使用supervisor 让您的员工始终保持运转。

  2. 每次查询后关闭数据库连接。如果您看到许多连接在“睡眠”状态下打开,这将有助于清理它们并使数据库连接保持在较低水平。在每次查询后尝试$pdo = null;(如果您使用 PDO)。

  3. 在结果不变的情况下缓存常用查询,以保持数据库连接低。

  4. 确保您的表已正确编入索引,以便查询尽可能快地运行。

  5. 确保在 try/catch 块中捕获数据库异常。添加重试逻辑(while 循环),其中工作人员将在 10 次尝试后优雅地失败。确保作业在失败后被放回队列中。

【讨论】:

  • 谢谢@Kris 我想这回答了我所有的问题。我现在只有一个问题。如何使用多个服务器来运行 Gearman 工作者?我应该在所有服务器上注册工作人员并将文件复制到所有服务器并仅使用( addServer )功能,还是究竟是什么?
  • 是的,没错,您将代码复制到更多服务器,基本上是克隆它们,然后运行工作程序。这就是随着工作量增加而向外扩展的方式。
【解决方案2】:

我认为首先要看的最重要的事情是 MySQL 负载。可能是您有一些非常繁重的查询导致了这种混乱。你检查过MySQL慢查询日志吗?如果有,你发现了什么?请注意,任何执行时间超过一秒的查询都是慢查询。

【讨论】:

  • 好吧,我正在为工作人员使用持久存储,这意味着在数据库中插入了太多的序列化数组来管理作业队列。我认为这就是我面临这么多 MYSQL 负载的原因。目前,我正在尝试寻找不同的解决方案,例如会话或文件存储。
猜你喜欢
  • 2013-06-10
  • 1970-01-01
  • 2016-04-24
  • 2013-12-16
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
相关资源
最近更新 更多