Spring + quartz 스케쥴러 사용에 관해 문의 드립니다

1,824 views
Skip to first unread message

전성욱

unread,
May 9, 2011, 3:04:08 AM5/9/11
to Korea Spring User Group
spring + quartz를 사용해서 스케쥴링을 사용하고 있습니다.
환경이 2대의 서버가 active, standby로 돌아가는데
두 서버에서 스케쥴러가 같이 돌아가면서 중복해서 스케쥴러가 돌아갑니다.
이럴때 두 서버중에 한곳에서만 작동하게 하는 방법에는 어떤것들이
있을지 답변 부탁드립니다.
WAS는 톰캣을 사용하고 있습니다. 양쪽에 배포된 어플리케이션은 동일합니다.

선영욱

unread,
May 9, 2011, 3:15:44 AM5/9/11
to ks...@googlegroups.com
이건 제가 만들었던 웹솔루션이랑 구성이 거의 동일한것 같아서 별로 실력은 없지만 답글 달아봅니다.
 
양쪽다 배포된 어플이 같다면 바라보는 DB도 같을 것이라고 예상이 됩니다.
 
그러면 어떤 DB 테이블에 다중화 서버의 목록(IP, 서버이름, 상태, 우선순위)을 저장해 두시구요.
 
어플이 최초 기동할때 그 테이블에서 active된 서버의 이름과 내 서버의 이름이 같은지를 비교합니다.
 
그래서 같다면 Quartz등 업무 로직을 실행을 하고, standby인 경우에 일정 시간마다 active여부를 확인합니다.
 
그러다가 만약 active였던 서버가 죽는다면 상태를 standby로 변경하고 우선순위를 가장 낮게 변경합니다.
 
또한 가장 우선순위가 높은 서버를 active로 변경하면 해당 서버가 자신이 active인 상태를 인지하는 순간 업무를 이어받도록 합니다.
 
remoteCall이나 기타 여러가지 방법으로 처리가 가능한 것으로 알고 있는데요, 저는 원초적으로 각 서버에 특정 페이지를 urlConnection으로 요청해서 특정 문자열을 리턴하는 것으로 active서버가 죽었는지 확인했습니다.
 
저는 여기까지 제가 만들었던 어플의 다중화 처리인데요, 저 또한 다른분들은 위와 같은 구성을 어떻게 하실지 궁금합니다. ^^

Sanghyuk Jung

unread,
May 9, 2011, 6:06:34 AM5/9/11
to ks...@googlegroups.com
job마다 실행할 ip나 hostname을 지정하는 방식도 가능하고, 이 방식이 더 간편할지도 모르겠습니다.
 
그리고 quartz 자체에서 DB나 분산메모리인 Terracotta를 이용해서 위와 같은 상황에 1군데서만 job이 실행되는 기능을 제공하고 있습니다.

 

 

Quartz의 JdbcJobStore는 DB에 있는 job정보를 이용해서 먼저 실행되는 쪽에서 lock을 잡는다고 하네요. 다만 별도의 machine에서 돌리려면  해당 서버의 시계가 다 sync되어 있어야 한다는 제약사항이 있다고 합니다. terracotta의 경우에는 이런 제약사항이 있는지 아직 확인해보지는 못했습니다. 

참고자료:

JdbcJobStore: http://www.quartz-scheduler.org/docs/configuration/ConfigJDBCJobStoreClustering.html

Teracotta Job  store: http://devcafe.nhncorp.com/batch/133373


 
2011년 5월 9일 오후 4:15, 선영욱 <twinmo...@gmail.com>님의 말:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.

Reply all
Reply to author
Forward
0 new messages