분산 시스템에서 Sticky Session과 세션 관리 이해

Hyunjun Kim·2025년 7월 20일
0

Data_Engineering

목록 보기
109/153

데이터 엔지니어링을 공부한다면, 대규모 데이터 파이프라인이나 높은 가용성과 확장성을 요구하는 서비스에서 웹 애플리케이션이 사용자 세션을 어떻게 관리하는지 이해하는 것이 중요하다.

세션(Session), 로드 밸런싱(Load Balancing), 스티키 세션(Sticky Session), 세션 클러스터링(Session Clustering), 세션 스토리지(Session Storage)에 대해 알아보자.

세션(Session)

세션의 정의

세션은 사용자가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 브라우저를 종료해 연결이 끊어질 때까지의 상태를 유지하는 기술이다. 사용자의 일련의 요청을 하나의 상태로 보고, 이를 일정하게 유지한다. 예를 들어, 사용자가 웹사이트에서 로그인하거나 장바구니에 상품을 추가할 때, 그 정보를 유지하기 위해 세션을 사용한다.

세션을 사용하는 이유

HTTP 프로토콜은 비연결지향(Connectionless) 및 상태 비유지(Stateless) 특성을 가진다:

  • 비연결지향: 클라이언트가 서버에 요청을 보내고 응답을 받은 후 연결이 끊어진다.
  • 상태 비유지: 이전 요청의 데이터를 서버가 기억하지 않는다.

이로 인해, 사용자가 페이지를 이동할 때마다 로그인을 다시 하거나, 장바구니에 담은 상품 정보가 사라지는 문제가 발생할 수 있다. 세션은 클라이언트의 상태 정보를 서버에 저장해 이러한 문제를 해결한다.

세션 동작 순서

  1. 사용자가 웹사이트에 접속한다(클라이언트 요청).
  2. 서버는 클라이언트의 요청 헤더에서 쿠키를 확인해 세션 ID가 있는지 확인한다.
  3. 세션 ID가 없으면 서버가 새로운 세션 ID를 생성해 클라이언트에 전송한다.
  4. 클라이언트는 이 세션 ID를 쿠키로 저장한다.
  5. 이후 요청 시 클라이언트는 세션 ID를 서버에 전송해 상태를 유지한다.

세션의 특징

  • 서버에 상태 정보를 저장하므로 쿠키보다 보안성이 높다.
  • 각 클라이언트에 고유한 세션 ID를 부여해 구분한다.
  • 단점: 사용자 수가 많아지면 서버 자원을 많이 소모한다.

데이터 엔지니어링 팁: 세션 데이터는 키-값 쌍으로 저장된다. 이는 데이터 엔지니어가 NoSQL 데이터베이스(예: Redis)나 캐싱 시스템을 다룰 때 자주 접하는 패턴이다. 세션 관리의 효율성은 시스템의 확장성과 성능에 큰 영향을 미친다.

로드 밸런싱(Load Balancing)

로드 밸런싱의 정의

로드 밸런싱은 트래픽이 많은 환경에서 여러 서버에 부하를 분산해 처리하는 기술이다. 서버의 로드율, 부하량, 응답 속도 저하 문제를 해결한다. 로드 밸런싱을 수행하는 장비 또는 소프트웨어를 로드 밸런서(Load Balancer)라고 한다.

동작 방식

  1. 로드 밸런서는 네트워크 상단에 위치해 들어오는 트래픽을 여러 서버로 균등하게 분산한다.
  2. 서버 장애 발생 시 이를 감지해 정상 서버로 트래픽을 재분배한다.

장점

  • 고가용성: 한 서버가 다운되어도 다른 서버가 서비스를 지속한다.
  • 확장성: 서버(노드)를 추가해 쉽게 확장할 수 있다.

단점

  • 세션 관리 문제: 로드 밸런싱으로 인해 클라이언트 요청이 다른 서버로 라우팅되면, 이전 서버에 저장된 세션 정보가 유지되지 않을 수 있다.

데이터 엔지니어링 팁: 로드 밸런싱은 데이터 파이프라인에서도 중요하다. 예를 들어, Apache Kafka나 Spark 스트리밍에서 데이터를 여러 노드에 분산 처리할 때 유사한 개념이 적용된다. 데이터 엔지니어는 로드 밸런싱 알고리즘(라운드 로빈, 최소 연결 등)을 이해해 데이터 처리 효율성을 높여야 한다.

스티키 세션(Sticky Session)

스티키 세션의 정의

스티키 세션은 로드 밸런서가 동일한 클라이언트의 요청을 항상 동일한 서버로 라우팅하는 기능이다. 예를 들어, 사용자가 서버 1에 세션을 생성했다면, 이후 모든 요청은 서버 1로만 보내진다.

동작 방식

  1. 로드 밸런서는 클라이언트 요청에 쿠키가 포함되어 있는지 확인한다.
  2. 쿠키가 있으면 해당 서버로 요청을 전송한다.
  3. 쿠키가 없으면 로드 밸런싱 알고리즘(예: 라운드 로빈)을 사용해 서버를 선택한다.

장점

  • 서버 간 세션 데이터 동기화가 불필요해 데이터 정합성 문제를 해결한다.
  • 구현이 간단하다.

단점

  • 특정 서버에 트래픽이 몰리면 과부하가 발생할 수 있다.
  • 서버 장애 시 세션 데이터가 유실되어 사용자가 재로그인해야 한다.

데이터 엔지니어링 팁: 스티키 세션은 간단하지만, 대규모 시스템에서는 비효율적이다. 데이터 엔지니어는 트래픽 패턴을 분석해 특정 서버에 부하가 집중되지 않도록 모니터링 도구(Prometheus, Grafana 등)를 활용해야 한다.

스티키 세션이 필요한 서비스라면 IP 해시를 활용해 서버 부하를 분산할 수 있다

세션 클러스터링(Session Clustering)

세션 클러스터링의 정의

세션 클러스터링은 여러 서버가 동일한 세션 데이터를 공유하도록 설정해, 클라이언트가 어떤 서버로 접속하더라도 동일한 세션 상태를 유지하는 방식이다. 스티키 세션의 단점을 보완한다.

방식 1: All-to-All 세션 복제

  • 설명: 세션 데이터가 변경될 때 모든 서버에 복제된다.
  • 장점: 서버 장애 시에도 세션이 유지되어 고가용성을 확보한다.
  • 단점: 서버 수가 많아지면 메모리 사용량과 네트워크 트래픽이 증가해 성능이 저하된다. 소규모 클러스터(4개 이하 서버)에 적합하다.
  • 예시: Apache Tomcat의 DeltaManager가 이 방식을 사용한다.

방식 2: Primary-Secondary 세션 복제

  • 설명: Primary와 Secondary 서버에 전체 세션 데이터를 복제하고, 나머지 서버에는 세션 키만 저장한다. 요청이 다른 서버로 가면 Primary 서버에 질의한다.
  • 장점: All-to-All보다 메모리 효율적이다.
  • 단점: Primary 서버 질의로 인한 추가적인 네트워크 오버헤드가 발생한다.
  • 예시: Tomcat의 BackupManager가 이 방식을 사용한다.

데이터 엔지니어링 팁: 세션 클러스터링은 분산 시스템에서 데이터 복제와 동기화 문제를 다룰 때 중요하다. 데이터 엔지니어는 분산 데이터베이스(예: Cassandra, MongoDB)의 복제 메커니즘과 유사성을 이해하고, 데이터 정합성을 유지하기 위한 전략을 설계해야 한다.

세션 스토리지(Session Storage)

세션 스토리지의 정의

세션 스토리지는 세션 데이터를 별도의 저장소(Redis, Memcached 등)에 저장해 모든 서버가 공유하도록 하는 방식이다. 스티키 세션의 트래픽 집중 문제와 세션 클러스터링의 성능 문제를 해결한다.

동작 방식

  • 세션 데이터를 중앙화된 저장소에 저장한다.
  • 모든 서버가 이 저장소에서 세션 데이터를 조회/업데이트한다.
  • 서버 장애 시에도 세션 데이터가 유지된다.

장점

  • 데이터 정합성: 모든 서버가 동일한 세션 데이터에 접근한다.
  • 고가용성: 서버 장애와 무관하게 서비스를 지속한다.
  • 확장성: 서버 추가 시 세션 스토리지만 연결하면 된다.
  • 성능: 복제 오버헤드가 감소한다.

단점

  • 세션 스토리지 자체의 장애를 방지하기 위해 복제본을 유지해야 한다.
  • 추가적인 저장소 관리 비용이 발생한다.

데이터 엔지니어링과의 연관성

데이터 엔지니어는 Redis나 Memcached 같은 인메모리 데이터베이스를 자주 사용한다. 세션 스토리지는 캐싱 시스템의 기본 원리를 보여주며, 데이터 엔지니어는 캐시 일관성, 만료 정책(TTL), 샤딩 같은 개념을 익혀야 한다. 또한, 세션 스토리지의 성능 최적화를 위해 지연 시간(Latency)과 처리량(Throughput)을 모니터링해야 한다.

예시: Redis를 사용한 세션 스토리지

Redis는 키-값 기반의 인메모리 데이터베이스로, 세션 관리에 자주 사용된다. 아래는 Redis를 활용한 세션 저장의 간단한 예제이다:

import redis

# Redis 클라이언트 초기화
redis_client = redis.StrictRedis(host='localhost', port=6379, db= Servers
# 세션 데이터 저장
redis_client.setex("session:user123", 3600, "user_data")  # TTL 1시간

# 세션 데이터 조회
user_data = redis_client.get("session:user123")

데이터 엔지니어링 팁: Redis 클러스터를 설정해 고가용성과 확장성을 확보할 수 있다. 데이터 엔지니어는 Redis의 Sentinel 또는 Cluster 모드를 활용해 장애 복구와 샤딩을 구현하는 방법을 학습해야 한다.

데이터 엔지니어를 위한 추가 개념

데이터 정합성(Data Consistency)

데이터 정합성은 여러 시스템 간 데이터가 일치하는 상태를 의미한다. 세션 관리에서는 클라이언트가 어떤 서버에 접속하더라도 동일한 세션 데이터를 제공받아야 한다. 데이터 엔지니어는 CAP 이론(Consistency, Availability, Partition Tolerance)을 이해하고, 시스템 설계 시 정합성과 가용성 간 트레이드오프를 고려해야 한다.

캐싱 전략

세션 스토리지는 캐싱의 한 형태이다. 데이터 엔지니어는 LRU(Least Recently Used), TTL(Time-To-Live) 같은 캐싱 전략을 학습해 메모리 효율성을 높여야 한다. 또한, 캐시 무효화(Cache Invalidation) 문제를 다루는 방법을 익혀야 한다.

모니터링과 로깅

대규모 시스템에서 세션 관리의 성능과 안정성을 보장하기 위해 모니터링과 로깅은 필수적이다. 데이터 엔지니어는 시스템의 상태를 추적하고 문제를 진단하기 위해 다음과 같은 도구를 활용해야 한다:

  • Prometheus: 메트릭 수집 및 모니터링 도구로, 서버의 CPU 사용량, 세션 요청 처리 시간, 트래픽 분포 등을 모니터링한다.
  • Grafana: Prometheus 데이터를 시각화해 시스템 성능을 직관적으로 분석한다.
  • ELK Stack(Elasticsearch, Logstash, Kibana): 로그 데이터를 수집, 분석, 시각화해 세션 관련 오류(예: 세션 유실, 지연 시간 증가)를 탐지한다.

예시: Prometheus로 Redis 세션 스토리지의 지연 시간을 모니터링하는 설정 예제이다:

# prometheus.yml
scrape_configs:
  - job_name: 'redis'
    static_configs:
      - targets: ['redis:6379']
    metrics_path: /metrics

데이터 엔지니어링 팁: 모니터링은 시스템 병목 현상(Bottleneck)을 식별하고, 세션 스토리지의 성능 문제를 해결하는 데 필수적이다. 예를 들어, Redis의 높은 지연 시간은 샤딩 부족이나 네트워크 문제일 수 있으므로, 이를 모니터링해 조치해야 한다.

분산 시스템에서의 샤딩(Sharding)과 파티셔닝(Partitioning)

세션 스토리지(예: Redis 클러스터)에서 데이터를 효율적으로 분산하기 위해 샤딩이 사용된다. 샤딩은 데이터를 여러 노드에 분할해 저장하는 방식으로, 특정 세션 키가 특정 노드에 매핑되도록 설계된다. 이는 로드 밸런싱과 유사한 개념으로, 데이터 엔지니어가 대규모 데이터베이스 설계 시 자주 다룬다.

예시: Redis 클러스터에서 샤딩 설정:

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002

장애 복구(Fault Tolerance)와 복제(Replication)

세션 스토리지는 장애 복구를 위해 복제본을 유지해야 한다. Redis의 경우 Sentinel 모드로 마스터-슬레이브 복제를 설정하거나, Redis Cluster로 자동 샤딩과 복제를 구현할 수 있다. 이는 데이터 엔지니어가 시스템의 고가용성을 보장하기 위해 필수적으로 다루는 개념이다.

데이터 엔지니어링 팁: 복제 전략을 설계할 때는 복제 지연(Replication Lag)을 최소화하고, 장애 발생 시 자동 failover가 작동하도록 설정해야 한다.

결론

스티키 세션, 세션 클러스터링, 세션 스토리지는 분산 시스템에서 세션 데이터를 관리하는 주요 방법이다. 스티키 세션은 구현이 간단하지만 트래픽 불균형과 세션 유실 위험이 있다. 세션 클러스터링은 고가용성을 제공하지만 성능 오버헤드가 있다. 세션 스토리지(Redis, Memcached 등)는 정합성, 가용성, 확장성을 모두 충족하는 현대적인 접근 방식이다.

데이터 엔지니어로서, 세션 관리 개념은 분산 데이터베이스, 캐싱, 모니터링, 샤딩, 복제 등과 밀접히 연관된다. Redis 같은 세션 스토리지를 활용해 데이터 정합성과 시스템 성능을 최적화하는 방법을 익혀야 한다. 또한, 모니터링 도구를 활용해 시스템 상태를 지속적으로 추적하고, 샤딩과 복제 전략을 통해 고가용성을 확보하는 연습이 필요하다.

profile
Data Analytics Engineer 가 되

0개의 댓글