서버를 여러 대로 늘렸는데 한 대만 부하가 몰린다면, 로드밸런서가 트래픽을 어떤 규칙으로 나누는지 모르기 때문일 수 있습니다. 분배 알고리즘은 크게 "순서대로 돌리느냐", "상태를 보고 정하느냐", "특정 키로 고정하느냐"로 갈립니다.
주요 알고리즘 비교
| 알고리즘 | 분배 기준 | 강점 | 약점 |
|---|---|---|---|
| 라운드로빈 | 순서대로 1대씩 | 단순·균등 | 서버 성능 차이 무시 |
| 가중 라운드로빈 | 서버별 가중치 비율 | 사양 차이 반영 | 가중치 수동 설정 |
| 최소 연결 | 활성 연결 가장 적은 서버 | 긴 연결에 유리 | 연결 수 추적 비용 |
| IP 해시 | 클라이언트 IP 해시값 | 같은 IP는 같은 서버 | 분포 불균형 가능 |
| 응답시간 | 가장 빠른 응답 서버 | 실시간 상태 반영 | 측정 오버헤드 |
라운드로빈은 가장 흔하고 직관적입니다. 다만 서버 사양이 제각각이거나 요청 처리 시간이 들쭉날쭉하면 균등 분배가 곧 공평한 분배는 아닙니다.
상태 기반과 해시 기반
- 상태 기반(최소 연결·응답시간): 서버의 현재 상태를 보고 정합니다. WebSocket이나 대용량 다운로드처럼 연결이 오래 유지되는 경우, 단순 라운드로빈은 한 서버에 긴 연결이 쌓일 수 있어 최소 연결이 더 안정적입니다.
- 해시 기반(IP 해시): 같은 클라이언트를 항상 같은 서버로 보냅니다. 이른바 세션 고정(sticky session) 문제, 즉 로그인 상태가 특정 서버 메모리에 있을 때 유용합니다. 다만 근본 해법은 세션을 Redis 같은 공유 저장소로 빼는 것이고, 해시 고정은 임시방편에 가깝습니다.
로컬 터미널
# Nginx upstream 예시
# upstream backend {
# least_conn; # 최소 연결 방식
# server 10.0.0.1:8080 weight=3;
# server 10.0.0.2:8080;
# }
weight=3은 첫 서버가 다른 서버보다 3배 더 받는다는 뜻으로, 가중 분배를 표현합니다.
헬스체크가 전제다
어떤 알고리즘이든 죽은 서버로는 안 보내야 의미가 있습니다. 로드밸런서는 주기적으로 헬스체크를 보내 응답 없는 서버를 풀에서 제외합니다.
OUTPUT
$ curl -s -o /dev/null -w "%{http_code}\n" http://10.0.0.1:8080/health
200
헬스체크 경로(/health)가 200을 주는 동안만 트래픽을 받고, 실패가 누적되면 자동으로 빠집니다. 알고리즘 선택보다 이 안전망이 먼저입니다.
요점 정리
- 라운드로빈 = 단순 순환, 가중치 = 사양 차이 반영.
- 긴 연결이 많으면 최소 연결, 세션을 고정해야 하면 IP 해시.
- 세션 고정은 임시방편 — 가능하면 세션을 공유 저장소로 분리하세요.
- 어떤 알고리즘이든 헬스체크로 죽은 서버를 빼는 게 전제입니다.
로드밸런서와 트래픽 분배를 직접 구성하며 익히는 실습은 네트워크 트랙에서 회원가입 없이 무료로 할 수 있습니다.