중단 배포
서비스에 대한 내용을 업데이트해야할 때 운영 중에 서비스를 내리고 업데이트 된 서비스를 배포한다. 하지만 서비스를 내리는 과정에서 서비스를 사용하지 못하는 Downtime이 발생한다. 이때 고객의 서비스 접근이 차단되고 더 나아가 서비스 중 차단으로 문제가 발생한다. 이를 해결하기 위해 중단 배포 대신 무중단 배포 3가지 방법 Rolling, Blue/Green, Canary 배포에 대해서 소개하고자 한다.
Rolling 배포
State0-State1-State2-FinalState 순으로 진행된다고 생각해보자. 파란색 서비스는 기존에 운영되던 V1 서비스, 초록색 서비스는 업데이트된 V2서비스라고 하자. Rolling 배포는 서비스 별로 업데이트 내용을 한번에 바꾸는 것이 아닌 점진적으로 트래픽 구버전인 V1에서 신버전 V2로 옮긴다. 여기서도 두 가지 방법으로 나뉘는 데, 전환할 때 일부 V1과 일부 V2를 둘다 유지하는 상황에서 전환하는 방법과 일부 V1을 중단하고 일부 V2를 구동하여 전환하는 방법이 있다. Google에서는 다음과 같은 Rolling 방법으로 V1에서 V2로 전환할 때, 일부 V1 서비스를 남겨 놓으며 V2에 대한 문제를 테스트와 모니터링하면서 전체적으로 전환시킨다.
Rolling 배포 장점
- 위험도
일부 버전을 전환시키면서 테스트와 모니터링하기 때문에 배포로 인한 서비스 전체의 위험을 줄일 수 있다.
- 비용
동시에 모든 구버전 V1와 신버전 V2을 운영할 필요가 없고 일부 테스트가 마무리된다면 바로 전환하면 되기 때문에 인프라 비용적인 측면에서 많은 서버 자원을 확보할 필요가 없다.
Rolling 배포 단점
- 부하
Rolling 방법 중 일부 서비스를 중단한 상태에서 진행하는 방법이 있었는데 이 서비스에 할당된 트래픽을 다른 서비스로 옮기기 때문에 다른 서비스가 부담을 가지게 되는 문제가 발생한다.
- 호환성
일부 서비스를 점진적으로 전환하기 때문에 아직 전환되지 않은 서비스와 버전이 다른 호환성 문제를 일으킬 수 있는 문제를 갖고 있다.
Blue/Green 배포
기존 운영되는 서비스를 Blue 이후 업데이트된 서비스를 Green이라고 하자. Blue가 운영되고 있는 중 Green 서비스를 구축한다. 이후 Green 서비스 구축 완료를 확인한 후 LoadBalancer에서 라우팅을 Blue에서 Green으로 전환한다. 여기서 Blue 서비스를 중단시켜도 되지만 그대로 유지하는 경우도 있다. 이는 나중에 Green에서 문제가 발생하였을 때 바로 Rollback할 수 있도록 하기 위함이다.
Blue/Green 배포 장점
- 호환성 문제 해결
Rolling과 다르게 한번에 Blue에서 Green으로 전환이 되므로 일부가 다른 버전일 경우가 생기지 않아 호환성 문제가 해결된다.
- 간편한 RollBack
동시에 Blue/Green 서비스가 운영되고 있기 때문에 Green에서 문제가 발생했을 시 바로 Blue로 돌려 간편하게 Rollback이 가능하다.
Blue/Green 배포 단점
- 비용
당연하게 Blue와 Green 서비스를 동시에 운영하기 때문에 기존 서비스 운영보다 약 두 배 이상의 인프라 비용이 필요하다.
Canary 배포
점진적으로 구버전에서 신버전으로 서비스를 전환하는 것은 앞서 말한 Polling 배포와 일부 동일하다. 하지만 Polling 배포와 다른 점은 신버전으로 서비스를 소수의 인원만 사용하여 테스트를 먼저 실행한다. Polling 배포와 다르게 신버전에 대하여 오류를 미리 감지하고 문제를 해결하는 과정이 포함된다. Canary 배포에 대해서 찾아보면서 유래에 대해 알게 되었는데 예전 광부들이 가스에 예민한 카나리아 새를 이용해 가스 누출을 감지했다는 이야기에서 유래되었다는 것이 신기했다. :)
Canary 배포 장점
- 위험
앞서 신버전 서비스에 소수 인원으로 테스트를 진행하기 때문에 전환에 대한 위험도를 줄일 수 있다.
Canary 배포 단점
- 배포 시간
Polling 배포와 다르게 테스트 과정이 포함되어 있어 배포 종합시간이 Polling배포보다 길다는 단점이 있다.
- 호환성
Polling 배포와 마찬가지로 버전을 구버전과 신버전 서비스를 운영하기 때문에 호환성이 맞지 않는 문제가 생길 수 있다.
Reference
'CICD' 카테고리의 다른 글
[CICD] AWS EC2에서 Docker에서 Jenkins를 이용하여 서버 배포하기 (0) | 2024.04.30 |
---|