들어가며
웹사이트나 애플리케이션을 운영하다 보면, 새 버전을 배포할 때 서비스가 멈출까 걱정되죠? 실제로는 배포 중에도 서비스가 멈추지 않도록 무중단 배포 전략을 사용한다고 합니다. 이 글에서는 주로 사용하는 무중단 배포 방법과 그 예시를 알아보겠습니다.
무중단 배포란?
무중단 배포(Zero-Downtime Deployment)는 서비스가 중단되지 않도록 하면서 업데이트하는 방법입니다. 예를 들어, 우리 앱에 새 기능이나 버그 수정을 배포하면서 사용자는 계속 정상적으로 서비스를 사용할 수 있어야 합니다.
무중단 배포의 대표적인 방법들
무중단 배포는 여러 가지 방식으로 구현할 수 있습니다. 그중 많이 쓰이는 블루-그린 배포와 카나리 배포, 롤링 배포를 살펴보겠습니다.
1. 블루-그린 배포 (Blue-Green Deployment)
블루-그린 배포에서는 두 개의 서버(Blue와 Green)를 운영합니다.
- Blue 서버는 현재 사용자에게 서비스 중인 서버입니다.
- 새 버전은 Green 서버에 배포하고, 충분히 테스트하여 안정성이 확인되면 트래픽을 Blue에서 Green으로 전환합니다.
- 문제가 발생하면 빠르게 트래픽을 다시 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)
카나리 배포는 새 버전을 소수의 사용자에게 먼저 적용하는 방식입니다.
- 전체 트래픽 중 일부만 새 버전을 제공하는 서버로 전달합니다.
- 새 버전이 안정적이면 조금씩 더 많은 트래픽을 새 버전으로 돌려 점진적으로 확장합니다.
예를들어 처음에는 10% 사용자에게만 그러다 20%, 30% 이런식으로 적용 - 문제가 생기면 바로 원래 버전으로 돌릴 수 있습니다.
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)
롤링 배포는 여러 대의 서버가 있을 때 한 번에 한 서버씩 순차적으로 업데이트하는 방법입니다.
- 전체 서버 중 한 대를 새 버전으로 업데이트한 뒤 준비가 되면 트래픽을 전환합니다.
- 그런 다음 다른 서버도 순차적으로 업데이트하여 모든 서버에 새 버전을 적용합니다.
- 이렇게 하나씩 업데이트하므로, 서비스 중단 없이 새 버전으로 배포할 수 있습니다.
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초의 다운타임을 보장할 수 있는 것은 아닙니다. 다만 적절한 배포 전략과 인프라 구성을 통해 다운타임을 거의 느낄 수 없을 정도로 최소화할 수 있습니다.
배포방식 | 장점 | 단점 |
블루-그린 배포 | 빠른 롤백, 단순한 구조, 테스트 가능 | 높은 리소스 비용, 데이터베이스 동기화 문제 |
카나리 배포 | 위험 최소화, 점진적 전환, 유연한 롤백 | 관리 복잡성 증가, 추가 모니터링 필요 |
롤링 배포 | 리소스 효율적, 연속적 배포 가능 | 버전 혼재 가능성, 느린 롤백 |
마무리하며
무중단 배포 전략을 사용하면, 새로운 기능이나 수정 사항을 배포할 때도 사용자에게 끊김 없이 서비스할 수 있습니다. 위에서 설명한 블루-그린 배포, 카나리 배포, 롤링 배포는 모두 실무에서 자주 사용되는 무중단 배포 방식입니다. 상황에 따라 가장 적합한 방식을 선택해 무중단 배포를 구현하면 좋을 것 같습니다.
'IT' 카테고리의 다른 글
자바에서 변수,메소드 이름 쉽게 짓기! (5) | 2024.11.15 |
---|---|
AngularJS Git Commit Message Convention이란? (1) | 2024.11.15 |
상태 없는 객체와 static 메서드 활용법 (0) | 2024.11.13 |
Light house 그리고 웹사이트 품질 테스트? (0) | 2024.11.12 |
@Builder, 빌더 (0) | 2024.11.11 |