Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] 프로덕션 서버 무중단 배포 환경 구축 #413

Merged
merged 2 commits into from
Oct 17, 2024

Conversation

hw0603
Copy link
Member

@hw0603 hw0603 commented Oct 16, 2024

관련 이슈

작업 내용

프로덕션 서버(prod-a, prod-b)에 무중단 배포를 적용합니다.
nginx와 docker 컨테이너를 활용한 Blue/Green 전략을 사용하며, 인스턴스 내에서 컨테이너 두 개를 실행하고, 새로운 컨테이너에 이상이 없다면 proxy_pass를 전환시킨 후 기존 컨테이너를 종료하는 형태로 동작합니다.

echo "0. 현재 실행 중인 컨테이너 목록 확인"
show_docker_ps

echo "1. Green 포트 결정"
determine_port

echo "2. Green 컨테이너 실행"
run_green_container $new_was_port $new_actuator_port

echo "3. Green Health Check"
green_health_check $new_actuator_port

echo "4. nginx 포트 재설정 -> nginx reload"
nginx_reload $new_was_port $new_actuator_port $past_was_port $past_actuator_port

echo "5. Blue 컨테이너 stop -> rm"
stop_blue_container $past_was_port

echo "6. 배포 완료"
finalize $new_was_port

전체 플로우는 위와 같으며, 스크립트 상세 구현은 서브모듈을 참고해 주세요.

특이 사항

Connection: keep-alive에서 nginx가 TCP 커넥션을 처리하는 방식 때문에 nginx reload 시 약 0.1~0.2초의 다운타임이 발생합니다. 서비스 특성 상 이정도의 다운타임이 크리티컬한 장애요소가 되지는 않지만, 진정한 '무중단' 배포로 볼 수 없다는 시각 역시 존재합니다.
nginx worker를 튜닝하여 다운타임을 0.0초대로 감소시킨 사례가 존재하긴 하지만, 완전히 제로 다운타임을 만드는 것은 nginx만을 가지고는 불가능해 보입니다.

현재 ELB를 사용하여 프로덕션 인스턴스가 이중화되어 있으므로, 한쪽의 배포가 진행되는 찰나의 순간동안 로드밸런서의 라우팅을 제어하여 (롤링+블루그린을 혼합한 형태가 되겠네요🤔) 구현이 가능할 것 같긴 한데 아래와 같은 고민이 좀 더 필요합니다.

  • CSP 기능에 배포 프로세스가 종속됨
  • ELB에서 대상 그룹을 수정했을 때 기존에 연결되어 있던 Keepalive TCP Connection이 Graceful Shutdown 되는지 여부 확인 필요

Note

현재는 배포 이후 기존의 컨테이너를 바로 종료시키므로, 블루그린 배포의 이점 중 하나인 빠른 롤백을 100% 활용하지는 못하고 있습니다.
이후 자동 롤백의 기준과 구현 방향을 확정지은 후, 스크립트 수정이 필요해 보입니다.

ref: https://trac.nginx.org/nginx/ticket/1022#comment:1

리뷰 요구사항 (선택)

@hw0603 hw0603 added 🐈‍⬛ 백엔드 백엔드 관련 이슈에요 :) ⚙️ 환경설정 환경을 설정해요 :) 🐳 인프라 인프라를 구축해요 :) labels Oct 16, 2024
@hw0603 hw0603 self-assigned this Oct 16, 2024
Copy link

Test Results

156 tests   156 ✅  20s ⏱️
 32 suites    0 💤
 32 files      0 ❌

Results for commit cc92253.

Copy link
Contributor

@hwinkr hwinkr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏

Copy link
Contributor

@Largopie Largopie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Copy link
Contributor

@Yoonkyoungme Yoonkyoungme left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🍑

@seokmyungham
Copy link
Contributor

seokmyungham commented Oct 16, 2024

ELB 대상 그룹을 동적으로 변경해서 인스턴스 하나씩 배포하는 방법 괜찮은 것 같아요. 찾아보니 AWS ELB는 Deregistration Delay를 지원하고 있어 이론상(킹론상) Graceful Shutdown이 가능해보입니다.

Elastic Load Balancing stops sending requests to targets that are deregistering. By default, Elastic Load Balancing waits 300 seconds before completing the deregistration process, which can help in-flight requests to the target to complete.

https://docs.aws.amazon.com/elasticloadbalancing/latest/application/edit-target-group-attributes.html

가장 큰 고려사항은 CSP 기능에 배포 프로세스가 종속됨이 되겠네요. 지금 ELB가 너무 많은 걸 해주고 있기 때문에 금전적 지원이 종료되는 시점에 ELB를 사용하지 않게 된다면 이 모든 작업을 엔진엑스가 하게 될 것 같아요. (가장 간단한 마이그레이션을 고려)
인증, 로드 밸런싱, 헬스체크, 라우팅, 포워딩 .. 그 때 가서 이 방법이 가능할지 예측도 불가능하구요.

그치만 현재로써 도전할 가치는 충분해보입니다. 같이 고민해보면 좋겠습니다.

Copy link
Contributor

@ehBeak ehBeak left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😎

Copy link
Contributor

@ikjo39 ikjo39 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은데요?

Copy link
Contributor

@seunghye218 seunghye218 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@hw0603 hw0603 merged commit 3120495 into develop Oct 17, 2024
22 checks passed
@hw0603 hw0603 deleted the feat/412-zero-downtime-deployment branch October 17, 2024 05:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
⚙️ 환경설정 환경을 설정해요 :) 🐈‍⬛ 백엔드 백엔드 관련 이슈에요 :) 🐳 인프라 인프라를 구축해요 :)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BE] 프로덕션 서버에 무중단 배포를 적용해요 :)
8 participants