Back-End/Springboot와 AWS로 혼자 구현하는 웹 서비스

Chapter 10. 24시간 365일 중단 없는 서비스를 만들자 (1)

yeonx 2022. 5. 7. 13:56
728x90

10.1 무중단 배포 소개

 

예전애는 배포라고 하면 팀의 아주 큰 이벤트이기 때문에 다 같이 코드를 합치는 날과 배포를 하는 날을 정하고 진행했다. 특히 배포일에는 사용자가 적은 새벽 시간에 개발자들이 모두 남아 배포 준비를 해야만 했고 배포가 잦아질 때는 새벽마다 남아야 했다.

배포를 하고 나서 정말 치명적문제가 발생하면 어떻게 해야 할까?

-> 새벽 시간에 부랴부랴 문제를 해결하다가, 사용자 유입이 많아지는 아침이 되면 긴급 점검을 공지로 올리고, 수정을 해야 한다.

이렇게 배포가 서비스를 정지해야만 가능할 때는 롤백조차 어려우므로 개발자들이 정말 고생한다. 그리고 서비스 입장에서도 배포만 했다 하면 서비스가 정지돼야 하니 곤혹스럽다 그래서 서비스를 정지하지 않고, 배포할 수 있는 방법들을 찾기 시작했고 이를 무중단 배포라고 한다.

 

무중단 배포 방식에는 몇 가지가 있다.

  • AWS에서 블루 그린(Blue-Green) 무중단 배포
  • 도커를 이용한 웹서비스 무중단 배포

이외에도 L4 스위치를 이용한 무중단 배포 방법도 있지만, L4가 워낙 고가의 장비이다 보니 대형 인터넷 기업 외에는 쓸 일이 거의 없다.

이번 장에서 우리가 진행할 방법은 엔진엑스를 이용한 무중단 배포이다. 엔진엑스는 웹서버, 리버스 프록시, 캐싱, 로드 밸런싱, 미디어 스트리밍 등을 위한 오픈 소스 소프트웨어이다.

이전에 아파티가 대세였던 자리를 완전히 빼앗은 가장 유명한 웹서버이자 오픈소스이다. 고성능 웹서버이기 때문에 대부분 서비스들이 현재는 엔진엑스를 사용하고 있다.

엔진엑스가 가지고 있는 여러 기능 중 리버스 프록시가 있다. 리버스프로시란 엔진엑스가 외부의 요청을 받아 백엔드 서버로 요청을 전달하는 행위를 이야기한다. 리버스 프록시 서버는 요청을 전달하고, 실제 요청에 대한 처리는 뒷단의 웹 애플리케이션 서버들이 처리한다.

우리는 이 리버스 프록시를 통해 무중단 배포 환경을 구축해 볼 예정이다. 엔진엑스를 이용한 무중단 배포를 하는 이유는 가장 저렴하고 쉽기 때문이다. 

기존에 쓰던 EC2에 그대로 적용하면 되므로 배포를 위해 AWS EC2 인스턴스가 하나 더 필요하지 않습니다. 추가로 이 방식은 꼭 AWS와 같은 클라우드 인프라가 구축되어 있지 않아도 사용할 수 있는 범용적인 방법이다. 즉, 개인 서버 혹은 사내 서버에서도 동일한 방식으로 구축할 수 있으므로 사용처가 많다.

구조는 간단하다. 하나의 EC2 혹은 리눅스 ㅅ버에 엔진엑스 1대와 스프링부트 Jar를 2대를 사용하는 것이다.

  • 엔진엑스는 80(http), 443(https) 포트를 할당한다.
  • 스프링 부트 1은 8081 포트로 실행한다.
  • 스프링 부트 2는 8082 포트로 실행한다.

엔진엑스 무중단 배포 1은 다음과 같은 구조가 된다.

운영 과정은 다음과 같다.

  1.  사용자는 서비스 주소로 접속한다. (80 혹은 443 포트).
  2. 엔진엑스는 사용자의 요청을 받아 현재 연결된 스프링 부트로 요청을 전달한다.
  3. 스프링 부트 2는 엔진엑스와 연결된 상태가 아니니 요청받지 못한다.

1.1 버전으로 신규 배포가 필요하면, 엔진엑스와 연결되지 않은 스프링 부트 2(8082 포트)로 배포한다.

  1. 배포하는 동안에도 서비스는 중단되지 않음
  2. 배포가 끝나고 정상적으로 스프링 부트 2가 구동중인지 확인한다.
  3. 스프링 부트2가 정상 구동 중이면 nginx reload 명령어를 통해 8081 대신에 8082를 바라보도록 한다.
  4. nginx reload는 0.1초 이내에 완료된다

이후 1.2 버전 배포가 필요하면 이번에는 스프링 부트 1로 배포한다.

  1. 현재는 엔진엑스와 연결된 것이 스프링 부트 2이다.
  2. 스프링 부트 1의 배포가 끝났다면 엔진엑스가 스프링 부트 1을 바라보도록 변경하고 nginx reload를 실행한다.
  3. 이후 요청부터는 엔진엑스가 스프링 부트 1로 요청을 전달한다.

이렇게 구성하게 되면 전체 시스템 구조는 다음과 같다.

기존 구조에서 EC2 내부의 구조만 변경된 것이니 크게 걱정하지 않아도 된다.

 

 

 

 

출처 : https://qkrtmdgus84.github.io/springboot%20&%20aws/SpringBoot-&-AWS-10/

출처 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 [이동욱 지음]