클러스터가 작업을 한 번만 실행하도록하려면 어떻게해야합니까?


13

서버 클러스터에서 한 번만 실행하려는 작업이있는 경우 정기적으로이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 이 경우 클러스터의 정의는 분산 세션이로드 밸런서 뒤에있는 둘 이상의 동일한 서버입니다.

사용 사례 : X 시간당 한 번만 실행해야하는 비싼 작업이 있습니다. 예를 들어이 작업은 많은 레코드를 반복하고 상태를 업데이트 할 수 있습니다.

  • 최악의 시나리오는 작업을 두 번 실행하면 데이터가 무효화되는 것입니다.
  • 가장 좋은 시나리오는 작업이 모든 서버의 리소스를 이용하는 것입니다.

요구 사항 요약 :

  1. 노드 중 하나가 작동 중지 된 경우에도 작업을 계속 실행해야합니다.
  2. 작업은 스케줄 당 한 번만 실행해야합니다.
  3. 여러 작업이 동시에 또는 겹치는 시간에 예약 된 경우 실행중인 작업 수가 서버간에 균등하게 분배됩니다.
  4. 머신은 동일한 코드베이스를 가져야하며 NTP를 통해 동기화되어야합니다.
  5. 환경 변수에 따라 노드와 노드간에 구성이 다를 수 있습니다.
  6. 작업은 정시에 또는 지정된 시간 간격 내에서 시작해야합니다. (예를 들어 5 분)

가능한 해결책

  • 하나의 노드를 마스터 노드로 설정하면 위의 1을 위반하므로 작동하지 않습니다.
  • 작업을 시작하기 위해로드 밸런서 균형을 조정하도록 요청하십시오. 불행히도 이것은 동시에 여러 작업을 실행하는 경우 동일한 시스템에서 모두 실행될 수있는 부작용이 있습니다.

이것은 서블릿 컨테이너에서 Java로 실행되어야합니다. 그러나 그것은 내가 찾고있는 직업을 코딩하지 않습니다.

확실히 이것은 알려진 최상의 솔루션으로 해결 된 문제입니다.


관련 질문. /programming/5949038/schedule-job-executes-twice-on-cluster

위에서 언급 한 5 가지 요구 사항에 따라 솔루션이 충분하지 않으므로 중복되지 않습니다. 가장 많이지지 된 솔루션은 경쟁 문제로 어려움을 겪고 두 번째 솔루션은 요구 사항 3을 위반합니다.

답변:


16

공유 데이터베이스가 있습니까? 나는 과거에 중재자로 데이터베이스를 사용 하여이 작업을 수행했습니다.

기본적으로 각 "작업"은 데이터베이스에서 행으로 표시됩니다. 실행하려는 시간과 함께 행을 데이터베이스에 추가하여 작업을 예약하면 각 서버는 다음을 수행합니다.

SELECT TOP 1 *
FROM jobs
WHERE state = 'NotRun'
ORDER BY run_time ASC

이렇게하면 모두 다음 에 실행되도록 예약 된 작업을 선택하게 됩니다. 작업이 실제로 실행될 때 깨어날 수 있도록 모두 잠 들어 있습니다. 그런 다음 그들은 모두 이렇게합니다.

UPDATE jobs
SET state = 'Running'
WHERE job_id = :id
  AND state = 'NotRun'

:id위 단계에서 얻은 작업의 식별자는 어디에 있습니까 ? 업데이트가 원자이기 때문에, 서버 중 하나는 실제로 당신이 있는지 여부를 확인하기 위해 상태 코드 데이터베이스의 "행 업데이트의 수를"확인할 수 행을 업데이트 할 것입니다 당신이 실제로 행을 업데이트하는 서버했고, 그러므로 여부를 당신은 서버입니다 작업을 수행하게됩니다.

"승리"하지 않고 작업을 실행하지 않는 경우 즉시 1 단계로 돌아가십시오. "승리"한 경우 작업을 다른 스레드에서 실행하도록 예약 한 다음 몇 초 동안 기다렸다가 1 단계로 돌아가십시오. 이렇게하면 이번에 작업을 얻지 못한 서버가 작업을 더 많이받을 가능성이 높습니다 즉시 실행되도록 예정되어 있습니다.


1
여기서 사용중인 분리 레벨은 무엇입니까? 커밋 또는 직렬화를 읽습니까?
Maverick Riz

2

일부 응용 프로그램 서버에는 "클러스터 전체 싱글 톤 서비스"기능이 있습니다.

예를 들어 Weblogic에는 웹 관리 콘솔을 통해 구성된 Singleton Service 기능이 있습니다.

weblogic.cluster.singleton.SingletonService를 구현하는 클래스를 작성하고이를 사용하여 관리 콘솔에서 서비스를 선언해야합니다. 클러스터는 클래스를 인스턴스화하고 서비스가 시작되거나 중지 될 때 알려줍니다. SingletonService 인터페이스에는 activate () 및 deactivate () 메소드가 있습니다.

Weblogic은 클러스터의 노드 중 하나에서 서비스를 처음 가져올 때 activate ()를 호출합니다. 선택된 노드가 다운되면, 관리 서버는 다른 서버에서 서비스를 "이동"하여 activate ()를 호출합니다.

http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13952/taskhelp/clusters/ConfigureSingletonService.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.