도구스개발

가중 라운드로빈 분배 순서 계산기

서버별 가중치를 넣으면 단순 가중 라운드로빈과 nginx의 평활 가중 라운드로빈(SWRR)이 만드는 요청 순서를 나란히 보여 줍니다. 비율은 같은데 몰림이 얼마나 달라지는지 cw 이력과 함께 확인할 수 있습니다.

줄마다 「이름: 가중치」 — 지금 3대

한 서버가 연달아 나오는 최대 횟수

단순 5번 → 평활 2번

한 주기 7번 · 비율은 둘 다 A 5 : B 1 : C 1로 같습니다

단순 가중 라운드로빈 — 가중치만큼 늘어놓고 차례로

AAAAABC

평활 가중 라운드로빈 (nginx SWRR)

AABACAA
한 주기 길이7
가중치 합 Σw7
단순 WRR 최대 연속5
평활 WRR 최대 연속2
한 주기 뒤 cw가 처음으로 돌아오는가예 (모두 0)
요청A cwB cwC cw뽑힌 곳
1511A
2322A
3133B
46-34A
54-25C
69-1-1A
7700A
계산 근거 (SWRR)요청마다: ① 모든 서버에 cw += w
② cw가 가장 큰 서버를 고른다
③ 고른 서버의 cw에서 Σw = 7를 뺀다
위 표의 cw는 ①을 마친 «직후», ②로 고르기 직전의 값입니다. 굵게 표시한 칸이 그때 가장 큰 값입니다.
비율은 같은데 순서가 다릅니다. 두 방법 모두 한 주기 7번 안에 A 5번, B 1번, C 1번을 보냅니다. 다른 것은 몰림입니다 — 단순 WRR은 최대 5번 연달아 같은 서버로 보내지만 SWRR은 2번입니다. 초당 수천 건이 흐르는 곳에서는 그 몰림이 큐 길이와 응답시간 꼬리를 그대로 밀어 올립니다.
Σw를 빼는 것이 핵심입니다. 방금 뽑힌 서버를 그만큼 뒤로 밀어 두어야 다음 몇 번의 차례가 다른 서버로 갑니다. 한 주기 동안 더한 양의 합과 뺀 양의 합이 정확히 같기 때문에 cw가 처음 상태(모두 0)로 돌아오고, 그래서 순서가 주기적이며 한 주기 안의 분배가 가중치와 정확히 일치합니다.
SWRR로도 못 없애는 몰림이 있습니다. 가중치가 100:1처럼 아주 치우쳐 있으면 큰 쪽이 연달아 나올 수밖에 없습니다. 몰림의 하한을 비율 자체가 정하기 때문입니다. 그런 경우에는 순서를 바꾸는 것보다 서버를 늘리거나 가중치를 다시 잡는 편이 낫습니다.
가중치는 「능력」이지 「현재 상태」가 아닙니다. 라운드로빈 계열은 정해 둔 비율대로 돌릴 뿐이라, 어떤 서버가 느려져도 알아채지 못합니다. 실제 부하를 보고 나누려면 최소 연결 수(least_conn)나 응답시간 기반 방식을 함께 써야 합니다. nginx의 SWRR도 서버가 죽었을 때는 effective_weight를 따로 낮추는 장치가 있는데, 여기서는 다루지 않습니다.

사용 방법

  1. 1서버 이름과 가중치를 줄마다 「이름: 가중치」로 넣습니다.
  2. 2두 순서를 견주어 같은 서버가 연달아 몇 번 나오는지 봅니다.
  3. 3cw 표에서 왜 그 서버가 뽑혔는지 확인합니다.
  4. 4한 주기 뒤 cw가 모두 0으로 돌아오는지로 구현이 옳은지 검산합니다.

자주 묻는 질문

한 주기의 비율은 같고 순서만 다릅니다. 단순 방식은 가중치만큼 이름을 늘어놓고 차례로 돌아 5:1:1이면 A A A A A B C가 되지만, 평활 방식(SWRR)은 A A B A C A A처럼 고르게 흩습니다. 몰림이 큐 길이와 응답시간 꼬리를 밀어 올리기 때문에 실제 로드밸런서는 평활 방식을 씁니다.

서버마다 현재 가중치 cw를 두고, 요청마다 ① 모든 서버에 cw += w ② cw가 가장 큰 서버를 선택 ③ 선택한 서버의 cw에서 가중치 합 Σw를 빼는 세 단계를 되풀이합니다. nginx의 upstream 모듈이 쓰는 방식과 같습니다.

방금 뽑힌 서버를 뒤로 크게 밀어 다음 몇 번의 차례가 다른 서버로 가게 하기 위해서입니다. 한 주기 동안 더한 양의 합과 뺀 양의 합이 정확히 같아 cw가 처음 상태(모두 0)로 돌아오고, 덕분에 순서가 주기적이며 분배 비율이 가중치와 정확히 일치합니다.

앞에 적은 서버가 뽑힙니다. nginx 구현도 같습니다. 그래서 설정 파일에 적은 순서가 결과 순서에 영향을 줍니다. 가중치가 모두 같을 때 SWRR이 단순 라운드로빈과 똑같아지는 것도 이 규칙 때문입니다.

아닙니다. 가중치가 100:1처럼 아주 치우쳐 있으면 큰 쪽이 연달아 나올 수밖에 없습니다. 몰림의 하한은 비율 자체가 정하기 때문입니다. 그럴 때는 순서를 바꾸는 것보다 서버를 늘리거나 가중치를 다시 잡는 편이 낫습니다.

순서는 그대로이고 주기 길이만 줄어듭니다. 6:4:2와 3:2:1은 같은 순서를 냅니다. 이 계산기도 표를 짧게 보이려고 최대공약수로 나눈 주기를 씁니다. 다만 nginx는 약분하지 않으므로 실제 cw 값 자체는 다르게 찍힙니다.

서버의 처리 능력에 비례해 정합니다. 다만 가중치는 「능력」이지 「현재 상태」가 아니어서, 어떤 서버가 일시적으로 느려져도 라운드로빈은 알아채지 못합니다. 실제 부하를 보고 나누려면 최소 연결 수(least_conn)나 응답시간 기반 방식을 함께 쓰세요.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 두 방법의 한 주기 분배 비율은 정확히 같습니다. 다른 것은 순서뿐입니다.
  • cw가 같으면 앞에 적은 서버가 이깁니다. 설정 순서가 결과에 영향을 줍니다.
  • 표를 짧게 보이려 가중치를 최대공약수로 나눈 주기를 씁니다. nginx는 약분하지 않습니다.
  • 가중치가 아주 치우치면 SWRR로도 몰림을 없앨 수 없습니다.
  • 서버가 죽었을 때 effective_weight를 낮추는 nginx의 장치는 다루지 않습니다.
  • 가중치는 능력이지 현재 부하가 아닙니다. 느려진 서버를 알아채지 못합니다.
  • 서버는 20대, 한 주기는 400번까지 다룹니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.