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