【问题标题】:High availability periodic task (cron) on AWSAWS 上的高可用性定期任务 (cron)
【发布时间】:2014-01-21 02:27:28
【问题描述】:

在 AWS 上设置高可用性(多个可用区)周期性任务(可能使用 Cron 触发)的推荐方式/模式是什么?

我希望将软件安装在多个可用区的多个 EC2 实例上,但一次只能在一个实例上运行任务。哪个实例都没有关系。

在迁移到 AWS 之前,我们曾经在 MySQL 实例中使用数据库锁定 - 只有成功创建锁的实例才会运行。

但是在 AWS 上一定有更好的方法吗?特别是在不需要数据库的情况下。

谢谢!

尼克。

【问题讨论】:

  • 任务多久运行一次,需要多长时间?
  • 您是否检查过简单工作流 (SWF - aws.amazon.com/swf)?
  • 不觉得 SWF 有调度任务的机制吗? (很可能是客户端必须进行调度)
  • 我想每小时运行一次任务,预计运行时间大约为 10 分钟 - 它正在解析 RSS 提要、处理内容,然后将内容发布到第三方 API。

标签: amazon-web-services amazon-ec2 cron


【解决方案1】:

自从我第一次提出这个问题以来,现在可以使用 CloudWatch Events 来安排定期事件。事件可以是:

  • N 分钟/小时/天的固定速率
  • Cron 表达式

目标可以是:

  • AWS Lambda 函数
  • 发布到 SNS 主题
  • 写入 SQS 队列
  • 写入 Kinesis 流
  • 对 EC2/EBS 实例执行操作

然后可以使用 SQS 通知多个可用区中的机器集群中的单个实例执行操作。

这里有更多信息: https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/ScheduledEvents.html

虽然它不包括关于如果可用区出现故障会发生什么的弹性/可用性声明。

【讨论】:

    【解决方案2】:

    亚马逊刚刚发布了你的问题的解决方案:Beanstalk worker tier 周期性任务:

    http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html#worker-periodictasks

    它基本上依赖于一个 yaml 文件,其中列出了调用您想要的 API 的 cron 计划:

    要调用定期任务,您的应用程序源包必须在根级别包含一个 cron.yaml 文件。该文件必须包含有关您要安排的定期任务的信息。使用标准 crontab 语法指定此信息。

    【讨论】:

    • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
    【解决方案3】:

    向我建议的一个建议解决方案是使用 Auto Scaling 组,将最大和最小实例数设置为 1。这意味着如果可用区脱机,ASG 将在另一个即将启动的区域。

    Architecting on AWS 培训课程中简要介绍了该技术,但我不知道它的可靠性如何。

    【讨论】:

      【解决方案4】:

      这真的取决于您的要求。

      您可以将任务发布到 SQS 队列并让您的实例(可能是分布在不同区域的自动缩放组)轮询该队列。如果任务只执行一次对您来说至关重要,那么 SQS 的至少(并且通常只)一次语义在这里可能是一个问题。如果是这种情况,您可以轻松使用 DynamoDB 表和conditional writes。或者,如果您更喜欢成熟的容错解决方案,您可以试试airbnb chronos

      【讨论】:

      • 如何确保将任务发布到 SQS 队列的系统是高可用的?
      • SQS 已经具备了尽可能高的可用性,因此如果任务是由用户(或其他系统/组件)以某种方式创建的,您可以直接与它对话。在其他情况下,某种事件应该触发任务创建;再次有很多选项和设计,但例如您可以使用 CloudWatch(可能是自定义指标)和 SNS 主题推送到队列
      猜你喜欢
      • 2017-06-25
      • 1970-01-01
      • 2014-12-21
      • 2017-11-03
      • 2019-05-19
      • 2015-07-15
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      相关资源
      最近更新 更多