我一直在用MySQL后端构建PHP工具。使用多卷曲,我可以在一台旧PC(现在运行最新的Ubuntu桌面)上同时运行数十个脚本,有时甚至运行数百个脚本。每台计算机和每台计算机上的每个VM都能够运行数十个并发实例。

结果,我很快用完了MySQL连接。当我增加MySQL中的连接数时,我冻结了用于托管MySQL服务器的四核计算机。从那时起,我进入了一个方案,在该方案中,我有一个特定的数据库来管理其他数据库的请求,并使用运行数小时的cron作业,每台计算机维护几个打开的连接。在这一点上,我仍处于轻度测试阶段,还没有尝试同时发出数百个请求来查看MySQL服务器如何处理它。

相反,我遇到了另一个问题,我为所有这些尝试了几种解决方案,结果大致相同。问题是重复的数据被输入到数据库中,因为我在不同的机器上运行该工具的并发实例。例如,我将大量新数据输入到数据库中,并且该数据需要执行一些任务,例如将电子邮件地址链接到用户个人资料。我选择让后台cron进程一次处理一次,每台计算机每5分钟共享一次。由于它们都是同时启动的,因此它们都将捕获相同的电子邮件数据,并使用相同的逻辑对这些电子邮件数据进行过滤,从而确定哪些电子邮件地址具有更高的优先级。然后,每台机器都开始用它所选择的电子邮件来完成需要做的事情。由于它们都在同一时间启动,因此它们似乎经常会获取完全相同的数据并尝试进行相同的链接。这会导致链接表中的主键异常,但不会导致其他一些异常。因此,我最终会在某些表中出现重复数据,并且有时会出现不完整的链接。

我尝试随机化SELECT数据,以便机器在不同的数据集上工作。但是,相对于我希望工具完成的工作而言,这当然不是最佳选择,因此我需要更频繁地运行该工具,以便某些任务在所需的时间范围内完成。我尝试在数据库中创建一个标志,以指定1个服务器正在积极使用数据,因此所有其他服务器都应等待。有时可以使用,但有时2台计算机同时轮询该标志。由于我们正在谈论多台机器,所以我不会蜂拥而至。从我读过的内容来看,将表锁定在数据库中可能也不是一个好的解决方案。

所以我来StackOverflow寻求建议,而不是继续撞墙。

==更新==

Gearman看起来是一个很好的解决方案,所以我给了大拇指。但是,我无法在PHP安装中使用它。我在网上尝试了几套建议/说明,其中很多甚至都没有安装Gearman。据我所知,使用apt-get install gearman-server的建议确实安装了gearman-即,没有错误产生并且gearmand将运行。但是,当我尝试在脚本中使用Gearman客户程序和worker时,会因无法找到这些类而出现错误。

之后,我将gearman.ini文件添加到正确的目录。它有1行extension=gearman.so。这导致了另一个错误,PHP告诉我找不到gearman.so。我试图用sudo find / -name gearman.*运气不好找到gearman.so-它返回了C文件,但没有gearman.so。

目前,我确实非常希望实现Gearman,但是由于无法正常运行,我陷入了困境,并削减了PHP代码来实现分布式工具集。迄今为止,我的“解决方案”是创建一个标志,当该工具的1个实例执行某些操作会导致重复数据问题时,将其设置为“ OCCUPIED”。我创建了5个相同的标志,后缀为_1,_2,...,以便5个实例可以同时运行。 (我使用_1,_2,...在返回的DB数据中创建偏移量,以便没有2个工具实例在同一数据集上运行。换句话说,如果SELECT语句将返回100+行,而我仅一次处理10个,然后_1处理1-10行,_2处理11-20,……不理想,但应允许多个服务器同时在DB上运行,而无需创建重复的数据。)

如果DB API工具在30秒内未看到结果,则表明超时。现在的问题是尝试获取那些标志状态时频繁超时。

最佳答案

您应该使用队列系统将每个数据集作为一个项目插入队列中,并使用分布式服务器设置从队列中提取作业并针对数据库执行查询。使用队列将防止多名工人从事同一工作。

以Gearman为例


http://gearman.org/#how_does_gearman_work
http://us.php.net/gearman

10-07 12:17