gpt4 book ai didi

mysql - 使用 MySQL LOCK TABLE 确保云中 cron 作业的一个实例(自动扩展 EC2/ELB)

转载 作者:行者123 更新时间:2023-11-29 11:52:53 24 4
gpt4 key购买 nike

在启用了自动扩展功能的 Amazon Elastic Beanstalk 上部署应用程序时,四处寻找运行 cron 作业的最佳方式后,我发现了一些解决方案。

问题:运行cron的问题在 beanstalk(或自动扩展云)上,每个实例都有自己的 cron 守护进程,并且脚本在自动扩展时将同时运行多个副本(在每个 EC2 实例上)。

提供的解决方案:

  1. 使用工作实例 + SQS
    • 问题:它太复杂了,我不想为一项简单的 cron 作业(例如向用户发送警报)的额外实例付费。
  2. 使用cronlock
    • 问题:需要您安装中央 Redis 服务器。

我自己的解决方案:

我的网站已经有一个 Mysql 服务器 (Amazon RDS),所以我想这也许可行吗?

  1. 我可以创建一张只有一个字段的表 last_run
  2. 创建以下脚本并将其添加到 cron 守护进程:
    1. LOCK TABLES crond WRITE
    2. 读取crond中的值。 last_run
    3. 如果time() -last_run > 5(即已过去 5 秒)然后我更新 last_run 中的时间字段到当前time .
    4. 如果time() -last_run < 5 然后我立即退出,说 cron 是在不到 5 秒前执行的(即其他某个实例首先获得了 LOCK)
    5. UNLOCK TABLES .
    6. 如果 last_run 则生成实际的 cron 作业脚本> 5(即#3 为真)

问题:

  • 这足以确保一次只运行一份 cron 副本吗?
  • 是否有比我想要实现的目标更简单的替代方案?

在我设计和测试这个东西之前,您的见解将会很有帮助。

最佳答案

Elastic Benastalk 包含一个专门用于此目的的机制。它称为leader_only,确保您的cron 将在单个实例而不是所有实例上运行。 See documentation here

这是一个解决这个问题的 stackoverflow 线程:AWS Elastic Beanstalk, running a cronjob

如果这对您不起作用,请输入 Cronally有机会。

关于mysql - 使用 MySQL LOCK TABLE 确保云中 cron 作业的一个实例(自动扩展 EC2/ELB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33711872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com