목차
- 1. 무중단 배포(Zero Downtime Deployment)란?
- 2. 무중단 배포가 필요한 이유
- (1) 다운타임이란?
- 3. 무중단 배포 방법
- (1) 블루-그린 배포 (Blue-Green Deployment)
- (2) 카나리 배포 (Canary Deployment)
- (3) 롤링 배포 (Rolling Deployment)
- 4. Blue-Green 무중단 배포 적용
- (1) Nginx 설정 파일 수정
- (2) Green 서버에 새로운 버전의 애플리케이션 배포
- (3) Green 서버에 새로운 버전의 애플리케이션 배포
- (4) Green 서버에 새로운 버전의 애플리케이션 배포
1. 무중단 배포(Zero Downtime Deployment)란?
무중단 배포란 애플리케이션의 배포 과정에서 서비스가 중단되지 않도록 하는 배포 방식이다. 즉, 새로운 버전의 애플리케이션을 배포하더라도 사용자에게 서비스의 장애나 다운타임이 발생하지 않도록 하는 것을 목표로 한다.
2. 무중단 배포가 필요한 이유
그렇다면 무중단 배포가 왜 필요할까? 서비스가 왜 중단되도록 하지 않아야 할까?
이전 블로깅에서 살펴보았던 것처럼 서비스 배포 또는 CI/CD를 행하게 되면 빌드-테스트-프로덕션 배포 과정에서 다운타임이 발생하게 된다. 이로 인해 사용자 입장에서는 서비스가 정상적으로 작동하지 않는 것처럼 보이기 때문에 다운타임은 치명적이다.
(1) 다운타임이란?

다운타임이란 새로운 서비스를 배포하기 위해 기존 서비스를 종료하고, 새로운 서비스를 시작하는 두 행위 사이에 발생하는 시간을 말한다.
3. 무중단 배포 방법
(1) 블루-그린 배포 (Blue-Green Deployment)

- 정의 : 두 개의 독립적인 환경(블루와 그린)을 운영하여 배포를 진행하는 방법
- 배포 방식
- 블루 환경 : 기존의 서비스가 실행되고 있는 환경
- 그린 환경 : 새로운 버전의 애플리케이션이 배포되는 환경
- 새로운 버전이 준비되면 그린 환경에 배포하고, 테스트 후에 트래픽을 그린 환경으로 전환
- 블루 환경은 문제가 발생하면 그대로 유지되며, 롤백이 가능함
이처럼 블루-그린 배포는 두 개의 독립적인 환경을 운영하는 것이 특징이다. 트래픽 전환 후 문제가 발생하면 빠르게 블루 환경으로 롤백할 수 있다는 장점이 있다.
(2) 카나리 배포 (Canary Deployment)

- 정의 : 새로운 버전의 애플리케이션을 일부 사용자에게만 배포하여 점진적으로 전체 시스템에 적용하는 방법
- 배포 방식
- 소수의 사용자에게만 새로운 버전을 배포
- 성능 및 안정성을 모니터링한 후, 문제가 없으면 점차 전체 사용자에게 배포
이처럼 카나리 배포는 소수의 사용자에게만 먼저 새로운 버전을 배포해 성능 및 안정성을 확인한다. 따라서 발생할 수 있는 리스크가 적고 더 나아가 점진적인 배포로 배포 리스크를 분산시킬 수 있다.
(3) 롤링 배포 (Rolling Deployment)

- 정의 : 서버 클러스터에서 한 번에 하나씩 노드를 교체하는 방법
- 배포 방식
- 여러 서버에서 실행 중인 애플리케이션을 순차적으로 업데이트
- 각 서버를 순차적으로 새로운 버전으로 교체하며, 배포가 완료될 때까지 사용자에게 서비스는 계속 제공됨
이처럼 롤링 배포는 한 번에 모든 서버를 배포하지 않기 때문에 전체 시스템의 다운타임을 방지할 수 있다.
4. Blue-Green 무중단 배포 적용
가장 이해하기 쉬웠던 Blue-Green 무중단 배포를 적용해보려 한다.
(1) Nginx 설정 파일 수정
Blue 서버와 Green 서버로 나누기 위해 Nginx 설정 파일을 수정한다.
$ sudo nano /etc/nginx/sites-available/default
upstream blue {
server localhost:8080;
}
upstream green {
server localhost:8081;
}
server {
listen 80;
server_name aws-study.kro.kr;
location / {
proxy_pass http://blue;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
$ sudo nginx -s reload
(2) Green 서버에 새로운 버전의 애플리케이션 배포
deploy_to_green.sh
# 변수 설정
PROJECT_DIR=/home/ubuntu/spring-roomescape-playground/build/libs
JAR_NAME=spring-roomescape-playground-0.0.1-SNAPSHOT.jar
TARGET_PORT=8081
LOG_FILE=/home/ubuntu/app/green.log
# 디렉토리 생성
mkdir -p /home/ubuntu/app/target
mkdir -p /home/ubuntu/app
echo "Stopping Green server..."
fuser -k ${TARGET_PORT}/tcp
echo "Deploying new version to Green server..."
# 빌드된 JAR 파일 복사
cp ${PROJECT_DIR}/${JAR_NAME} /home/ubuntu/app/
# Green 서버 실행
nohup java -jar /home/ubuntu/app/${JAR_NAME} --server.port=${TARGET_PORT} > ${LOG_FILE} 2>&1 &
echo "Green server deployed successfully!"
(3) Green 서버에 새로운 버전의 애플리케이션 배포
switch_traffic_to_green.sh
NGINX_CONF=/etc/nginx/sites-available/default
echo "Switching traffic to Green server..."
sudo sed -i 's/proxy_pass http:\/\/localhost:8080;/proxy_pass http:\/\/localhost:8081;/' ${NGINX_CONF}
sudo nginx -s reload
echo "Traffic successfully switched to Green server!"
(4) Green 서버에 새로운 버전의 애플리케이션 배포
test_green.sh
GREEN_URL=http://localhost:8081/health
echo "Checking Green server health..."
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" ${GREEN_URL})
if [ "$RESPONSE" == "200" ]; then
echo "Green server is healthy!"
exit 0
else
echo "Green server failed. Reverting to Blue server..."
sudo sed -i 's/proxy_pass http:\/\/localhost:8081;/proxy_pass http:\/\/localhost:8080;/' /etc/nginx/sites-available/default
sudo nginx -s reload
exit 1
fi
참고 자료
https://velog.io/@kys95/%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC
무중단 배포
앞서 CI/CD를 통한 배포 자동화를 통해 서비스를 운영하고 있다고 가정했을 때 어떤 문제점이 발생할까요? 그것은 바로 배포하는 동안 애플리케이션이 종료된다는 문제입니다. 즉, 새로운 서비스
velog.io
https://hudi.blog/zero-downtime-deployment/#BlueGreen-%EB%B0%B0%ED%8F%AC
무중단 배포 아키텍처와 배포 전략 (Rolling, Blue/Green, Canary)
중단 배포 방식과 다운타임 다운타임 서버 한대로 서비스를 운영한다고 가정해보자. 현재 서버에는 V1 버전이 실행되고 있는 상황이다. 그리고 우리는 이번에 여러 기능을 추가한 V2 버전을 새로
hudi.blog
Nginx+Spring Boot 무중단 배포 구축하기
제가 최근 진행한 식구하자 프로젝트에서 무중단 배포를 구축하였는데, 이번 포스팅에서 그 과정을 다루도록 하겠습니다무중단 배포를 진행하기전에 AWS ec2를 통한 배포와 CI/CD환경은 구축이 되
velog.io
'Backend > Infra' 카테고리의 다른 글
[Infra] 컨테이너 오케스트레이션 (0) | 2025.01.07 |
---|---|
[Infra] Docker란?(feat. Docker, Docker File, Docker Compose) (0) | 2025.01.03 |
[Infra] 배포한 서버에 CI/CD 적용하기(feat. Jenkins) (0) | 2024.12.28 |
[Infra] WAS 서버를 배포하며 겪은 에러 해결 방법 (1) | 2024.12.28 |
[Infra] AWS EC2를 이용한 WAS 서버 배포 (0) | 2024.12.23 |