boogie의 가벼운 개발 일기

[Infra] Apache-Tomcat 무중단 배포 구성기 (1) 구상 및 실패 사례 본문

Server, Infra

[Infra] Apache-Tomcat 무중단 배포 구성기 (1) 구상 및 실패 사례

boogie 2021. 6. 29. 13:36

회사 위키로 공유했던 내용 옮겨적기 ..

 

 

어떤 방식으로 할 것인가

  • 무중단 배포의 방식
    • Rolling
    • Blue/Green
    • Canary
      • 일부 User(ex. 내부 테스터)만 새로운 버전으로 접근되도록 한 상태에서 모든 검증을 마친 뒤 전 사용자 대상으로 오픈한다
      • 별도의 인프라를 구성하여 라우터에서 분기하거나, (모든 요청이 client에서 시작된다면) 내부 테스터의 hosts 파일을 수정하여 일부 사용자만 신규 버전에 접근하도록 할 수 있다






  • 기존의 인프라 구성
    • 물리 서버 한대에 아파치 httpd (web서버) 1대 + 톰캣 WAS 2대가 배포되어 있으며 2대 모두 트래픽을 받고 있음
             


  • 어떤 방식을 적용할 것인가 (+ 기준)
    • 운영중인 서비스들에 적용하는것이기 때문에 제 1 전제는 서비스의 퍼포먼스에 영향을 주지 않을 것
      • 2대가 분산하여 트래픽을 받다가 한대로만 받는것은 물리서버 1대가 감당할수있는 트래픽의 총량이 줄어들게 된다.
      • 무중단 배포만을 위해서 인프라 세팅을 변경하는것을 최소로 한다
    • blue-green의 빠른 롤백은 큰 장점이나, 재배포에 걸리는 시간이 길지 않은 환경에서는 큰 차이가 없을 수 있음
    • 어차피 Blue-Green도 배포 시점에는 두개의 WAS가 기동되어야 한다. WEB-WAS가 물리적으로 한 서버에 있는 우리 구조상, 별 이득이 없다. 어차피 서버 한대에서 2개의 WAS를 운용할수 있는 spec으로 유지해야 한다면. 성능을 최대한 쓰자
    • == Rolling 방식을 적용하기로 함

 

 

첫번째 시도 // Tomcat Parallel Deploy 기능 적용해보기

Parallel Deploy를 적용했을때의 문제점. 혹시 해소 방법이 있다면 귀띔해주세요..!

 

  • 배포파일이 변경되면 자동으로 신규 버전을 띄우고 context switching 해주는 방식
  • 처리중인 요청까지는 구버전에서 처리. 새로 들어오는 요청은 신버전에서 처리
  • 더이상 구버전에서 처리중인 요청이 없다면 구버전을 자동으로 삭제
  • 신규버전의 서버가 아직 마음의 준비가 안됐는데 요청이 인입된다
  • 신버전이 배포된 후 서비스에 투입되는 시점을 조절(delay를 주거나 warm-up 처리를) 할 수 없다
  • 신규 Context 배포 시점에 이슈 발생

 

 

 

 

두번째 시도 // 방화벽 차단 또는 Port Forwarding

 

이해하기 쉬우라고 도식으로 표현하면서 개념상 애매한(난민수용소?) 부분이 없지않아 있다..

 

  • 아파치 오류 로그 대량 발생 + broken pipe + 응답지연
  • retry로 인한 부하/지연 발생
  • 아파치 --> 톰캣 사이의 연결이 끊어지면서,
    • 아파치에서 대량의 오류로그가 발생하고
    • 톰캣에서는 클라이언트가 요청을 중단한 것으로 감지, broken pipe error (=ClientAbortException)이 발생
    • 아파치에서는 worker에서 오류 응답을 주더라도 설정된 시간동안은 worker의 상태를 전환하지 않음 (일시적 오류로 인해 worker가 fail-over되지 않도록)
    • 아파치에서 응답을 받지 못하는경우는 더 한데, 요청 타임아웃까지 대기한 후 실패한 요청으로 처리한다.
    • 실패한 요청들을 (retry_interval 설정에 따른)일정시간 이후 재시도 하게된다.
    • 결국 (타임아웃동안 대기 OR 처리하다가실패,일정시간후 재시도) 함으로 인해서 응답지연이 발생하고, 일시에 대량의 요청을 받는 살아있는 worker도 부하를 받는다
  • 기존 톰캣 down시점에 이슈 발생

 

 

 

나머지는 다음 글로..!!!