인프라/Deploy

무중단 배포, Blue Green Deployment

BUST 2018. 6. 29. 15:15

무중단 배포, Blue Green Deployment

API 서버를 새로운 기능을 추가할려고 하면 서버를 일단 정지를 시키고 새로운 기능과 함께 배포하는 방식을 사용할수 있지만 서비스 정지가 되기 때문에 
서비스의 영향이 미치게 된다. 무중단 배포를 할 필요성이 있는 데 그중 Blue Green Deployment에 대해 정리해보자.


Blue, Green?

- Blue는 기존 버전, Green은 새로운 기능을 포함한 새로운 버전
- Router를 통해 Blue로 이동하는 트래픽을 Green으로 변경을 할수가 있다.
  - 여기에서의 Router는 Http 일경우에는 Nginx, AWS ELB와 같은 LB이다

배포 절차

1. Green을 배포를 진행을 한다.
2. Router를 통해 Green을 트래픽을 보낸다.
3. Blue을 트래픽을 끊는다.
4. 모든 트래픽은 Green으로 흐른다.

Router는 보통 Load Blancer로서 LVS, AWS ELB 같은 것을 활용할수가 있다.

문제가 생겨 롤백시

- Router를 통해 들어오는 트래픽을 Blue로 변경한다.


그외 것들

- 운영 환경을 변경(switable)이 할수 있다는 것이 핵심 idea이다.
- 2개의 운영 환경이 필요하기 때문에 서버의 갯수 많이 늘어난다.
  - 한대의 서버에 2개의 환경을 설치하는 방법를 이용하여 서버의 갯수를 줄일수가 있다. 서버의 성능이 좋은 경우에만 해당,
  - nginx 같은 경우에는 reload 시간이 거의 zero down time이기 때문에 한대의 서버에서 green, blue 환경을 구축하는것이 가능할듯.
- 트래픽이 Green->Blue로 흘리경우 갑자기 많은 트래픽이 서버에 들어가기 때문에 문제가 발생이 될수 있다. 이와 같은 문제는 아래와 같은 방법으로 해결할수 있다.
  - AWS ELB의 Slow Start : blue에서 green으로 트래픽을 점진적으로 증가시키는 방법
  - Warmer WebHook Api : 트래픽을 받기 전에 서버가 준비할수 있도록 Webhook APi를 통해 처리
     - 보통 DB의 Select 문을 미리날리는 식으로 구현이 된다.
- 웹서비스 특화된 배포방식이기 때문에 배치, 실시간 스트림 등에는 안맞는 부분이 존재한다. 
  - Docker Swarm, Kubernetes, AWS ECS 등과 같은 다른 Tool를 이용하여 사용할수 있다.
  - 무중단으로 할필요가 없는 경우에는 그냥 종료시키는 로직으로 사용되어도 상관이 없을듯하나, Graceful shutdown의 적용은 필요함.
- Database에서도 적용이 가능하지만 상당히 어려운 과정이다.

Referecne

- https://martinfowler.com/bliki/BlueGreenDeployment.html