profile image

L o a d i n g . . .

무중단 배포란?

- 서비스를 중단하지 않고 배포하는 것

- 배포: 새로 개발된 코드를 패키징하여 서버에서 새로운 버전의 애플리케이션을 실행하도록 하는 행위


애플리케이션은 언제 중단 되는가?

 

Downtime

  1. 구 버전 (V1)의 애플리케이션을 종료하고
  2. 새로운 버전 (V2)의 애플리케이션을 실행하고
  3. 클라이언트의 요청을 받을 준비가 될 때까지 서비스 중단
  4. 서비스가 중단 되는 시간을 다운타임 (Downtime) 이라고 함

 

Q. V1 서비스를 꼭 중단시켜야 V2를 실행할 수 있나요?

A. 네, V1과 V2가 동일한 포트를 사용한다면 말입니다.

한 서버에서 포트를 동시에 서로 다른 애플리케이션 사용하는 것은 불가능 합니다.

 

Q. 서버만 두 대로 늘린다면 해결이 되나요?

A. 아니오, 사용자 (클라이언트)는 두 서버의 IP 혹은 DNS 주소를 알아야 한다는 문제점이 있습니다.

또한 어떠한 서버가 배포 되는지 알 방법도 없습니다.

 

Q. 그러면 어떻게 문제를 해결해야 하나요?

A. 애플리케이션 서버와 사용자 사이에 중계 (Proxy) 해 줄 서버를 사용하면 됩니다.


Reverse Proxy

- 애플리케이션 서버와 사용자 사이에서 요청을 중계해주는 서버

- 서버를 숨겨주는 역할

- 클라이언트는 서버의 식별이 불가능

 

Proxy

- 클라이언트를 숨겨주는 역할

- 서버는 클라이언트의 식별이 불가능함


로드 밸런싱 (부하 분산)

로드밸런싱

- 리버스 프록시로 서버를 숨기므로, 트래픽도 분산이 가능

- 로드 밸런싱: 하나의 서버에서 받아야 할 트래픽을 여러 서버로 분산

- 프록시와 로드 밸런싱을 위해 현재 가장 인기있는 웹서버가 바로 Nginx


롤링 (Rolling)

롤링

- 일반적인 배포를 의미함, 단순하게 서버를 구성하여 배포하는 전략

- 구 버전에서 신 버전으로 트래픽을 점진적으로 전환하는 배포

- 관리는 편하지만, 배포 중 한쪽 인스턴스의 수가 감소되므로 서버 처리 용량을 미리 고려해야 함

 


블루 그린 (Blue Green)

구 버전 (블루) / 신 버전 (그린)


- 구 버전은 블루, 신 버전은 그린

- 신 버전을 배포하고 일제히 전환하여 모든 연결을 신 버전을 바라보게 하는 전략

- 빠른 롤백 가능, 운영 환경에 영향을 주지 않고, 실제 서비스 환경으로 신 버전 테스트 가능

- 시스템 자원이 두 배로 필요하여 비용 많이 발생하는 단점


카나리 (Canary)

카나리 배포.gif

- 카나리아 새는 광산에서 유독 가스 누출의 위험을 알리는 용도의 새였음

- 카나리 배포는 위험을 빠르게 감지할 수 있는 배포 전략

- 지정한 서버 또는 특정 유저에게만 배포했다가 정상적이면 전체를 배포함

- 서버의 트래픽의 일부를 신 버전으로 분산하여 오류 여부 확인 가능 (A/B 테스트 가능), 성능 모니터링에 유용

- 트래픽을 분산시킬 때는 라우팅을 랜덤하게 가능, 사용자로 분류도 가능


롤링 (Rolling) 배포 

- 트래픽을 점진적으로 구 버전에서 신 버전으로 옮기는 방식

 

롤링 배포 장점

  • k8s, elastic beanstalk 와 같은 많은 오케스트레이션 도구에서 지원하여 간편함
  • 많은 서버 자원을 확보하지 않아도 무중단 배포 가능
  • 점진적으로 새로운 버전이 사용자에게 출시되므로, 배포로 인한 위험성이 다소 줄어듦

 

롤링 배포 단점

  • 배포 도중 서비스 중인 인스턴스의 수가 줄어들게 되어 각각의 서버가 부담하는 트래픽의 양이 늘어날 수 있음
  • 구 버전과 신 버전의 애플리케이션이 동시에 서비스 되므로 호환성 문제 발생 가능

 

롤링 배포 방식

방식 1.gif

  1. 인스턴스 하나 추가하고, 새로운 버전을 실행
  2. 로드 밸런서에 이 인스턴스를 연결함
  3. 기존 구 버전 애플리케이션이 실행되는 인스턴스 하나를 줄임

- 서버 개수를 유연하게 조절할 수 있는 AWS와 같은 클라우드를 기반으로 서비스 운영 시 적합


방식 2.gif

  1. V1이 실행되고 있는 서버 하나를 로드 밸런서에서 제거 -> 해당 서버에는 트래픽 도달 X
  2. 해당 서버의 애플리케이션을 V2로 교체
  3. 1번, 2번을 반복하여 모든 서버를 새로운 버전으로 교체

- 물리적인 서버로 서비스를 운영하는 상황에서 적합


참고

1. https://velog.io/@znftm97/%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-%ED%99%98%EA%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

2. https://zzang9ha.tistory.com/311

3. https://hudi.blog/zero-downtime-deployment/

복사했습니다!