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