Zero Downtime
무중단
서비스 중단 없는 배포/유지보수. Blue-Green, Rolling 전략.
무중단
서비스 중단 없는 배포/유지보수. Blue-Green, Rolling 전략.
Zero Downtime(무중단 배포)은 서비스를 중단하지 않고 새로운 버전을 배포하는 기술입니다. 전통적인 배포 방식에서는 점검 시간을 공지하고 서비스를 내렸지만, 현대의 24/7 서비스에서는 99.99% 가용성이 요구됩니다.
대표적인 전략으로 Blue-Green(두 환경 전환), Rolling(순차 교체), Canary(일부 트래픽 테스트)가 있습니다. Blue-Green은 동일한 환경 두 개를 운영하여 순간 전환하고, Rolling은 인스턴스를 하나씩 교체하며, Canary는 5-10% 트래픽으로 먼저 검증합니다.
기술적으로는 로드 밸런서가 트래픽을 분산하고, 헬스 체크로 새 인스턴스 준비 상태를 확인합니다. 세션은 Redis 등 외부 저장소에서 관리하고, Graceful Shutdown으로 진행 중인 요청이 완료될 때까지 대기합니다.
실무에서는 Kubernetes의 Deployment가 Rolling Update를 기본 지원하고, ArgoCD나 Spinnaker로 Blue-Green과 Canary를 구현합니다. 데이터베이스 스키마 변경 시에는 무중단 마이그레이션 패턴(expand-contract)을 적용합니다.
# Kubernetes Rolling Update 설정
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 4
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 추가 생성 가능한 Pod 수
maxUnavailable: 0 # 항상 최소 replicas 유지
template:
spec:
containers:
- name: app
image: myapp:v2
readinessProbe: # 트래픽 받을 준비 확인
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe: # 컨테이너 생존 확인
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
lifecycle:
preStop: # Graceful Shutdown
exec:
command: ["sh", "-c", "sleep 10"]
---
# Blue-Green with Argo Rollouts
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: my-app-rollout
spec:
replicas: 4
strategy:
blueGreen:
activeService: my-app-active
previewService: my-app-preview
autoPromotionEnabled: false # 수동 승인 필요
시니어: "이번 배포는 DB 스키마 변경이 있어서 무중단이 어려울 수 있어요. 마이그레이션 계획 공유해주세요."
주니어: "컬럼 추가 후 애플리케이션 배포하고, 다음 릴리즈에서 nullable 제거하는 2단계로 진행하려고요."
면접관: "Blue-Green과 Canary 배포의 차이점과 각각 언제 사용하나요?"
지원자: "Blue-Green은 전체 전환으로 빠르지만 리소스가 2배 필요합니다. Canary는 점진적으로 검증해서 리스크는 낮지만 시간이 더 걸려요. 신규 기능 검증은 Canary, 인프라 변경은 Blue-Green을 선호합니다."
리뷰어: "readinessProbe 타임아웃이 5초인데, 앱 시작이 그보다 오래 걸리면 어떻게 되죠?"
개발자: "initialDelaySeconds를 30초로 늘리고, 실제 부팅 시간 측정해서 조정하겠습니다."