是好还是坏,我们已迁移我们的整个LAMP从专用机到云(Amazon EC2的机器)的Web应用程序。 这将极大到目前为止,但我们做的方式crons是次优的。 我对如何使用“亚马逊办法”云计算最好地管理cron作业特定的亚马逊问题。
问题 :我们有多个Web服务器,并需要为批处理作业,如创建RSS运行crons源,触发电子邮件,许多不同的事情其实。 但是cron作业只需要一台机器上运行 ,因为他们经常写入数据库,如果在多台机器上运行,从而将重复的结果。
到目前为止,我们指定的Web服务器作为“主网络服务器”之一,它有其他的web服务器没有几个“特殊”的任务。 在权衡云计算的可靠性 - 我们不希望有一个“主网络服务器”,因为它是一个单一故障点。 我们希望他们都相同,并能够扩展和缩减,无需记住不要坐主Web服务器进行集群。
我们如何重新设计我们的应用程序到Linux cron作业转换成没有单一故障点短暂的工作项目?
我的想法而已:
- 有一个专门的仅运行crons机。 这将是一个更易于管理,但仍然是一个单点故障,并会浪费有一个额外的实例一些钱。
- 有些工作可以令人信服地从Linux的crons到移动MySQL的事件不过我不是这种想法的忠实粉丝,因为我不希望把应用逻辑到数据库层。
- 也许我们可以运行在所有的机器都crons而是改变我们的cron脚本所以他们都开始有点逻辑的实现锁定机制,使一台服务器实际上采取行动和其他直接跳过。 我不是这种想法的粉丝,因为它听起来可能车和我宁愿使用亚马逊的最佳实践,而不是滚动我们自己。
- 我想象在那里作业的地方安排的情况下,添加到队列,然后Web服务器可以各自是一个工人,可以说:“嘿,我要这个。” 亚马逊简单工作流服务的声音正是这种事情,但我目前不很了解,因此任何具体细节将是有益的。 这似乎有点重的重量让作为cron一样简单的东西吗? 它是正确的服务还是有更合适的亚马逊服务?
更新:既然问这个问题,我看过了亚马逊的简单工作流服务在YouTube上的网络研讨会,并在34:40发现( http://www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s )我抓到的一瞥滑动提的cron作业作为一个示例应用程序。 在他们的文档页面,“ AWS流程框架样本亚马逊SWF ”,亚马逊说他们有crons示例代码:
......> Cron作业在此示例中,长期运行的工作流程定期执行的活动。 继续执行新的执行,使执行可能的时间很长时间运行证明的能力。 ...
我下载了AWS SDK的Java( http://aws.amazon.com/sdkforjava/ )果然埋夹的荒谬层内有一些Java代码( aws-java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow
)。
问题是,如果我是诚实的,这并不能真正帮助,因为它不是我可以很容易地与我的技能消化。 同样的样品从PHP SDK失踪,似乎没有要能走动的,虽然过程的教程。 所以基本上,我还在追捕建议或提示。
Answer 1:
我注册了亚马逊的黄金支撑位问他们这个问题,这是他们的回应:
汤姆
我做了一些同事的快速调查,并来到了空上的cron,但睡在它之后,我意识到了重要的一步可能仅限于锁定。 所以我找了“分布式cron作业锁定”,发现动物园管理员,一个Apache项目的引用。
http://zookeeper.apache.org/doc/r3.2.2/recipes.html
http://highscalability.com/blog/2010/3/22/7-secrets-to-successfully-scaling-with-scalr-on-amazon-by-se.html
此外,我已经看到了参考使用memcached的或类似的缓存机制,以此来创建一个TTL锁。 通过这种方式,你设置一个标志,以300秒的TTL,没有其他的cron工人将执行任务。 该TTL已过期后,锁定将自动解除。 这在概念上非常相似,我们昨天讨论的SQS选项。
另见; 谷歌的小胖http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en//archive/chubby-osdi06.pdf
让我知道如果这能帮助,并随时提问,我们都非常清楚,我们的服务可以是复杂和艰巨的初学者和经验丰富的开发人员的一致好评。 我们总是乐意为您提供架构和最佳实践的建议。
最好的祝福,
罗南G.亚马逊网络服务
Answer 2:
我觉得这个视频回答您的问题相关 - cronjobs AWS的方式(可扩展和容错):
在云中使用cron与亚马逊简单工作流
视频描述了SWF使用实施cronjobs的具体使用情况的服务。
该解决方案的相对复杂性可能难以下咽,如果你是直接从一个crontab来。 还有那个让我明白了什么额外的复杂性买你结束一个案例研究。 我建议看案例研究和考虑您的可扩展性和容错性的要求来决定你是否应该从现有的crontab解决方案迁移。
Answer 3:
小心使用SQS的cronjobs,因为他们不能保证,只有“一个工作仅由一个机看过”做。 他们保证,“至少一个”意志得到了消息。
来源: http://aws.amazon.com/sqs/faqs/#How_many_times_will_I_receive_each_message
问:有多少次我会收到每封邮件?
亚马逊SQS被设计用于提供“至少一次”的所有邮件在队列中。 虽然大多数的每封邮件将发送到您的应用程序恰好一次的时候,你应该设计自己的系统,以便处理消息不止一次不会产生任何错误或不一致。
到目前为止,我能想到的安装,你有一个实例的解决方案与Gearman的作业服务器实例: http://gearman.org/ 。 在同一台机器配置所产生的命令在后台执行您的cronjob任务cron作业。 那么你的Web服务器(工人)将开始执行这个任务之一,它保证只有一个会抓住。 不要紧,你有多少工人(尤其是当您使用自动缩放)。
这种解决方案的问题是:
- Gearman的服务器是单一故障点,除非你使用的memcached或某些数据库分布式存储配置,例如
- 然后使用你必须选择一个通过的cronjob创建任务多Gearman的服务器,我们再次这样又回到了同样的问题。 但是,如果你可以用这种使用Gearman的单点故障的生活看起来相当不错的解决方案。 尤其是,你并不需要大的实例为(在我们的情况下,微实例就够了)。
Answer 4:
亚马逊刚刚发布的新功能弹性魔豆。 从文档 :
AWS弹性青苗支持工人的环境周期性任务
层在环境中运行的与包含在容器中的名称“V1.2.0”的溶液堆栈的预定义配置。 “
现在,您可以创建一个包含环境cron.yaml
该配置计划任务的文件:
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 * * *"
我可以想象在自动定环境中运行它只有一次通过消息队列(SQS)用于保险。 当cron守护程序触发一个事件它把该呼叫在SQS队列,并在队列中的消息只计算一次。 该文件说,如果SQS有很多信息处理的执行可能会延迟。
Answer 5:
我现在碰到这个问题就来了第三次我想我会解囊。现在,我们已经有这个困境了一段时间。 我还是真的觉得AWS这里缺少的功能。
在我们的例子中,望着可能的解决方案之后,我们决定,我们有两个选择:
- 设置它运行只应在同一时间运行一次作业一个cronjob服务器,自动缩放,并确保当某些CloudWatch的统计信息是他们应该不是它的替代。 我们使用
cloud-init
脚本来获取cronjobs运行。 当然,这配备了停机时间,从而导致错过cronjobs(运行时,某些任务的每一分钟,就像我们做的)。 - 使用该逻辑
rcron
用途。 当然,神奇的是不是真的rcron
本身,它在你用它来检测失败的节点(我们用逻辑keepalived
这里)和“升级”另一个节点掌握。
我们决定去与第二个选项,只是因为它出色的速度快,我们已经与运行这些cronjobs(在我们的预AWS时代)Web服务器的经验。
当然,这个解决方案是为取代传统的单节点的cronjob方法,其中时间是决定因素(例如:“我要工作一到每天一次早上5点运行”,或者像我们的情况下,具体的意思是“我希望作业B运行每分钟一次”)。 如果您使用cronjobs触发批处理逻辑,你真的应该看看SQS
。 有没有主动 - 被动的困境,这意味着你可以使用单个服务器或整个劳动力处理您的队列中。 我也建议寻找SWF
缩放你的员工(虽然auto scaling
也许能够做的伎俩,以及在大多数情况下)。
根据其他第三方是一些我们希望避免的。
Answer 6:
在12 /月/ 16亚马逊博客中使用AWS LAMBDA调度SSH工作 。 我想这个答案。
Answer 7:
在“亚马逊”的方式,就是分布式的,这意味着庞大的crons应该分割成许多较小的作业并交给正确的机器。 使用SQS胶水一起,确保各项工作的只有一台机器可见。 它也容忍失败,因为队列将缓冲,直到机器旋转备用。
同时考虑是否真的需要“批处理”这些操作。 如果一个晚上的更新是大大高于预期,会发生什么? 即使动态资源配置,你的处理可能会推迟等待足够多的机器运转起来。 取而代之的是,存储在SDB数据,通过SQS通知更新的机器,并在运行(与缓存)创建你的RSS提要。
批处理作业是从的时候处理资源是有限的,“活”了服务优先。 在云中,这是不是这样的。
Answer 8:
如果你已经有了一个Redis的服务了,这看起来像一个很好的解决方案:
https://github.com/kvz/cronlock
了解更多: http://kvz.io/blog/2012/12/31/lock-your-cronjobs/
Answer 9:
你为什么要建立你自己的? 为什么不使用类似石英(含集群调度)。 见文档。
http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering
Answer 10:
我们做的是我们有一个特定的服务器是我们的一个ELB背后的web应用集群的一部分也被分配一个特定的DNS名称,以便我们可以在一个特定的服务器上运行的作业。 这也有,如果该作业导致该服务器慢下来,ELB会从集群中删除,然后返回一次工作是在受益并再次恢复健康。
工程就像一个冠军。
Answer 11:
如果你愿意使用非AWS服务,那么你可以检查出微软的Azure 。 Azure中提供了一个很好的作业调度 。
Answer 12:
因为没有人提到CloudWatch的事件 ,我会说,这是做cron作业的AWS方式。 它可以运行许多操作,例如lambda函数,ECS任务。
文章来源: How to convert Linux cron jobs to “the Amazon way”?