IT

배포 중에도 서비스 중단 없이! - 무중단 배포 전략 알아보기

0and24 2024. 11. 13. 02:37

들어가며

웹사이트나 애플리케이션을 운영하다 보면, 새 버전을 배포할 때 서비스가 멈출까 걱정되죠? 실제로는 배포 중에도 서비스가 멈추지 않도록 무중단 배포 전략을 사용한다고 합니다. 이 글에서는 주로 사용하는 무중단 배포 방법과 그 예시를 알아보겠습니다.

서비스야 멈추지마

무중단 배포란?

무중단 배포(Zero-Downtime Deployment)는 서비스가 중단되지 않도록 하면서 업데이트하는 방법입니다. 예를 들어, 우리 앱에 새 기능이나 버그 수정을 배포하면서 사용자는 계속 정상적으로 서비스를 사용할 수 있어야 합니다.

 

무중단 배포의 대표적인 방법들

무중단 배포는 여러 가지 방식으로 구현할 수 있습니다. 그중 많이 쓰이는 블루-그린 배포카나리 배포, 롤링 배포를 살펴보겠습니다.

 

1. 블루-그린 배포 (Blue-Green Deployment)

블루-그린 배포에서는 두 개의 서버(Blue와 Green)를 운영합니다.

  1. Blue 서버는 현재 사용자에게 서비스 중인 서버입니다.
  2. 새 버전은 Green 서버에 배포하고, 충분히 테스트하여 안정성이 확인되면 트래픽을 Blue에서 Green으로 전환합니다.
  3. 문제가 발생하면 빠르게 트래픽을 다시 Blue로 돌릴 수 있어 안전합니다.
public class Server {
    private String name;

    public Server(String name) {
        this.name = name;
    }

    public void serve() {
        System.out.println(name + " 서버가 사용자에게 서비스를 제공합니다.");
    }
}

// 사용 예시
public class BlueGreenDeploymentExample {
    public static void main(String[] args) {
        Server blueServer = new Server("Blue");
        Server greenServer = new Server("Green");

        // Blue 서버가 현재 서비스 중
        blueServer.serve();

        // Green 서버에 새 버전을 배포
        System.out.println("Green 서버로 트래픽 전환 중...");
        greenServer.serve();
    }
}

이렇게 Blue 서버에서 Green 서버로 트래픽을 전환하는 과정으로 사용자에게는 중단 없이 새 버전을 배포할 수 있습니다.

 

2. 카나리 배포 (Canary Deployment)

카나리 배포는 새 버전을 소수의 사용자에게 먼저 적용하는 방식입니다.

  1. 전체 트래픽 중 일부만 새 버전을 제공하는 서버로 전달합니다.
  2. 새 버전이 안정적이면 조금씩 더 많은 트래픽을 새 버전으로 돌려 점진적으로 확장합니다. 
    예를들어 처음에는 10% 사용자에게만 그러다 20%, 30% 이런식으로 적용
  3. 문제가 생기면 바로 원래 버전으로 돌릴 수 있습니다.
public class Server {
    private String version;

    public Server(String version) {
        this.version = version;
    }

    public void serve(String user) {
        System.out.println(user + "에게 " + version + " 버전을 제공합니다.");
    }
}

// 사용 예시
public class CanaryDeploymentExample {
    public static void main(String[] args) {
        Server oldServer = new Server("v1.0");
        Server newServer = new Server("v2.0");

        // 일부 사용자에게만 새 버전 제공
        oldServer.serve("UserA");
        newServer.serve("UserB");  // 카나리 사용자

        // 새 버전이 안정적이면 더 많은 사용자에게 전환
        newServer.serve("UserC");
    }
}

이처럼 점진적으로 새 버전을 적용하면, 만약 새 버전에 문제가 있어도 전체 서비스에 영향을 주지 않습니다.

 

3. 롤링 배포 (Rolling Deployment)

롤링 배포는 여러 대의 서버가 있을 때 한 번에 한 서버씩 순차적으로 업데이트하는 방법입니다.

  1. 전체 서버 중 한 대를 새 버전으로 업데이트한 뒤 준비가 되면 트래픽을 전환합니다.
  2. 그런 다음 다른 서버도 순차적으로 업데이트하여 모든 서버에 새 버전을 적용합니다.
  3. 이렇게 하나씩 업데이트하므로, 서비스 중단 없이 새 버전으로 배포할 수 있습니다.
public class Server {
    private String name;
    private String version;

    public Server(String name, String version) {
        this.name = name;
        this.version = version;
    }

    public void serve() {
        System.out.println(name + " 서버가 " + version + " 버전을 제공합니다.");
    }
}

// 사용 예시
public class RollingDeploymentExample {
    public static void main(String[] args) {
        Server server1 = new Server("Server1", "v1.0");
        Server server2 = new Server("Server2", "v1.0");

        // 각 서버가 순차적으로 새 버전으로 업데이트
        server1.serve();
        server2.serve();

        System.out.println("Server1을 v2.0으로 업데이트...");
        server1 = new Server("Server1", "v2.0");

        server1.serve();
        server2.serve();

        System.out.println("Server2를 v2.0으로 업데이트...");
        server2 = new Server("Server2", "v2.0");

        server1.serve();
        server2.serve();
    }
}

이처럼 한 서버씩 업데이트하면, 사용자는 큰 중단 없이 새 버전으로 전환되는 것을 경험할 수 있습니다.

 

! 참고 !

무중단 배포 방식이 서비스의 중단을 최대한 줄여주는 것은 맞지만, 모든 무중단 배포가 완전히 0초의 다운타임을 보장할 수 있는 것은 아닙니다. 다만 적절한 배포 전략과 인프라 구성을 통해 다운타임을 거의 느낄 수 없을 정도로 최소화할 수 있습니다.

배포방식 장점 단점
블루-그린 배포 빠른 롤백, 단순한 구조, 테스트 가능 높은 리소스 비용, 데이터베이스 동기화 문제
카나리 배포 위험 최소화, 점진적 전환, 유연한 롤백 관리 복잡성 증가, 추가 모니터링 필요
롤링 배포 리소스 효율적, 연속적 배포 가능 버전 혼재 가능성, 느린 롤백

 

마무리하며

무중단 배포 전략을 사용하면, 새로운 기능이나 수정 사항을 배포할 때도 사용자에게 끊김 없이 서비스할 수 있습니다. 위에서 설명한 블루-그린 배포, 카나리 배포, 롤링 배포는 모두 실무에서 자주 사용되는 무중단 배포 방식입니다. 상황에 따라 가장 적합한 방식을 선택해 무중단 배포를 구현하면 좋을 것 같습니다.