我想设计一个作业调度程序集群,它包含几个要执行cron作业调度的主机。例如,需要run every 5 minutes
的作业被提交到集群,集群应该指出下次运行哪个主机,确保:
- 容灾:如果不是所有主机都关闭,则应该成功解雇作业。
- 有效期:只有一名主持人可以解雇下一份工作。
醇>
由于容灾,作业无法绑定到特定主机。一种方法是所有主机轮询数据库表(当然有锁),这保证只有一个主机获得下一个作业运行。由于它经常锁定表,有没有更好的设计?
答案 0 :(得分:2)
使用Quartz framework。它具有类似cron的语法,可以进行群集,并且群集中只有一个主机一次只能完成一个作业。如果主机或作业失败,则另一台主机将重试挂起的作业。
答案 1 :(得分:2)
很久以前,当我用软盘进行同步时,我确实需要这样的东西。您应该清楚三件事情,这似乎很简单,但在分布式环境中,不是: - )
“同步部分” 如果你得到一个净拆分,这意味着你的集群被拆分成两个单独的部分,可以在部分内部进行通信,但不能在这两个部分之间进行通信,“只需一次激活作业”只能获得每个同步部分。
“灾难” 如果几乎所有的计算机都启动并运行,并且只有很少一个计算机出现故障,并且两个故障几乎是不可想象的,那就完全不同了,每个主机只运行一段时间,连接不稳定,或者同步是通过拨号连接或通过软盘完成。如果你想要处理净拆分,那真的很复杂。 如果您想处理恶意主机,则还有其他问题。
“有效期” 完全解雇每个作业一次......你必须比作业发射间隔更快地同步。
编辑:Tipp用于调度程序任务设计。我有一个大文本文件,包含行。每一行都是一个作业任务,从作业类型开始,然后是执行时间,然后是命令,最后但并非最不重要的是重复任务的可选重新提交间隔。同步意味着合并。已删除已执行的任务。如果重新提交,则插入或附加新任务。
在一个理想的世界中,每个主机总是连接到其他主机,我会实现类似令牌环的东西。如果没有主设备,则主机选择一个主设备,并且主设备应该安排一切,直到他一段时间没有发送有听觉的声音。如果有两个主人,他们会协商其中一个成为主人(可能是较低的MAC地址......无论如何)。
如果您必须处理恶意主机,您可以使用一些拜占庭gerenals问题解决方案。主人的选择已经很好地抵御了恶意主机。有了一点rsa-krypto,所选主人可以签名每个命令,重新发送攻击可以用时间戳或增长索引来处理......瞧。
仅作为一个来自onld程序员的故事,不是今天的目标,一切都是互联网世界: 20年前我的大问题是,主机每小时一次,每天一次,每周一次或每月一次同步。因此解决方案是使用不同的命令: 1.在给定日期在每个主机上执行(将来可以进行同步) 2.在主机上执行,其中“whoami”包含某个子字符串。 3.以很小的概率在随机主机上执行,并向所有其他主机发送确认,表明它已经全部执行。
如果同步比执行的概率快得多,则第三个命令类型执行类似“仅触发一次”的操作。它不需要主从架构,如果您知道同步间隔,它就能很好地工作。
答案 2 :(得分:2)
我用Google搜索了Dkron(分布式作业调度系统)。它有休息api,看起来很好。我打算尝试使用它 Dkron site
答案 3 :(得分:2)
我不确定如何设计一个,但是有一些开源产品可以作为示例。一种是上面提到的Quartz scheduler。
但是,显然,WallmartLabs对Quartz进行了评估,发现它还不够好,因此创建并开源了一个更好的替代方法(在他们看来),称为BigBen。也许您也可以看看那个。
答案 4 :(得分:1)
如果您可以使用AWS Web服务,请考虑使用AWS Simple Workflow Service。像Quartz这样的好处是它不依赖于你必须托管的数据库,它可以提供比调度更多的东西。例如,如果由于任何原因无法进行调度,它可以运行一些修复集群或页面的活动。 cron工作流程的Here is an example。
答案 5 :(得分:1)
查看在Mesos - (https://mesos.github.io/chronos/)资源调度程序之上运行的Chronos(https://mesos.apache.org/)。