集群环境中的调度程序

时间:2016-07-07 13:25:54

标签: spring scheduler galera

我们的(Spring)应用程序包含多个Schedulers,它们在夜间变为活动状态,以更改/更新Database中的某些数据(来自Batch)。

这一切都运行良好,问题是我们的应用程序很快会在clustered environment中运行。

阻止scheduler instance Ainstance B同时执行相同工作的最佳选项是什么?

** 更新 **
群集环境设置为'active-active'
每个节点都与它自己的数据库实例进行通信。每个数据库实例将replicate数据发送到其他实例。
数据库实例未设置为'master-slave',但将在Galera cluster中运行,其中每个实例都执行insert-update-delete操作。

因此每个scheduler应该只在一个实例上运行一次。其他实例不应运行调度程序。所以我需要找到一个实例的调度程序运行的方法,其他实例的相同调度程序不应该运行。

4 个答案:

答案 0 :(得分:4)

为了完整起见:我们最终得到了持久性Quartz job scheduling
This帖子帮助了我很多关于Quartz schedulingSpring的持久{{1}}。

答案 1 :(得分:1)

您应该将不同的任务委派给群集中的节点。晚上在数据库中发生了什么工作?

如果节点在负载均衡器后面正确聚类,则只有一个节点应该接收更新以写入数据库。

您可以使用Zookeeper管理节点并设置主节点以执行单独调度。

答案 2 :(得分:1)

您将拥有代码来处理两个群集中的预定事件。有两种方法。

  1. 您可以选择在任何一个群集中运行此事件。然后,您需要确保此群集关闭时,您将在其他群集中切换调度程序。和类似的维护问题。
  2. 您可以选择在两个群集中运行此类事件。实现方式的差异使得所有群集都将轮询,并且任何一个群集都将成功运行它。您可以选择数据库或jms消息进行轮询/锁定。
  3. 我更喜欢第二种方法 - 写一次。

答案 3 :(得分:1)

你不是说你正在使用什么样的Schedulers 您正在寻找的是持续安排。 JEE支持这一点,Quartz也支持。开箱即用的弹簧没有,如果你愿意,它可以很好地与Quartz集成。

使用持久调度程序,作业将添加到数据库中,触发器将在“事务”中运行(不确定它是否为实际事务),确保只有一个调度程序可以运行触发器。
但是,它需要一些数据库表来进行管理。