当前位置: 首页 > 知识库问答 >
问题:

群集环境中的调度程序

太叔天宇
2023-03-14

我们的(Spring)应用程序包含几个调度器,这些调度器在夜间活动,以更改/更新Batch中的一些数据(来自 )。

这一切都运行良好,问题是我们的应用程序很快就会在集群环境中运行。

防止< code >实例A和< code >实例B的< code >调度程序同时执行相同工作的最佳选项是什么?

**UPDATE**
群集环境设置为'active-active'
每个节点都与自己的数据库实例通信。每个数据库实例将数据复制到其他实例。
DB-实例不是设置为'master-从',而是将在Galera集群中运行,其中每个实例执行插入-更新-删除操作。

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

共有3个答案

张玺
2023-03-14

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

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

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

臧弘和
2023-03-14

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

  1. 您可以选择在任何一个集群中运行此事件。然后,您需要确保当这个集群关闭时,您将切换其他集群中的调度程序。以及类似的维护问题
  2. 您可以选择在两个集群中运行此类事件。实现方式的差异,即所有集群都将轮询,任何一个集群都将成功运行。您可以选择数据库或jms消息进行轮询/锁定

我更喜欢第二种方法——写一次。

马凡
2023-03-14

为了完整起见:我们最终得到了持久的Quartz作业调度
这篇帖子对我使用Spring实现持久的Quartz调度帮助很大。

 类似资料:
  • 要求是定期运行一个Java应用程序(例如每天),向客户发送电子邮件/短信通知。环境是集群/高可用性,其中多个节点将同时处于活动状态。该应用程序将部署在所有节点上,但只有一个节点应该启动并运行,即使所有节点都配置为运行。如何实现这一点。在Java应用中,使用了石英调度器。 还需要一些关于如何在Linux机器上部署这个Java应用程序的指导(像Cron作业或其他一些方式)。要求是,这个应用程序应该在服

  • 我有一个有两个节点的集群,它连接到同一个数据库,还有一个调度作业,由Quartz调度程序每10分钟启动一次。在quartz.properties中设置。 我感兴趣的是,调度程序是否会为同一节点发出作业,直到每隔10分钟可到达该节点为止,或者它使用某种算法来确定哪个节点将执行该作业。 我在文档(http://www.quartz-scheduler.org/documentation/quartz-

  • 我正在使用 这是可行的,但当我使用集群环境时,两个线程正在为同一作业运行。 我使用的是注释而不是属性文件。我只想运行一个线程。有人能帮忙吗。如何配置? 我的代码几乎像:http://k2java.blogspot.com/2011/04/quartz.html

  • 问题内容: 我需要为集群环境中的所有用户和所有节点维护一个在应用程序内唯一的简单计数器。我考虑过像这样使用单例会话bean注释javax.ejb.Singleton: 这看起来很简单,但是如果它在集群环境中可以正常工作,我将找不到答案。集群的每个节点是否都具有自己的实例? 当然,我可以将bean保留在数据库中,但实际上这只是一个计数器,这样做会过分杀伤力。另外,我希望计数器在应用程序崩溃或重新启动

  • 我使用Spring调度程序,使用@调度注释来调度运行文件生成服务的作业。应用程序部署在集群环境中Tomcat的5个单独节点上,用于负载平衡和故障转移。正因为如此,服务被调度了5次,这是不可能的。有没有办法将调度程序配置为仅在当前节点上运行? 有一种方法使用数据库找出当前活动节点,并在这里调用该特定实例的调度器 另一种方法是使用石英调度器 由于我无法对部署的应用程序进行重大更改,是否有简单的解决方案

  • 问题内容: 将Singleton对象重构到集群环境的最佳策略是什么? 我们使用Singleton从数据库中缓存一些自定义信息。它 主要是 只读的,但是在发生某些特定事件时会刷新。 现在,我们的应用程序需要部署在集群环境中。根据定义,每个JVM将具有自己的Singleton实例。因此,当在单个节点上发生刷新事件并且刷新其缓存时,JVM之间的缓存可能不同步。 保持缓存同步的最佳方法是什么? 谢谢。 编