我在自定义的Joomla应用程序中使用Gearman,并使用Gearman UI来跟踪活动的工人和工作编号。
我正面临MYSQL加载和连接数的问题,我无法跟踪问题,但我有几个问题可以帮助我。
1- Gearman Workers是否为每个作业启动一个新的数据库连接,还是它们共享同一个连接?
2-如果Gearman在每次作业运行时启动一个新连接,我如何更改它以使所有作业共享相同的连接?
3-我如何平衡多个服务器之间的负载?
4-是否有类似"按需付费"的MYSQL主机包?如果有,请提一提。
非常感谢!
在使用带有工人的任何类型的作业队列时,这通常是一个被忽视的问题。100个worker将分别打开一个单独的数据库连接(它们是单独的PHP进程)。如果MySQL配置为允许50个连接,工人将开始失败。回答您的问题:
1)每个worker运行在一个PHP进程中,该进程将打开一个数据库连接。worker不能共享数据库连接
2)如果只有一个worker正在处理作业,那么只会打开一个数据库连接。如果有50个worker正在运行,那么预计会有50个数据库连接。因为这些不是web请求,所以持久连接不起作用,共享不起作用。
3)你可以通过增加READ slave来平衡负载,并使用MySQL代理来分配负载。
4)我从未见过一个现收现付的MySQL托管解决方案。请您的提供商增加您的连接数。如果他们不能,可能是时候运行你自己的服务器了。
而且,gearman服务器进程本身将只使用一个数据库连接来维护队列(如果您启用了mysql存储)。
可以用来尝试使工作代码与数据库良好配合的策略:
-
每个作业结束后,终止worker并重新启动它。在收到新作业之前,不要打开新的数据库连接。
-
每次查询结束后关闭数据库连接。如果你看到很多连接在"睡眠"状态下打开,这将有助于清理它们并保持低数据库连接。
每次查询后尝试 缓存结果不变的频繁查询,以保持低数据库连接
确保您的表被正确索引,以便查询尽可能快地运行。
确保在try/catch块中捕获数据库异常。添加重试逻辑(while循环),工作线程会在尝试10次之后优雅地失败。
$pdo = null;
(如果您使用PDO)。我认为最重要的是要看,在其他任何事情之前,是MySQL加载。可能是您有一些非常繁重的查询导致了这种混乱。检查MySQL慢速查询日志了吗?如果有,你发现了什么?请注意,任何执行时间超过1秒的查询都是慢查询。