본문 바로가기

스프링부트와 AWS로 구현하는 웹서비스

[스프링부트/AWS] 10장 무중단 배포 서비스

9장에서 배운 Travis CI를 사용하면 새로운 Jar가 실행되기 전까진 기존 Jar를 종료시켜 놓기 때문에 서비스가 중단됩니다. 그러나 24시간 서비스하는 네이버나 카카오톡 같은 경우 배포하는 동안 서비스가 정지되지는 않습니다. 어떻게 서비스 중단 없이 배포를 계속 할 수 있는지 알아보겠습니다.

 

- 무장단 배포 방식

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

https://aws.amazon.com/ko/quickstart/architecture/blue-green-deployment/

 

AWS의 블루-그린 배포 - Quick Start

AWS에서 블루/그린 아키텍처를 구축하려면, 배포 안내서의 지침을 따르십시오. 약 15분이 걸리는 배포 프로세스는 다음 단계를 포함합니다. 사전 요구 사항을 확인합니다. 아직 AWS 계정이 없다면

aws.amazon.com

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

여기서는 엔진엑스(NginX)를 이용한 무중단 배포를 진행합니다. 현재 웹 서버, 리버스 프록시, 캐싱, 로드 밸런싱, 미디어 스티리밍 등을 위한 오픈소스 소프트웨어 입니다.

https://victorydntmd.tistory.com/231

 

[Web Server] 아파치 2.4와 Nginx 특징 및 비교

아파치 ( Apache ) Apache 서버는 요청 하나 당 프로세스(또는 쓰레드)가 처리하는 구조입니다. 즉 요청이 많을수록 CPU와 메모리 사용이 증가하기 때문에 성능 저하가 있을 수 있습니다. 또한 Apache 

victorydntmd.tistory.com

 

[nginx] 아파치와 엔진엑스를 비교해보자. (Apache vs Nginx)

Apache는 모든 개발자들에게 친근할 거다.(Nginx에 비해) Nginx가 왜 요즘 뜨고있는 HTTP서버인지, 자료를 조금 조사해보았다. (왜냐면 이제 Nginx 사용해볼거거든..) Apache Apache는 Client 요청을 받으면 MPM(

cornswrold.tistory.com

엔진엑스가 가지고 있는 여러 기능 중 리버스 프록시라는게 있습니다. 리버스 프록시는 외부의 요청을 받아 백앤드 서버로 요청을 전달하는 행위를 이야기합니다.(엔진엑스를 이용한 무중단 배포를 하는 이유 : 가장 저렵하고 쉽다.)

- 사내 비용 지원이 많다면 번거롭게 구축할 필요 없이 AWS 블루 그린 배포 방식을 선택하면 됩니다.

 

기존에 쓰던 EC2에 그대로 적용하면 되므로 배포를 위해 AWS EC2 인스턴스가 하나 더 필요하지 않습니다. 구조는 하나의 EC2 혹은 리눅스 서버에 엔진엑스 1대와 스프링 부트 Jar를 2대 사용하는 것 입니다.

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

사용자 -> Nginx(port : 80, 443) -> 스프링 부트 1 or 스프링 부트 2

운영 과정은 다음과 같습니다.

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

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

이렇게 되면 

  1. 배포하는 동안에도 서비스는 중단되지 않습니다.(엔진엑스는 스프링 부트 1을 바라보기 때문입니다.)
  2. 배포가 끝나고 정상적으로 스프링 부트 2가 구동중인지 확인합니다.
  3. 스프링 부트 2가 정상 구동 중이면 nginx reload 명령어를 통해 8081 대신에 8082를 바라보도록 합니다.
  4. nginx reload는 0.1초 이내에 완료됩니다.

※ 스프링 부트 2를 바라보고 있을 경우 반대로 진행

 

- 이슈사항들

제 githube에 작업했던 스크립트들을 기록해 놓았습니다.

https://github.com/oss0202/com.jordy.book/tree/master/scripts

 

oss0202/com.jordy.book

Jordy Book Project. Contribute to oss0202/com.jordy.book development by creating an account on GitHub.

github.com

 

1. 현재 제가 작업중인 인스턴스(EC2 - AWS Linux 2)에서는 yum을 통한 nginx 설치가 지원되지 않습니다.

 그래서 다음과 같이 진행했습니다.

https://github.com/oss0202/com.jordy.book/blob/master/scripts/nginx_install.txt

 

oss0202/com.jordy.book

Jordy Book Project. Contribute to oss0202/com.jordy.book development by creating an account on GitHub.

github.com

1. 설치할 nginx 찾기
amazon-linux-extras list | grep nginx

2. nginx 설치
sudo amazon-linux-extras install -y nginx1

3. nginx 설치 확인
nginx -v

4. nginx 서비스 시작
sudo service nginx start

 

nginx 실행 완료화면
80포트로 접근한 화면

- nginx.conf 설정 수정

https://github.com/oss0202/com.jordy.book/blob/master/scripts/nginx_conf.txt

 

oss0202/com.jordy.book

Jordy Book Project. Contribute to oss0202/com.jordy.book development by creating an account on GitHub.

github.com

 

책 따라서 진행합니다.

무중단 배포를 진행할 스크립트는 총 5개 입니다. 

  • stop.sh
    • 기존 엔진엑스에 연결되어 있진 않지만, 실행 중이던 스프링 부트 종료
  • start.sh
    • 배포할 신규 버전 스프링 부트 프로젝트를 'stop.sh'로 종료한 'profile'로 실행
  • health.sh
    • 'start.sh'로 실행시킨 프로젝트가 정상적으로 실행됐는지 체크
  • switch.sh
    • 엔진엑스가 바라보는 스프링 부트를 최신 버전으로 변경
  • profile.sh
    • 앞선 4개 스크립트 파일에서 공용으로 사용할 'profile'과 포트 체크 로직

 

이제 이 시스템은 마스터 브랜치에 푸시가 발생하면 자동으로 서버배포가 진행되고, 서버 중단 역시 전혀 없는 시스템이 되었습니다.