Skip to content

Commit f59ea80

Browse files
최종 수정
1 parent 61f8375 commit f59ea80

File tree

1 file changed

+59
-1
lines changed

1 file changed

+59
-1
lines changed

technical/meringue.md

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66

77
저희 팀은 무중단 배포를 도입하기로 결정했는데요.
88

9-
무중단 배포를 도입하며 습득한 지식과 팀의 의사결정 과정을 공유해드리고자 합니다.
9+
무중단 배포를 도입하며 습득한 지식과 루티 팀의 의사결정 과정, 어떤 방식으로 무중단 배포를 구현했는지 공유해드리고자 합니다.
10+
11+
무중단 배포에 대해 개념적으로만 알고 계신 분들, 단일 EC2에서 무중단 배포를 구현하고 싶은 분들에게 도움이 될 것 같습니다.
1012

1113
본격적인 시작에 앞서, 무중단 배포가 무엇인지 알아보도록 하겠습니다.
1214

@@ -402,3 +404,59 @@
402404
당장 해결해야 할 **서비스의 핵심 문제****단기적 인프라 구축 경험**을 비교했을 때, **서비스의 핵심 문제**에 집중하는 것이 가장 적절하고 합리적인 선택입니다.
403405

404406
**리소스가 크게 소모되는 배포 시스템 선택은 지양해야 합니다.**
407+
408+
# 어떻게 구현할 것인가?
409+
410+
## A/B 기반 포트 스위칭 배포 방식
411+
412+
a, b, c 폴더와 각각의 심볼릭 링크를 사용해 포트 스위칭 배포를 구현합니다.
413+
414+
<img src="image/a-b-port-switching-description.png" alt="a-b-port-switching-description.png" style="zoom:36%;"/>
415+
416+
new: 새로 배포되는 버전
417+
418+
now: 현재 배포판의 버전
419+
420+
old: 가장 마지막으로 배포된 버전(롤백을 위함)
421+
422+
## 시나리오
423+
424+
---
425+
426+
<img src="image/a-b-port-switching-example.png" alt="a-b-port-switching-example.png" style="zoom:80%;"/>
427+
428+
1. Github Actions를 통한 CD 동작 시, Github Self-hosted runner가 new에 새로운 버전을 배포하기 위해 필요한 파일을 받아옵니다.
429+
- application.yml
430+
- routie.jar
431+
2. now 애플리케이션을 모니터링하던 중이었다면, 모니터링을 중단합니다.
432+
3. now의 port 파일을 통해 new가 실행될 포트를 결정합니다.
433+
- now의 포트가 8080이었다면, new 는 8081에서 실행됩니다.
434+
- now의 포트가 8081이었다면, new 는 8080에서 실행됩니다.
435+
4. new의 애플리케이션(routie.jar)를 실행합니다.
436+
5. 30초 동안 5초 간격으로 new 애플리케이션에 대한 헬스 체크를 수행합니다.
437+
6. new 애플리케이션에 대한 헬스 체크 완료 시, Nginx 설정을 변경합니다.
438+
- new의 port 내부에 있는 port 로 리버스 프록싱하게 설정합니다.
439+
7. Nginx 를 reload합니다.
440+
8. now 애플리케이션을 종료합니다.
441+
- now의 pid 파일을 사용해 Graceful Shutdown을 시도합니다.
442+
9. 심볼릭 링크 스왑을 수행합니다.
443+
- new → now
444+
- now → old
445+
- old → new
446+
10. now 애플리케이션을 30분동안 모니터링합니다.
447+
- 백그라운드로 실행됩니다.
448+
- 15초 주기의 헬스체크에 두 번 연속 응답하지 않으면 old 애플리케이션으로 롤백합니다.
449+
450+
# 마치며
451+
452+
지금까지 루티 팀이 무중단 배포를 도입하기까지의 고민과 결정 과정을 공유해 드렸습니다.
453+
454+
루티 팀이 선택한 A/B 기반 포트 스위칭 방식은 블루/그린 배포와 비슷하지만, 완벽한 격리를 제공하지 못한다는 점에서 블루/그린 배포라고 볼 수 없습니다.
455+
456+
팀에게 주어진 비용, 시간, 그리고 미래의 인프라 이전 계획까지 고려했을 때, 개발 환경의 비효율 해소와 사용자 경험 개선이라는 과제를 해결하기에 가장 현실적이고 합리적인 선택이었다고 생각합니다.
457+
458+
이번 도전을 통해 저는 완벽한 기술을 추구하기보다는 현재 상황과 제약 조건 내에서 최적의 해결책을 찾아 나가는 과정의 중요성을 다시 한번 깨닫게 되었습니다.
459+
460+
루티 팀의 경험이 저희와 비슷한 환경에서 무중단 배포를 고민하는 다른 개발자분들께 도움이 되기를 바랍니다.
461+
462+
앞으로도 루티 팀은 더 나은 서비스를 위해 계속 도전하겠습니다. 긴 글 읽어주셔서 감사합니다.

0 commit comments

Comments
 (0)