【问题标题】:Beanstalk and Time Syncronization between computers on LAN局域网计算机之间的 Beanstalk 和时间同步
【发布时间】:2023-05-03 06:32:01
【问题描述】:

长话短说,我的工具对我的 MySQL 数据库服务器的冲击太大,我遇到了很多问题。因此,我创建了一组工具(PHP 和 Ruby),它们使用 Beanstalk 将我想要在 DB 上完成的操作传达给一组始终运行的 DB 连接。 Beanstalk 管用于传入作业和回复。

但是,我已将 ExpireTime 添加到我的数据库请求的作业数据中。本质上,如果 DB 请求作业没有在相当短的时间窗口内执行,则根本不会执行请求。无论如何,请求任务都会自行超时,因此有一个较短的时间窗口可以防止 DB 执行脚本执行一堆永远不会使用的 DB 请求。

只要一切都在一台机器上,这一切都可以正常工作。现在我将它扩展到第二台机器,我立即遇到了请求被视为已过期的问题。

任务的当前到期时间是 10 秒 - 对于我试图完成的简单数据库请求来说,这已经相当长了。如果我将 10 秒增加到足够大的数字,那么 DB 请求会快速执行且不会出现问题。

所以我怀疑这个问题归结为 1 台计算机认为它是 12:00:XX 而另一台认为它是 12:00:YY 并且 XX 和 YY 之间的差异至少是 8 或 9 秒。

我在局域网中使用 Ubuntu 12.04 桌面和服务器。我用 Ruby (1.8.7) 和 PHP (5.3.10-1ubuntu3.4) 编写程序,使用这个 Beanstalk 队列作为一种 DB 连接池以及一个任务队列,用于在分布式中执行项目/站点相关任务方式。对于 PHP,我使用 pheanstalk,对于 Ruby,我使用 beankstalk-client gem。

我考虑过的一个技巧是创建一个豆茎管,其中执行数据库请求的计算机大约每秒输出一次它的当前时间。然后,将请求放入队列的分布式计算机将需要获取该作业(并释放它 - 而不是删除它)以获得最新的时间戳。这是粗略的并且(我相信)会导致冲突 - 即请求等待获取当前时间的作业数据 - 因为我增加了我添加到此的计算机数量。

我希望这个论坛上的某个人有更好的方法。

【问题讨论】:

  • 仅供参考:我实施了我的 hack。到目前为止看起来不错。唯一真正的问题是我必须通过与第二个 beanstalk 的第二个连接来实现它。我还没有时间对其进行全面测试,但到目前为止它工作得很好。

标签: ubuntu time beanstalkd


【解决方案1】:

“正确”的解决方案是在机器上设置一个 NTPd 守护程序(或至少定期运行程序 ntpdate -s _servername_),以便服务器时钟正确,并在它不对齐时不断得到纠正。

【讨论】:

  • 所以我实现了我的 hack 并且它一直工作到带有数据库的服务器繁忙为止。然后似乎在某个地方出现了延迟——甚至可能是在将工作放入豆茎队列中。因此,我实施了您的 NTP 更新 - 每小时一次的 cron 作业,以保持服务器非常及时。这改善了一些事情,但还不够。所以我现在也在尝试实现 memcache。 (我之所以推迟是因为我正在考虑自定义缓存,并且因为缓存要求我为我对数据库所做的每条 SELECT 语句指定一个过期时间。对于我现有的代码来说,这是一项漫长而乏味的任务。)
最近更新 更多