AI Briefing

심볼릭 링크로 Spring Batch 무중단 배포하기

·2023.12.11 00:00

심볼릭 링크로 배포 jar를 분리해 Job 실행 중에도 무중단 배포를 구현했다.

11번가 클레임개발팀은 Spring Batch Job을 Jenkins로 주기 실행하는 배치 서버에서, 배포 중 jar 파일이 바뀌며 NoClassDefFoundErrorClassNotFoundException이 발생하는 문제를 겪었다.

문제의 핵심은 Job이 실행 중인 상태에서 배포가 진행되면, 실행 중이던 jar 파일이 업데이트되거나 삭제되어 버린다는 점이었다. 이를 해결하기 위해 배포 구조를 바꾸지 않고도 동작을 안정화할 수 있는 심볼릭 링크 방식을 적용했다.

적용 방식은 다음과 같다.

  • 배포 이후 단계에서 Deploy Path의 jar 파일을 batch-YYYYMMDDHHMMSS 형태의 새 디렉토리로 복사한다.
  • 기존 링크를 해제한 뒤, 새 디렉토리의 jar로 **ln -Tfs**를 사용해 링크를 다시 건다.
  • Job 실행 단계에서는 readlink로 심볼릭 링크가 가리키는 실제 jar 경로를 가져와 실행한다.

배포 후에는 파일이 계속 쌓이는 문제를 막기 위해, 최근 10개 디렉토리만 남기고 오래된 디렉토리를 삭제하는 remove-old-directories.sh도 함께 둔다. 이렇게 하면 실행 중인 Job이 참조하는 jar는 그대로 유지되고, 배포는 새 디렉토리로 분리되므로 배포와 실행이 서로 간섭하지 않게 된다.

결과적으로 Jenkins의 Execute Shell은 그대로 유지하면서도, 실행 중인 배치가 배포에 의해 깨지지 않는 무중단 배포 구조를 만들 수 있었다.

이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.

요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.