2016-07-07 4 views
4

우리의 (봄) 응용 프로그램은 Schedulers에 몇 가지 데이터 (Database)를 변경/업데이트하기 위해 밤 중에 활성화되는 여러 개의 Schedulers을 포함합니다.클러스터 된 환경의 스케줄러

이것은 모두 잘 돌아가고 있습니다. 문제는 애플리케이션이 곧 clustered environment에서 실행된다는 것입니다.

instance B이 동시에 작동하는 것을 방지하는 가장 좋은 방법은 무엇입니까?

** UPDATE **
클러스터 환경은 'active-active'로 설정입니다.
각 노드는 자신의 데이터베이스 인스턴스와 통신합니다. 각 데이터베이스 인스턴스는 다른 인스턴스에 replicate 데이터입니다.
DB 인스턴스는 'master-slave'으로 설정되지 않지만 각 인스턴스는 insert-update-delete 작업을 실행하는 Galera cluster에서 실행됩니다.

따라서 각 scheduler은 한 번에 한 번만 실행해야합니다. 다른 인스턴스는 스케줄러를 실행하지 않아야합니다. 그래서 한 인스턴스의 스케줄러가 실행되는 방식을 찾아야합니다. 다른 인스턴스의 동일한 스케줄러가 실행되어서는 안됩니다.

+0

[클러스터 환경에서 실행되는 Spring Scheduled Task]의 가능한 복제본 (http://stackoverflow.com/questions/31288810/spring-scheduled-task-running-in-clustered-environment) –

+0

대답이 있습니까? –

+0

더 명확하게하기 위해 질문을 업데이트 한 후에 답변을받지 못했습니다. – user2054927

답변

4

완전성을 위해 : 우리는 영구 Quartz job scheduling으로 끝났습니다.
This 게시물을 사용하면 Quartz schedulingSpring을 지속적으로 사용하는 데 많은 도움이되었습니다.

1

클러스터의 노드에 다른 작업을 위임해야합니다. 밤에 데이터베이스에 어떤 작업이 있습니까?

노드가 부하 분산 장치 뒤에 올바르게 클러스터 된 경우 하나만 데이터베이스에 쓸 업데이트를 받아야합니다.

Zookeeper을 사용하여 노드를 관리하고 기본 스케줄링을 수행하도록 기본 노드를 설정할 수 있습니다.

1

두 클러스터 모두에서 예약 된 이벤트를 처리하는 코드가 있습니다. 두 가지 접근 방식이 있습니다.

  1. 하나의 클러스터에서이 이벤트를 실행하도록 선택할 수 있습니다. 그런 다음이 클러스터가 다운되었을 때 다른 클러스터의 스케줄러를 전환해야합니다. 그리고 비슷한 유지 관리 문제.
  2. 두 클러스터에서 이러한 이벤트를 실행하도록 선택할 수 있습니다. 구현의 차이로 인해 모든 클러스터가 폴링하고 모든 클러스터가 성공적으로 실행됩니다. 폴링/잠금을위한 데이터베이스 또는 jms 메시지를 선택할 수 있습니다.

필자는 두 번째 방법을 선호합니다. 한 번 쓰십시오.

1

당신은 어떤 종류의 Schedulers을 사용하고 있는지 말하지 않습니다.
당신이 찾고있는 것은 지속적 스케줄링입니다. JEE는 이것을 지원하고 Quartz도 지원합니다. 원하는 경우 Quartz와 잘 어울리지 만 상자 밖으로 나간 것은 아닙니다.

지속성 스케줄러를 사용하면 작업이 데이터베이스에 추가되고 트리거가 "트랜잭션"(실제 트랜잭션인지 확실하지 않음)에서 실행되므로 하나의 스케줄러 만 트리거를 실행할 수 있습니다.
그러나 관리를 위해 일부 데이터베이스 테이블이 필요합니다.

관련 문제