Cron 如何设计分布式作业调度器?

Cron 如何设计分布式作业调度器?,cron,distributed,cron-task,system-design,Cron,Distributed,Cron Task,System Design,我想设计一个作业调度器集群,它包含几个主机来执行cron作业调度。例如,需要每5分钟运行一次的作业提交给群集,群集应指出下一次运行的主机,确保: 灾难容忍度:如果不是所有主机都已关闭,则应成功触发作业 有效性:只有一台主机启动下一次作业运行 由于容灾能力,作业无法绑定到特定主机。一种方法是所有主机轮询一个DB表(当然是带锁的),这保证只有一个主机运行下一个作业。由于它经常锁定表,有没有更好的设计?使用。它具有类似于cron的语法,可以进行集群,集群中只有一台主机一次执行一项任务。如果一台主机或作

我想设计一个作业调度器集群,它包含几个主机来执行cron作业调度。例如,需要每5分钟运行一次的作业提交给群集,群集应指出下一次运行的主机,确保:

  • 灾难容忍度:如果不是所有主机都已关闭,则应成功触发作业
  • 有效性:只有一台主机启动下一次作业运行

  • 由于容灾能力,作业无法绑定到特定主机。一种方法是所有主机轮询一个DB表(当然是带锁的),这保证只有一个主机运行下一个作业。由于它经常锁定表,有没有更好的设计?

    使用。它具有类似于cron的语法,可以进行集群,集群中只有一台主机一次执行一项任务。如果一台主机或作业失败,另一台主机将重试挂起的作业。

    如果您同意使用AWS web服务,请考虑使用。与Quartz相比,它的优势在于它不依赖于必须托管的数据库,而且它可以提供比调度更多的功能。例如,如果由于任何原因无法进行调度,它可以运行一些活动来修复集群或页面。一个cron工作流的实例

    查看运行在Mesos-()资源调度器之上的Chronos()。

    很久以前,当使用软盘进行同步时,我确实需要类似的东西。您应该清楚三件事情,它们看起来很简单,但在分布式环境中却不是:-)

    “同步部分” 如果您得到一个网络拆分,这意味着您的集群被拆分为两个独立的部分,可以在这些部分内部进行通信,但不能在这两个部分之间进行通信,那么“仅触发作业一次”只能在每个同步部分获得

    “灾难” 如果几乎所有的计算机都在运行,只有很少一台出现故障,而两台出现故障几乎是不可想象的,那就完全不同了,因为每台主机都只是部分时间运行,连接不稳定,或者同步是通过拨号连接或FLOPPY完成的。如果你甚至想处理一个净值分割,它会变得非常复杂。 如果您想处理恶意主机,您还有另一个问题

    “有效性” 每一份工作只解雇一次。。。同步速度必须快于作业触发间隔

    编辑:调度程序任务设计的Tipp。我有一个很大的文本文件,其中包含行。每一行都是一个作业任务,从作业类型开始,然后是执行时间,然后是命令,最后是重复任务的可选重新提交间隔。同步意味着合并。已执行的任务将被删除。如果“重新提交”处于启用状态,则会插入或追加新任务

    在一个理想的世界中,每个主机都与其他主机连接,我将实现类似于令牌环的东西。如果没有主机,主机将选择一个主机,主机将安排一切,直到有一段时间不发送heardbeats。如果有两个主机,他们协商其中一个成为主机(可能更低的MAC地址…随便什么)

    如果您必须处理恶意主机,您可以使用一些拜占庭式的gerenals问题解决方案。主机的选择已经准备好了,可以很好地抵御恶意主机。使用一点rsa krypto,选定的主机可以对每个命令进行签名,重发攻击可以使用时间戳或不断增长的索引进行处理。。。瞧

    仅作为一个来自onld程序员的故事,不适用于今天,一切都与互联网世界相连: 大约20年前,我最大的问题是,主机从一小时一天一次同步到一周一次或一个月一次。因此,解决方案是使用不同的命令: 1.在给定日期在每台主机上执行(在将来,这对于同步来说已经足够了) 2.在主机上执行,其中“whoami”包含某个子字符串。 3.以很小的概率在随机主机上执行,并向所有其他主机发送一个确认,确认它已准备就绪执行

    第三种命令类型执行类似于“仅开火一次”的操作,前提是同步速度远远快于执行概率。它不需要主从体系结构,如果你知道同步间隔的话,它工作得很好。

    我用谷歌搜索出了Dkron(分布式作业调度系统)。它有RESTAPI,看起来不错。我打算尝试使用它

    我不知道如何设计一个,但有一些开源产品可以作为一个例子。一个是上面提到的


    但是,很显然,WallmartLabs对石英进行了评估,发现它不够好,因此创造了一个更好的(在他们看来)替代品,名为“石英”。也许你也可以看看这个。

    Quartz是一个很好的作业调度框架,它还支持分布式,而我想知道Quartz的集群是如何设计的。coderz,Quartz with cluster的工作原理与简单的Quartz配置类似。您只需设置org.quartz.jobStore.isClustered=true,将quartz表添加到数据库中,quartz将负责容灾并只运行一次。有关quartz群集工作原理的更多信息,请阅读“是”,这是另一个好方法!我想知道这个框架是如何设计的。请用更多的细节来证实你的答案,而不仅仅是链接到一个外部站点Mesos是一个管理计算资源的系统,其中计算资源可以是脚本、web服务、hadoop/spark作业,而且它与语言无关。它知道集群中可用的物理资源(CPU、Mem等),并可以根据可用资源的位置分配作业。Chronos运行在Mesos之上,并提供类似于cron的调度功能,因此您可以调度重复性任务,而且它与语言无关。即Chronos计划并将您的工作提交给Mesos和