🔧 DevOps

스케일링

Scaling

시스템 용량을 조절하는 것. 수직 스케일링(더 큰 서버), 수평 스케일링(더 많은 서버)으로 구분.

상세 설명

스케일링(Scaling)은 시스템의 처리 용량을 늘리거나 줄이는 것입니다. 트래픽 증가에 대응하고, 비용을 최적화하며, 서비스 가용성을 유지하기 위해 필수적인 기술입니다.

수직 스케일링(Vertical/Scale-Up)은 단일 서버의 리소스(CPU, RAM)를 증가시킵니다. 간단하지만 물리적 한계가 있고 다운타임이 필요할 수 있습니다. 수평 스케일링(Horizontal/Scale-Out)은 서버 수를 늘려 부하를 분산합니다. 무중단으로 확장 가능하지만 상태 관리가 복잡합니다.

클라우드 환경에서는 Auto Scaling으로 메트릭 기반 자동 확장/축소를 구현합니다. CPU 사용률 70% 초과 시 인스턴스 추가, 30% 미만 시 축소하는 식입니다. Kubernetes HPA(Horizontal Pod Autoscaler)가 대표적입니다.

실무에서는 Stateless 설계로 수평 확장이 용이하게 합니다. 세션은 Redis에, 파일은 S3에 저장하여 각 인스턴스가 독립적으로 동작하도록 합니다. 데이터베이스는 읽기 복제본으로 수평 확장하고, 쓰기 분산에는 샤딩을 적용합니다.

코드 예제

# Kubernetes HPA (Horizontal Pod Autoscaler)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300   # 축소 전 5분 대기
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60               # 분당 10%씩 축소
    scaleUp:
      stabilizationWindowSeconds: 0     # 즉시 확장
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15               # 15초마다 100%까지 확장
---
# AWS Auto Scaling (Terraform)
resource "aws_autoscaling_group" "web" {
  name                = "web-asg"
  min_size            = 2
  max_size            = 20
  desired_capacity    = 4
  vpc_zone_identifier = var.subnet_ids

  launch_template {
    id      = aws_launch_template.web.id
    version = "$Latest"
  }

  target_group_arns = [aws_lb_target_group.web.arn]

  tag {
    key                 = "Name"
    value               = "web-instance"
    propagate_at_launch = true
  }
}

resource "aws_autoscaling_policy" "scale_up" {
  name                   = "scale-up"
  scaling_adjustment     = 2
  adjustment_type        = "ChangeInCapacity"
  cooldown               = 300
  autoscaling_group_name = aws_autoscaling_group.web.name
}

실무에서 이렇게 말해요

시니어: "블랙 프라이데이 트래픽 예상이 평소 5배인데, 스케일링 전략 논의해봐요."

주니어: "미리 minReplicas를 10으로 올려두고, HPA max를 50까지 설정하면 어떨까요? 이벤트 후에 다시 원복하고요."

면접관: "수평 스케일링과 수직 스케일링의 차이점과 각각의 장단점은?"

지원자: "수직 스케일링은 구현이 쉽고 기존 아키텍처 유지가 가능하지만 물리적 한계와 비용 효율성 문제가 있습니다. 수평 스케일링은 무한 확장이 가능하고 가용성이 높지만 상태 관리와 분산 시스템 복잡도가 증가합니다."

리뷰어: "scaleDown 정책이 너무 공격적인 것 같아요. 트래픽 패턴 변동이 있으면 thrashing 발생할 수 있어요."

개발자: "stabilizationWindowSeconds를 300초로 늘리고 10%씩 축소하도록 수정하겠습니다."

주의사항

더 배우기