로드 밸런싱 알고리즘 — RR · 가중 · 최소연결 · IP해시 · 최소응답
같은 요청 12개를 다섯 알고리즘이 서버 3대에 나누는 것을 실행해, '고르게'의 정의(개수·능력·실부하·고정성·건강)가 알고리즘마다 다름을 보여준다.
단계 목록 · 키보드 ←/→ 이동, Space 재생
알고리즘 선택은 '무엇이 균등해야 하는가'라는 질문에 대한 답이다 — 요청 개수(RR), 서버 능력(가중), 실제 부하(최소 연결), 사용자 고정(IP 해시), 서버 건강(최소 응답시간).
왜 헷갈리는가
"라운드 로빈이면 고르게 분산되는 것 아닌가요?" — 개수는 고르다. 하지만 요청의 무게가 다르고 서버의 사양이 다르고 서버의 상태가 시시각각 다르다. 화면의 RR 장면처럼 개수 균등이 부하 균등을 보장하지 않는 것이 모든 고급 알고리즘의 존재 이유다.
애니메이션이 보여주는 것
다섯 장면이 각각 한 가지 결핍을 고친다. RR은 아무것도 안 보고 돌리기만 한다(그래서 예측 가능하고 공평하다). 가중 RR은 서버 사양(2:1:1)을 반영한다. 최소 연결은 '지금 열린 연결 수'라는 실시간 신호를 보고, 무거운 요청을 문 서버를 자연히 피한다.
IP 해시는 분산이 아니라 고정이 목적이다 — 같은 클라이언트를 항상 같은 서버로. 최소 응답시간은 건강 신호(응답 속도)를 보고, 병든 서버(평균 90ms)로의 유입을 스스로 말린다 — 화면에서 그 서버의 카운트는 0이다.
선택 가이드
기본값에서 출발해 신호를 하나씩 더한다.
- 균질 서버 + 짧고 비슷한 요청(전형적 무상태 API): RR — nginx·k8s Service의 기본값이 이것인 이유.
- 사양이 다른 서버 혼재(신구 세대 혼합, 점진 교체 중): 가중 RR/가중 최소 연결.
- 요청 길이가 들쭉날쭉(웹소켓, 스트리밍, 무거운 질의 혼재): 최소 연결 — HAProxy leastconn, nginx least_conn.
- 서버 메모리에 세션·로컬 캐시가 있음: IP 해시(고정 세션). 단, 큰 NAT 뒤의 사용자들이 한 서버에 몰릴 수 있고, 서버 증감 시 매핑이 흔들린다 — 그 보완이 일관 해싱이다.
- 부분 장애를 자동 회피하고 싶다: 최소 응답시간(nginx Plus least_time, Envoy의 가중 최소 요청) — 측정 상태가 필요한 만큼 가장 비싸다.
한 겹 더: L4냐 L7이냐
같은 알고리즘도 어느 층에서 도는지에 따라 재료가 다르다. L4(TCP)는 연결 단위로만 나눠 IP 해시·최소 연결이 자연스럽고, L7(HTTP)은 요청 단위라 URL·헤더 기반 라우팅과 최소 응답시간이 산다. HTTP/2·gRPC처럼 한 연결에 요청이 다중화되는 프로토콜은 L4로 나누면 편중된다 — L7 밸런싱이 필요한 대표적 이유다.
기억할 것
- 개수 균등(RR) ≠ 부하 균등 — 요청 무게와 서버 상태는 RR의 시야 밖이다.
- 신호를 더할수록 좋아지고 비싸진다: 없음(RR) → 사양(가중) → 연결 수(최소연결) → 응답시간(최소응답).
- IP 해시의 목적은 분산이 아니라 고정 — 세션·캐시 지역성용, 편중과 재배치가 대가.
- gRPC/HTTP2는 L7에서 나눠야 한다 — 연결 단위(L4)로는 편중된다.