Load Balancing과 세션
여러 WAS로 트래픽을 분산할 때 로드밸런싱 방식과 세션 유지 문제를 정리한다.
트래픽이 나뉘는 지점
Client
-> Load Balancer / Web Server
-> WAS #1
-> WAS #2
-> WAS #3
핵심 개념
Load Balancing은 여러 서버로 요청을 나누는 기술이고, 세션 관리는 분산된 요청 속에서 사용자 상태를 유지하는 문제다.
왜 필요한가
단일 WAS는 장애와 부하에 취약하다. 여러 WAS로 나누면 처리량과 가용성을 높일 수 있다.
하지만 로그인 상태처럼 사용자별 상태를 WAS 메모리에 저장하면 문제가 생긴다.
요청 1 -> WAS #1: 로그인 성공, 세션 생성
요청 2 -> WAS #2: 세션 없음, 다시 로그인 필요
따라서 로드밸런싱을 설계할 때 세션 저장 방식을 같이 봐야 한다.
로드밸런싱 방식
| 방식 | 설명 |
|---|---|
| Round Robin | 요청을 순서대로 분산 |
| Least Connections | 연결 수가 적은 서버로 분산 |
| IP Hash | 클라이언트 IP 기준으로 같은 backend 선택 |
| Weighted | 서버 성능에 따라 가중치 부여 |
| Health Check | 장애 서버를 분산 대상에서 제외 |
Nginx upstream 예시
upstream tomcat_backend {
server 10.0.0.11:8080;
server 10.0.0.12:8080;
}
server {
listen 80;
location / {
proxy_pass http://tomcat_backend;
}
}
세션 유지 방식
| 방식 | 설명 | 장점 | 주의점 |
|---|---|---|---|
| Sticky Session | 같은 사용자를 같은 WAS로 보냄 | 구현이 단순 | 특정 서버 장애 시 세션 손실 |
| Session Clustering | WAS 간 세션 복제 | 애플리케이션 변경 적음 | 복제 비용, 설정 복잡도 |
| External Session Store | Redis 등 외부 저장소 사용 | WAS 무상태화에 가까움 | 외부 저장소 가용성 필요 |
| Stateless | JWT 등으로 서버 세션 최소화 | 확장성 좋음 | 토큰 보안, 만료 정책 중요 |
Health Check
로드밸런서는 backend가 살아 있는지 확인해야 한다. 단순 포트 체크만으로는 부족할 수 있다.
| 체크 | 의미 |
|---|---|
| TCP port | 프로세스가 포트를 열고 있는가 |
| HTTP status | 애플리케이션이 정상 응답하는가 |
| DB 포함 health | DB 연결까지 정상인가 |
| readiness | 트래픽을 받아도 되는 상태인가 |
| liveness | 프로세스를 재시작해야 하는 상태인가 |
장애 유형
| 증상 | 확인 지점 |
|---|---|
| 특정 사용자만 로그인 풀림 | sticky session, cookie, session store |
| 일부 요청만 500 | 특정 WAS 인스턴스 로그 |
| 간헐적 502 | backend 일부 down, health check 설정 |
| 배포 후 일부만 구버전 | backend 버전 불일치 |
| 응답 지연 | 특정 backend 부하, connection 편중 |
점검 포인트
- backend 목록이 현재 운영 서버와 일치하는가?
- health check가 실제 애플리케이션 상태를 반영하는가?
- 세션은 WAS 메모리, 외부 저장소, 토큰 중 어디에 있는가?
- 장애 서버가 자동으로 제외되는가?
- 배포 중 신구 버전이 섞여도 안전한가?
관련 블로그 기록
- NGINX 부하분산 (HTTP / TCP) — Nginx에서 HTTP/TCP upstream을 구성한 사례
- LB·WAF 뒤에서 클라이언트 실제 IP 살리기 — 로드밸런서/WAF 뒤에서 클라이언트 식별 정보를 유지한 사례
닫기 전 질문
- 같은 사용자의 두 요청이 서로 다른 WAS로 가도 문제가 없는가?
- backend 하나가 죽었을 때 세션과 진행 중 요청은 어떻게 되는가?
- health check는 포트만 보는가, 애플리케이션 상태까지 보는가?