Sticky Sessions & Cross-Zone Load Balancing

도은호·2025년 10월 7일
0

AWS SAA

목록 보기
18/44

1) Sticky Sessions (세션 고정)

1-1. 개념

  • 클라이언트가 한 번 붙은 Target(EC2/IP/Lambda)에 계속 붙도록 하는 기능.
  • 상태 세션이 로컬 메모리/cookie에 존재해 같은 Target을 요구하는 앱에서 사용.

1-2. 종류별 동작

  • ALB (HTTP/HTTPS, L7)

    • LB Cookie 기반 Stickiness. ALB가 AWSALB / AWSALBTG 같은 쿠키를 발급하고, 지정 기간 동안 같은 Target에 라우팅.
    • Target Group 단위로 활성화/기간 설정.
  • NLB (TCP/UDP/TLS, L4)

    • Source IP 기반 Stickiness. 클라이언트 원본 IP를 키로 동일 Target에 연결.
    • 장수명 TCP 연결이나 고정 IP 화이트리스트 환경에 적합.
  • GWLB

    • 전통적 의미의 “세션 쿠키”는 아니고, Flow Stickiness(5-tuple 등) 로 동일 어플라이언스로 대칭 유지가 핵심.

1-3. 언제 쓸까?

  • 세션을 로컬에 저장하는 레거시/간단 웹앱.
  • 인증·장바구니 등 세션 일관성이 중요하고 외부 세션 스토어 미도입 상태.
  • 클라이언트 원 IP를 유지해 특정 백엔드에 고정하고 싶을 때(NLB).

1-4. 주의점(트레이드오프)

  • 부하 불균형: 특정 Target에 트래픽이 몰려 스케일 아웃 효과 감소.
  • 장애 복원력 저하: 고정되어 있던 Target 장애 시 세션 유실/재로그인.
  • Cross-AZ 비용/지연: (아래 Cross-Zone과 조합 시) 다른 AZ의 Target에 고정되면 교차 AZ 트래픽 증가 가능.
  • 현대적 대안: 가능하면 ElastiCache(Redis) / DynamoDB외부 세션 스토어Stateless 전환 → Stickiness 비활성화를 권장.

1-5. 설정 예시

(ALB) Target Group Stickiness 켜기

aws elbv2 modify-target-group-attributes \
  --target-group-arn arn:aws:elasticloadbalancing:...:targetgroup/app-tg/... \
  --attributes Key=stickiness.enabled,Value=true \
               Key=stickiness.type,Value=lb_cookie \
               Key=stickiness.lb_cookie.duration_seconds,Value=1800

(NLB) Source IP Stickiness

aws elbv2 modify-target-group-attributes \
  --target-group-arn arn:aws:elasticloadbalancing:...:targetgroup/nlb-tg/... \
  --attributes Key=stickiness.enabled,Value=true \
               Key=stickiness.type,Value=source_ip \
               Key=stickiness.duration_seconds,Value=3600

팁: Deregistration delay(기본 300s)를 함께 조정해 세션 드레이닝을 부드럽게.


2) Cross-Zone Load Balancing (AZ 간 균등 분산)

2-1. 개념

  • 다중 AZ에 걸친 Target Group에서, 특정 AZ로 들어온 요청다른 AZ의 Healthy Target으로도 자유롭게 분산하는 기능.
  • 단일 AZ의 과부하/부분 장애리전 전체 Healthy 용량으로 흡수.

2-2. 로드밸런서별 차이

  • ALB: Cross-Zone 기본 활성화(일반적으로 끄지 않음). AZ별 Target 수 불균형을 자동 보정.
  • NLB: 옵션. 워크로드/비용/네트워크 경로에 따라 활성/비활성 선택.
  • GWLB: 옵션. 어플라이언스/라우팅 대칭성 고려해 선택.

2-3. 장점

  • 균등 분산/자원 활용 극대화: 특정 AZ Target 부족/스파이크 시 다른 AZ 용량을 즉시 활용.
  • 장애 흡수력: AZ 편향 트래픽에도 서비스 안정성↑.

2-4. 주의점

  • 교차-AZ 데이터 전송이 증가할 수 있음(요금/지연 고려).
  • Zonal Isolation 전략이 필요하면(엄격 AZ 격리) 비활성화 + AZ 단위 Target Group 운영 고려.
  • NLB 비활성 시: “AZ-로컬” 분산 → 각 AZ에 충분한 Capacity 확보가 전제.

2-5. 설정 예시

(NLB/GWLB) Cross-Zone On/Off

aws elbv2 modify-load-balancer-attributes \
  --load-balancer-arn arn:aws:elasticloadbalancing:...:loadbalancer/net/my-nlb/... \
  --attributes Key=load_balancing.cross_zone.enabled,Value=true

ALB는 일반적으로 Cross-Zone이 활성 상태이며, 실무에서는 별도 설정 없이 사용하는 경우가 대부분입니다.


3) Sticky × Cross-Zone 조합 설계 팁

  • 세션 고정 + Cross-Zone 활성

    • 장점: AZ 한쪽이 바빠도 다른 AZ Target으로 고정 가능 → 사용자 경험 안정.
    • 단점: 교차-AZ 트래픽 증가 및 특정 Target 핫스팟.
    • 완화: 세션 기간(쿠키 TTL/Source IP duration) 단축, Deregistration delay/배포 윈도우 조정.
  • 세션 비고정 + Cross-Zone 활성(권장 기본)

    • Stateless 앱이면 최적. 균등 분산 + 빠른 회복.
  • 세션 고정 + Cross-Zone 비활성(NLB)

    • 엄격한 AZ 격리가 필요할 때. 단, AZ별 Capacity 균형 필수.

4) 운영 체크리스트

  • 세션 필요성 검증: 가능하면 외부 세션 스토어Stateless 전환
  • Stickiness TTL: 짧게 잡고, 배포/스케일 인 시 드레이닝 고려
  • Deregistration delay: 장수명 연결/웹소켓이면 상향, 일반 웹은 기본/하향
  • Cross-Zone: ALB 기본 활성. NLB/GWLB는 워크로드/비용 고려 후 결정
  • 관측: TargetResponseTime / 5xx / SurgeQueue / HealthyHostCount 모니터링
  • 불균형 감지: Target별 RequestCount 편차↑ → Stickiness 과다/TTL 조정 검토

5) 자주 나오는 Q&A

Q1. ALB Stickiness는 언제 꼭 필요?

  • 레거시 앱이 서버 로컬 세션을 강하게 가정할 때(단기적으로). 장기적으론 세션 외부화가 정답.

Q2. NLB에서 Source IP Stickiness가 무조건 이득?

  • 고정 IP 환경에 유용하지만, NAT 뒤 다수 사용자가 한 IP로 모이면 한 Target 과부하가 날 수 있음.

Q3. Cross-Zone을 켜면 항상 좋나?

  • 균등 분산 장점이 크지만, 교차 AZ 트래픽지연/비용을 함께 고려.
    엄격 AZ 격리/비용 민감 워크로드는 비활성 + AZ별 용량 관리도 방법.

6) CloudFormation 스니펫

(ALB TG) Stickiness

Resources:
  AppTg:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      TargetType: instance
      Protocol: HTTP
      Port: 80
      VpcId: vpc-xxxx
      TargetGroupAttributes:
        - Key: stickiness.enabled
          Value: 'true'
        - Key: stickiness.type
          Value: lb_cookie
        - Key: stickiness.lb_cookie.duration_seconds
          Value: '1800'

(NLB) Cross-Zone

Resources:
  Nlb:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Type: network
      Subnets: [subnet-azA, subnet-azB]
      LoadBalancerAttributes:
        - Key: load_balancing.cross_zone.enabled
          Value: 'true'

요약

  • Sticky Sessions: 편하지만 부하 불균형/복원력 저하. 가급적 Stateless + Stickiness Off로.
  • Cross-Zone LB: ALB 기본 On, NLB/GWLB 선택적. 균등 분산 vs 교차-AZ 비용/지연 트레이드오프.
  • 실무 포인트: TTL/드레이닝/모니터링으로 안정성 확보, 세션 외부화로 장기 최적화.
profile
`•.¸¸.•´´¯`••._.• 🎀 𝒸𝓇𝒶𝓏𝓎 𝓅𝓈𝓎𝒸𝒽💞𝓅𝒶𝓉𝒽 🎀 •._.••`¯´´•.¸¸.•`

0개의 댓글