Amazon ec2 如何将Linux cron作业转换为;亚马逊之路;?

Amazon ec2 如何将Linux cron作业转换为;亚马逊之路;?,amazon-ec2,cron,scheduled-tasks,lamp,amazon-swf,Amazon Ec2,Cron,Scheduled Tasks,Lamp,Amazon Swf,不管是好是坏,我们已经将整个web应用程序从专用机器迁移到了云(AmazonEC2机器)。到目前为止一切都很顺利,但我们的方式是次优的。我有一个亚马逊特有的问题,关于如何使用“亚马逊方式”在云中最好地管理cron作业 问题:我们有多个Web服务器,需要运行cron进行批处理作业,例如创建RSS提要、触发电子邮件,实际上还有许多不同的事情。但是cron作业只需要在一台机器上运行,因为它们经常写入数据库,因此如果在多台机器上运行,则会复制结果 到目前为止,我们将其中一个Web服务器指定为“主Web服

不管是好是坏,我们已经将整个web应用程序从专用机器迁移到了云(AmazonEC2机器)。到目前为止一切都很顺利,但我们的方式是次优的。我有一个亚马逊特有的问题,关于如何使用“亚马逊方式”在云中最好地管理cron作业

问题:我们有多个Web服务器,需要运行cron进行批处理作业,例如创建RSS提要、触发电子邮件,实际上还有许多不同的事情。但是cron作业只需要在一台机器上运行,因为它们经常写入数据库,因此如果在多台机器上运行,则会复制结果

到目前为止,我们将其中一个Web服务器指定为“主Web服务器”,它有一些其他Web服务器没有的“特殊”任务。云计算的权衡是可靠性——我们不想要“主Web服务器”,因为它是单点故障。我们希望它们都是相同的,能够上下伸缩,而不必记住不要将主Web服务器移出集群

我们如何重新设计应用程序,将Linux cron作业转换为没有单点故障的临时工作项

到目前为止,我的想法是:

  • 有一台专用于运行cron的机器。这将更易于管理,但仍然是一个单一的失败点,如果有一个额外的实例,将浪费一些钱
  • 可以想象,有些工作可以从Linux cron转移到Linux cron,但是我不太喜欢这个想法,因为我不想将应用程序逻辑放到数据库层
  • 也许我们可以在所有机器上运行所有的cron,但要更改cron脚本,让它们都从实现锁定机制的一点逻辑开始,这样只有一台服务器实际执行操作,而其他服务器只是跳过。我不喜欢这个想法,因为它听起来可能有问题,我更喜欢使用亚马逊的最佳实践,而不是我们自己的
  • 我在想象这样一种情况,作业被安排在某个地方,添加到队列中,然后Web服务器可能每个都是工作者,可以说“嘿,我要这个”。听起来确实是这样,但我目前对它了解不多,所以任何细节都会有帮助。对于像cron这样简单的东西来说似乎有点重?这是正确的服务还是有更合适的亚马逊服务

更新:自从提出这个问题以来,我在YouTube上观看了网络研讨会,并注意到在34:40()时,我瞥见了一张幻灯片,其中提到cron jobs是一个示例应用程序。在他们的文档页面“中,Amazon说他们有cron的示例代码:

。。。 >Cron作业在本示例中,是一个定期运行的长时间工作流 执行一个活动。继续执行死刑的能力是新的 执行,以便执行可以在很长的时间内运行 时间证明了这一点。

我下载了AWS SDK for Java(),果然在一堆可笑的文件夹中隐藏了一些Java代码(
AWS-Java-SDK-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow

问题是,如果我诚实的话,这并没有真正的帮助,因为这不是我可以用我的技能轻松消化的东西。PHPSDK中缺少相同的示例,并且似乎没有一个教程介绍这个过程。所以基本上,我仍然在寻找建议或提示。

亚马逊的方式是分布式的,这意味着庞大的cron应该被分成许多较小的工作,并交给正确的机器

使用类型设置为FIFO的SQS队列,将其粘合在一起,以确保每个作业仅由一台机器执行。它还可以容忍失败,因为队列将缓冲,直到机器重新启动

FIFO仅处理一次:消息传递一次并保持不变 直到使用者处理并删除它时才可用。重复的是 未引入队列

也要考虑你是否真的需要“批量”这些操作。如果一晚的更新比预期的要大,会发生什么?即使使用动态资源,您的处理也可能会延迟,等待足够多的机器启动。相反,将数据存储在SDB中,通过SQS通知机器更新,并动态创建RSS提要(带缓存)


批处理作业来自处理资源有限且“实时”服务优先的时代。在云计算中,情况并非如此。

我注册了Amazon Gold support,向他们询问这个问题,他们的回答是:

汤姆

我对我的一些同事做了一个快速的民意调查,结果在调查中一无所获 克朗,但在睡了一觉之后,我意识到重要的一步可能是 仅限于锁定。所以我寻找“分布式cron作业锁定” 并找到了一个Apache项目Zookeeper的参考资料

我还看到了使用memcached或类似缓存的参考 机制作为使用TTL创建锁的方法。这样你就设定了一个 标志,TTL为300秒,并且不会执行其他cron worker 工作。TTL关闭后,锁将自动释放 期满。这在概念上非常类似于我们使用的SQS选项 昨天讨论过

也见,;谷歌的胖乎乎

让我知道这是否有帮助,并随时提问,我们非常高兴 意识到我们的服务对初学者来说都是复杂和令人畏惧的 和经验丰富的开发商一样。我们总是乐意提供 架构和最佳实践建议

致以最良好的祝愿

Ronan G.亚马逊网络服务


对cronjobs使用SQS时要小心,因为它们不能保证“一台机器只能看到一个作业”。他们保证“至少有一个”会得到信息

发件人:

Q:我会收到每条消息多少次?version: 1 cron: - name: "backup-job" # required - unique across all entries in this file url: "/backup" # required - does not need to be unique schedule: "0 */12 * * *" # required - does not need to be unique - name: "audit" url: "/audit" schedule: "0 23 * * *"