여러대의 서버에서 스프링 배치시...

7,288 views
Skip to first unread message

규우

unread,
May 21, 2010, 6:59:16 AM5/21/10
to Korea Spring User Group
안녕하세요... ^^
여러대의 서버에서 배치 작업으로 인하여 발생하게 되는 요인에 대해서 궁금한점이 있어 질문 올립니다.

서비스 운용 서버가 2대가 있고, 각각의 서버에는 스프링 배치 프로세스가 올라간다고 가정하겠습니다.
배치 프로그램에서 하는 비지니스 로직은 저녁 6시에 요구조건에 만족하는 데이터를 A 테이블에서 읽어 B라는 테이블에
insert 하는것입니다.

문제가 발생될거라 생각되는것은 2대의 서버가 각각 배치 프로세스가 돌고 있을경우, B테이블에 중복으로 데이터가 들어갈수도 있다
고 생각됩니다. (테스트는 해보지 않았네요.;;)

여튼 위와 같은 현상과 또 다른 여러가지 요인으로 문제 발생의 요지가 충분히 있다고 생각됩니다.

나름 짱구를 굴리며 생각한 대안으로는 1번 서버의 배치는 A테이블을 조회할 때, 홀수 데이터를 읽어오고 2번 서버의 배치는 짝
수 데이터를 읽어오게 하는 방법으로 생각을 해봤습니다만, 만약 1번 서버의 어플리케이션이 죽어버리면 홀수 데이터는 처리를 못하
는 상황이 벌어지네요..

여러분들은 여러대의 서버에서 어떠한 방법으로 배치를 돌리는지 궁금합니다.

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

sungchul park

unread,
May 21, 2010, 9:46:40 AM5/21/10
to ks...@googlegroups.com
안녕하세요. 규우님...

배치를 꼭 분산해서 처리해야 하나요?

배치 처리할 양이 많아서 그렇게 하시는 거라면 일을 잘게 나눠서 여러 서버에서 여러번 반복해 처리를 하되 같은 작업이 중복 처리되지 않도록 DB나 분산 캐시 등의 공유 저장소에 배치 잡 제어를 하는 정보를 넣어두면 간단히 해결할 수 있으리라 생각합니다.

일을 홀수, 짝수로 나누는 것도 방법이겠지만 특별한 이유가 없다면 그냥 처음부터 일정한 크기로 1회당 처리량을 잡는 쪽이 단순해 보입니다.

Sanghyuk Jung

unread,
May 21, 2010, 9:45:59 PM5/21/10
to ks...@googlegroups.com
job별로 분산하시는 것이 의도이시면 quartz를 이용한 clustering이 가능합니다.

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

여러대의 서버에 같은 스케쥴이 올라가있어도 db를 이용해서 lock정보를 관리해서 하나의 서버에서 돌아가게 됩니다. 다만 2대의 서버의 시계가 sync되어 있어야 한다고 하네요.
DB외에도 teracotta를 이용해서 비슷한 구성을 할 수도 있습니다.
http://www.terracotta.org/quartz/?src=/index.html


그리고 job내부에서는 item별로 분산을 하고자 한다면 spring batch의 partioning을 이용해서 데이터를 처리할 영역별로 잘라서, 여러 node에서 실행을 하는 것이 가능합니다.
http://static.springsource.org/spring-batch/reference/html/scalability.html

grid gain(http://www.gridgain.com) 같은 분산처리 기술하고 붙여볼수도 있는데, 스프링배치에서 구현체를 직접 제공하지는 않습니다.

그리고 최근 저희팀 분이 하고 있는 재미있는 시도는, Hudson을 이용해서 batch job을 관리하는 것인데, hudson의 clustering기능에 설정해두면 한쪽 slave가 죽어있으면 다른 쪽 slave로 failover되는 것은 검증이 되더군요. hudson의 원래 용도는 아니지만  워낙 hudson의 UI나 기능들이 막강해서 batch job 관리에도 그정도의 기능이 제공되기를 원하는 사람들이 많더군요;


2010년 5월 21일 오후 10:46, sungchul park <gyu...@gmail.com>님의 말:

Sanghyuk Jung

unread,
May 26, 2010, 1:25:21 AM5/26/10
to ks...@googlegroups.com
위에서 언급한 Spring batch에 grid-gain을 붙이는 구현체가 이미 준비되고 있군요.
gemfire 쪽도 같이 준비하는 듯합니다.
아직시작단계인것 같기는합니다.
 
 
 
2010년 5월 22일 오전 10:45, Sanghyuk Jung <ben...@gmail.com>님의 말:

sungchul park

unread,
May 26, 2010, 1:55:15 AM5/26/10
to ks...@googlegroups.com
흠... 뭔가 조용한 오픈소스 프로젝트군요.
상혁님이 써 보고 알려주세요. ^^

2010/5/26 Sanghyuk Jung <ben...@gmail.com>
Reply all
Reply to author
Forward
0 new messages