문제 설명
- 왜 나의 타임리프엔 접근할 수 없을까요?
- 사용자의 요청이 들어오면 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(수평 확장)이 어려움
- 의견 :
- Redis (반려)
- 의사결정
문제 해결
- k8s의 Sticky 세션 관련 설정 추가 → 문제 해결
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
- 설정 설명 :
- nginx.ingress.kubernetes.io/affinity
- ingress 컨트롤러가 쿠기 기반 부하 분산(Sticky Session) 활성화
- 동일한 클라이언트는 항상 동일한 백엔드 서비스로 요청을 보냄
- ingress 컨트롤러가 쿠기 기반 부하 분산(Sticky Session) 활성화
- nginx.ingress.kubernetes.io/session-cookie-hash
- 세션을 지속하는 쿠키의 이름 설정
- nginx.ingress.kubernetes.io/session-cookie-name
- 세션을 지속하는 쿠키의 암호화 방식
- nginx.ingress.kubernetes.io/affinity
추천 레퍼런스 :
스티키 세션(Sticky Session), 세션 클러스터링(Session Clustering)이란? + 세션, 로드 밸런싱, Session Storage
세션 (Session) 세션을 사용하는 이유? HTTP프로토콜의 특징이자 약점을 보완하기 위해 사용된다. 1. Connectionless, Protocol 비연결지향 클라이언트가 서버에 요청했을 때, 그 요청에 맞는 응답을 보낸
woo0doo.tistory.com
'오류발생과 해결' 카테고리의 다른 글
왜 접속이 되지 않는걸까요.. 나의 작은 타임리프 (1) | 2025.02.22 |
---|---|
뜬금없이 발생한 Too Many Connection (0) | 2025.02.22 |
[Error] QueryExecutionRequestException : Not supported for DML operations (0) | 2023.01.14 |
2번째 맞닥드린 오류 : could not prepare statement (DB 관련 오류) (0) | 2022.03.11 |
오류명 : java.lang.assertionerror: status expected:<200> but was:<401> 및 소스 코드의 변경, 부제 : 스프링 부트와 AWS로 혼자 구현하는 웹서비스 -저자: 이동욱 (0) | 2022.03.08 |