배포하는 동안 애플리케이션이 종료된다는 문제가 있습니다.
긴 기간은 아니지만, 새로운 Jar가 실행되기 전까진 기존 Jar를 종료시켜 놓기 때문에 서비스가 종료됩니다.
반면 24시간 서비스하는 네이버나 카카오톡 같은 경우 배포하는 동안 서비스가 정지되지 않습니다.
무중단 배포 소개
서비스를 정지하지 않고, 배포하는 것을 무중단 배포라고 합니다.
무중단 배포 방식에는 몇 가지가 있습니다.
- AWS에서 블루 그린(Blue-Green) 무중단 배포
- 도커를 이용한 웹서비스 무중단 배포
이외에도 L4 스위치를 이용한 무중단 배포 방법도 있지만, L4가 워낙 고가의 장비이다 보니 대형 인터넷 기업 외에는 쓸 일이 거의 없습니다.
우리가 진행할 방법은 엔진엑스(Nginx)를 이용한 무중단 배포입니다.
엔진엑스는 웹 서버, 리버스 프록시, 캐싱, 로드 밸런싱, 미디어 스트리밍 등을 위한 오픈소스 소프트웨어입니다.
이전에 아파치(Apache)가 대세였던 자리를 완전히 빼앗은 가장 유명한 웹 서버이자 오픈소스입니다.
고성능 웹서버이기 때문에 대부분 서비스들이 현재는 엔진엑스를 사용하고 있습니다.
엔진엑스가 가지고 있는 여러 기능 중 리버스 프록시가 있습니다.
리버스 프록시란 엔진엑스가 외부의 요청을 받아 백엔드 서버로 요청을 전달하는 행위를 이야기합니다.
리버스 프록시 서버(엔진엑스)는 요청을 전달하고, 실제 요청에 대한 처리는 뒷단의 웹 애플리케이션들이 처리합니다.
우리는 이 리버스 프록시를 통해 무중단 배포 환경을 구축해 볼 예정입니다.
엔진엑스를 이용한 무중단 배포를 하는 이유는 간단합니다.
가장 저렴하고 쉽기 때문입니다.
사내에서 비용 지원이 많다면 번거롭게 구축할 필요 없이 AWS 블루 그린 배포 방식을 선택하면 됩니다.
기존에 쓰던 EC2에 그대로 적용하면 되므로 배포를 위해 AWS EC2 인스턴스가 하나 더 필요하지 않습니다.
추가로 이 방식은 꼭 AWS와 같은 클라우드 인프라가 구축되어 있지 않아도 사용할 수 있는 범용적인 방법입니다.
즉, 개인 서버 혹은 사내 서버에서도 동일한 방식으로 구축할 수 있으므로 사용처가 많습니다.
구조는 간단합니다.
하나의 EC2 혹은 리눅스 서버에 엔진엑스 1대와 스프링 부트 Jar를 2대를 사용하는 것입니다.
- 엔진엑스는 80(http), 443(https) 포트를 할당합니다.
- 스프링 부트1은 8081 포트로 실행합니다.
- 스프링 부트2는 8082 포트로 실행합니다.
엔진엑스 무중단 배포 1은 다음과 같은 구조가 됩니다.
운영 과정은 다음과 같습니다.
- 사용자는 서비스 주소로 접속합니다(80 혹은 443 포트).
- 엔진엑스는 사용자의 요청을 받아 현재 연결된 스프링 부트로 요청을 전달합니다.
- 스프링 부트1 즉, 8081 포트로 요청을 전달한다고 가정하겠습니다.
- 스프링 부트2는 엔진엑스와 연결된 상태가 아니니 요청받지 못합니다.
1.1 버전으로 신규 배포가 필요하면, 엔진엑스와 연결되지 않은 스프링 부트2(8082 포트)로 배포합니다.
- 배포하는 동안에도 서비스는 중단되지 않습니다.
- 엔진엑스는 스프링 부트1을 바라보기 때문입니다.
- 배포가 끝나고 정상적으로 스프링 부트2가 구동 중인지 확인합니다.
- 스프링 부트2가 정상 구동 중이면 nginx reload 명령어를 통해 8081 대신에 8082를 바라보도록 합니다.
- nginx reload는 0.1초 이내에 완료됩니다.
이후 1.2 버전 배포가 필요하면 이번에는 스프링 부트1로 배포합니다.
- 현재는 엔진엑스와 연결된 것이 스프링 부트2 입니다.
- 스프링 부트1의 배포가 끝났다면 엔진엑스가 스프링 부트1을 바라보도록 변경하고 nginx reload를 실행합니다.
- 이후 요청부터는 엔진엑스가 스프링 부트1로 요청을 전달합니다.
이렇게 구성하게 되면 전체 시스템 구조는 다음과 같습니다.
기존 구조에서 EC2 내부의 구조만 변경된 것입니다.
참고
'CI & CD' 카테고리의 다른 글
[Nginx] 24시간 365일 중단 없는 서비스 만들기 3 - 무중단 배포 스크립트 만들기 (0) | 2021.07.20 |
---|---|
[Nginx] 24시간 365일 중단 없는 서비스 만들기 2 - 엔진엑스 설치와 스프링 부트 연동하기 (0) | 2021.07.19 |
[Travis CI] 코드가 푸시되면 자동으로 배포하기 5 - 배포 자동화 구성 (0) | 2021.07.18 |
[Travis CI] 코드가 푸시되면 자동으로 배포하기 4 - Travis CI와 AWS S3, CodeDeploy 연동하기 (0) | 2021.07.18 |
[Travis CI] 코드가 푸시되면 자동으로 배포하기 3 - Travis CI와 AWS S3 연동하기 (0) | 2021.07.18 |
댓글