로드밸런서 세션 테이블 & DSR & Idle Timeout
핵심 개념
로드밸런서 세션 테이블
- L4 로드밸런서는 클라이언트 패킷을 어떤 백엔드로 보낼지 추적하기 위해 세션 테이블을 메모리에 유지
- 자원이 유한하므로 idle timeout 이후 엔트리 삭제
- 삭제 후 클라이언트가 같은 연결로 패킷을 보내면 → 로드밸런서가 RST 반환
DSR (Direct Server Return)
- 응답 트래픽이 로드밸런서를 우회하여 서버 → 클라이언트로 직접 전달
- 로드밸런서가 응답 패킷을 볼 수 없어 세션 활성 판단이 요청 패킷에만 의존 → idle timeout에 더 취약
- 주로 L4 로드밸런서(LVS, F5 nPath 등)에서 사용
AWS NLB
- 순수 DSR 아님 — 클라이언트 IP는 보존하지만 응답 트래픽도 NLB를 경유 (Hyperplane 기반)
- 그러나 세션 테이블 기반으로 동작하므로 idle timeout(350초) 문제는 동일하게 존재
nginx (L7 리버스 프록시)
- 세션 테이블 방식이 아님 — 클라이언트/백엔드 각각 별도 TCP 연결을 직접 관리
- 세션 테이블 만료로 인한 RST 문제 없음
- 대신 자체 timeout 설정(
keepalive_timeout,proxy_read_timeout)에 의해 의도적으로 연결 정리 - 단, nginx 앞에 L4 로드밸런서가 있으면 그 구간에서는 동일한 문제 발생 가능
TCP Keepalive로 세션 유지
- keepalive_time을 로드밸런서 idle timeout보다 짧게 설정
- 예:
tcp_keepalive_time=60,probes=3,intvl=10→ 60초마다 keepalive 패킷 전송 - idle timeout 120초 > keepalive 60초 → 세션 테이블 만료 전에 항상 리셋됨
핵심 원칙: keepalive_time < 로드밸런서 idle timeout
정리 비교
| 구분 | L4 LB (DSR) | L4 LB (비DSR, NLB) | nginx (L7) |
|---|---|---|---|
| 세션 테이블 | O | O | X |
| idle timeout RST | 발생 | 발생 | 미발생 |
| 응답 경로 | LB 우회 | LB 경유 | LB 경유 |
| Keepalive 필요성 | 높음 | 높음 | 낮음 (자체 관리) |