ABOUT ME

-

Total
-
  • Blue-Green deployment (블루-그린 배포)
    컴퓨터 2023. 1. 11. 21:25
    728x90
    반응형

    AWS EC2에서 서버를 실행하다가 (간단한 REST API 프로그램) 매번 코드를 고칠 때마다 다시 빌드하고 프로세스를 kill 하고 다시 실행했다.

    여기서 어떻게 하면 재시작을 줄이고/없애고 코드를 업데이트할 수 있을까 궁금했다.

    찾아보니 이미 알고있던 Hot-reloading도 있는데 ec2에서 Rust를 계속 빌드하게 하고 싶진 않았다.

     

    여러 방법들이 있는데

     

    1. Blue-Green deployment: 하나는 이전 버전의 코드(Blue)를 실행하고 다른 하나는 새 버전의 코드(Green)를 실행하는 두 가지 동일한 환경이 있다. 새 버전을 배포할 준비가 되면 트래픽을 Green 환경으로 전환하고 완전히 작동하는지 확인한 후 Blue 환경을 종료할 수 있게 하는 방법
    2. Canary Deployment: Canary 배포를 사용하면 새 버전의 코드를 서버의 작은 하위 집합에 배포하고 나머지 서버에 점진적으로 배포할 수 있다. 이렇게 하면 새 버전의 코드를 모든 서버에 롤아웃하기 전에 테스트할 수 있게 된다. (chrome canary)
    3. Rolling Deployment: 롤링 배포는 Canary 배포와 유사하지만 새 버전의 코드를 작은 서버 하위 집합에 배포하는 대신 한 번에 하나의 서버에 배포한다.
    4. 핫 리로딩: Go, Python, Node.js, .Net, Java 등의 일부 언어 또는 프레임워크는 내장된 기능으로 핫 리로딩을 제공하며, 이 기능을 통해 프로그램이 실행 중인 동안 코드를 업데이트할 수 있으며 자동으로 변경 사항을 다시 로드할 수 있다. 이 기능은 작은 변경을 작업 중이며 프로그램을 중지하고 새 버전을 배포할 필요가 없는 경우에 유용할 수 있다.

     

    Blue-Green

    Blue-Green 배포는 2개의 동일한 production 환경에서 새로운 버전을 안전하게 deploy 할 수 있는 방법이다. (Blue/Green 환경)

    핵심은 모든 유저에게 새로운 버전을 적용하기 전에 downtime (서버 다운)을 최소화 하면서 새 버전을 테스트할 수 있게 해 준다.

    Green 환경에서 테스트를 마치고 검증까지 했다면 모든 트래픽을 Green에게 넘기고 Blue를 종료할 수도 있다.

     

    과정:

    1. Blue 환경에 현재 버전을 배포한다.
    2. Green 환경에 새 버전을 배포하고 테스트한다.
    3. 모든 테스트를 마치고 검증했다면 DNS나 load balancer 설정으로 트래픽을 Green 환경으로 넘긴다.
    4. Green 환경이 잘 돌아가고 모든 트래픽이 잘 설정되었으면 Blue 환경을 꺼도 된다.
    5. 새 버전을 하면 Green이 Blue가 되고 위 과정 반복

     

    이 방법은 production 환경의 버그를 최소화하는데 유용하다. 새로운 버전에 나중에 문제가 발생해도 이전 버전으로 롤백해 버리면 된다.

    AWS Elastic Beanstalk, AWS CodeDeploy, 또는 Kubernetes이 BG 배포를 지원한다.

    AWS Elastic Beanstalk를 예로 들면, "Rolling with additional batch" 옵션으로 새 버전을 몇 개의 instance batch에 배포하고 테스트할 수 있게 하고 작동을 잘하면 모든 인스턴스가 새 버전을 사용할 수 있게 한다.

    Kubernetes에서는 "Deployment" 기능으로 pod의 replica sets를 갖고 쉽게 롤백할 수 있게 해 준다.

     

    Canary나 Rolling 배포 방법도 있는데 장단점이 있고 상황에 맞게 사용하면 된다.

    728x90

    댓글