오류발생과 해결

왜 접속이 되지 않는걸까요.. 나의 작은 타임리프 (2) - 마무리(Sticky Session)

지팡구 2025. 2. 23. 00:01

 

문제 설명

  • 왜 나의 타임리프엔 접근할 수 없을까요?
    • 사용자의 요청이 들어오면 Load Balancer(로드 밸런서)에 의해 여러 대의 서버로 이동하게 됩니다.
    • 예를 들어 2개의 서버로 구성된 인프라 환경이 있다고 가정한 후 시나리오를 작성해보겠습니다.
      • A서버의 로그인 요청 → A서버에서는 로그인 성공이라는 응답
      • 동일한 클라이언트는 로드 밸런서에 새로운 요청을 보냄
      • 새로운 요청은 B 서버로 전달
      • B 서버에선 로그인 한 사용자의 정보가 없기에 어플리케이션에서 설정한 특정 페이지로 리다이렉트 하도록 응답을 보냅니다
    • 위의 시나리오처럼 접근이 됐다, 안됐다 하는 이유는 요청에 관한 클라이언트의 정보를 판단할 수 없기에 발생하는 문제라는 것으로 접근했고 해당 가설을 검증하기 위해 아래와 같이 테스트를 진행했습니다.

가설 검증 시나리오

  • 사내의 인프라 구조를 오케스트레이션 하는 k8s에서 문제가 있는 어플리케이션의 수를 단일 서버로 변경
    • 쿠버네티스가 바라보는 환경인 헬름 차트(helm chart)의 설정 변경
hpa: 
	enabled: false 
spec: 
	replicas: 1 
# 서버에 띄울 서비스 개수 (일반 서비스: 1, 트래픽 높은 서비스: 3~6(트래픽에 따라), ERP 수준: 10, 기본적으로 1 또는 2 에서 시작하여 상황에 따라 늘릴 것)hpa 설정 off, 레플리카 x, pods 수 1로 고정
  • 이후 빌드 과정은 동일하게 진행 및 결과
    • 페이지에 정상 접근 성공 -> 문제 해결
  • 그러나 해당 서버는 그렇다 쳐도 외에 다른 멀티 모듈인 서버인 경우엔 문제의 서버에 비해 트래픽이 있을 것으로 생각해 다른 방법을 고안해야 했음
    • 의사결정
      • Redis (반려)
        • 의견 :
          • 비용 문제 및 관리 문제 발생 가능성
        • 장점 :
          • Sticky session의 단점을 보완할 수 있음
          • 안정성 증가 및 모든 Pods에서 동일한 세션 조회 가능 → Scale-Out 용이
          • 다중 서비스에서 세션 공유 가능
        • 단점 :
          • Redis 서버까지 신경써야하기에 관리 포인트가 많아짐(운영,유지보수,추가설정 등)
          • 네트워크에 관한 요청(세션 저장/조회)가 필요해 응답 속도가 느릴 수있음
      • Sticky Session (결정)
        • 의견 :
          • 현 시점에서 가장 빠르게 문제를 해결할 수있으며 해당 기술을 사용하고 문제가 발생하더라도 운영에 크게 크리티컬 하지 않을 것이라 판단
          • Session Clustering을 통해 단점 보완 가능 할 것이라 판단
        • 장점 :
          • 빠르게 적용 및 테스트 가능 (현 시점에서)
          • 여러 서버는 세션 데이터를 교환할 필요가 없음
          • 정합성 이슈에서 자유로워짐
        • 단점 :
          • 로드 밸런싱이 의도한대로 잘 동작하지 않을 수 있음
          • 특정 서버만 과부하가 올 수 있음
          • 특정 서버의 요청이 실패 시 요청이 실패한 해당 서버에 세션들이 모두 소실될 수 있음
          • pods간 세션 공유가 안될 것이기에 Scale-out(수평 확장)이 어려움

문제 해결

  • k8s의 Sticky 세션 관련 설정 추가 → 문제 해결
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
    nginx.ingress.kubernetes.io/session-cookie-name: "route"

 


추천 레퍼런스 :

 

스티키 세션(Sticky Session), 세션 클러스터링(Session Clustering)이란? + 세션, 로드 밸런싱, Session Storage

세션 (Session) 세션을 사용하는 이유? HTTP프로토콜의 특징이자 약점을 보완하기 위해 사용된다. 1. Connectionless, Protocol 비연결지향 클라이언트가 서버에 요청했을 때, 그 요청에 맞는 응답을 보낸

woo0doo.tistory.com