도구스개발

컨시스턴트 해싱 재배치 계산기

노드 수를 바꿀 때 옮겨야 하는 키의 비율을 모듈러 샤딩과 해시 링으로 나란히 계산합니다. 가상 노드에 따른 부하 편차도 함께 냅니다.

캐시 항목이나 레코드의 수입니다. 몰라도 비율은 나옵니다

10대 → 11대로 바꿀 때 옮겨야 하는 키

모듈러 90.9% · 해시 링 9.1%

모듈러 샤딩이 해시 링보다 10배 더 옮깁니다

모듈러 샤딩 — 옮기는 비율90.91%
해시 링 — 옮기는 비율9.09%
모듈러로 움직이는 키 개수9,090,909
해시 링으로 움직이는 키 개수909,091
아낄 수 있는 이동8,181,818
1011은 서로소라 모듈러 샤딩이 가장 나쁜 경우입니다. 두 수에 공약수가 없으면 자리를 지키는 키가 min(n, m)/(n×m)까지 떨어집니다. 한 대씩 늘리거나 줄이는 흔한 경우가 거의 항상 여기에 해당합니다. 반대로 두 배로 늘리는 경우에만 절반이 남는데, 이것을 모듈러의 일반적인 성질로 착각하기 쉽습니다.
계산 근거모듈러 유지 = min(n,m)·gcd(n,m) / (n·m) = min(10,11)·gcd(10,11) / (10×11) = 9.09%링 옮김 = |n − m| / max(n,m) = |1011| / 11 = 9.09%모듈러 쪽 식은 중국인의 나머지 정리에서 나옵니다. (k mod n, k mod m) 쌍이 최대공약수로 묶인 격자 위에 고르게 퍼지고, 그중 두 값이 같은 것은 min(n, m)개뿐입니다.

노드를 한 대씩 늘려 갈 때 (해시 링 기준)

변경모듈러해시 링
101190.9%9.1%
101283.3%16.7%
101392.3%23.1%
101485.7%28.6%
101566.7%33.3%

노드 하나를 원 위에 몇 개의 점으로 쪼개 뿌릴지입니다

11대에 가상 노드 100개일 때 부하 편차 (변동계수)9.4%
가장 많이 맡은 노드10.53% (평균의 1.16배)
가장 적게 맡은 노드7.68%
고르게 나눴다면9.09%
1/√V 어림값10%

가상 노드를 늘리면 편차가 어떻게 주는가 (노드 11대)

가상 노드변동계수최대/평균1/√V
1114.9%4.34배100%
1038.8%2.03배31.6%
5010.1%1.22배14.1%
1009.4%1.16배10%
2006.1%1.11배7.1%
4005.6%1.12배5%

고정 시드로 실제 링을 만들어 잰 값입니다. 어림값 1/√V와 자릿수가 맞는지 나란히 두었으며, 가상 노드를 네 배로 늘려야 편차가 절반이 됩니다.

모듈러 샤딩은 서버 한 대만 늘려도 거의 모든 키가 자리를 옮깁니다. 10대에서 11대로 늘리면 90.9%가 움직이고, 이는 해시 링이 옮기는 9.1%의 정확히 10배입니다. 캐시라면 그만큼 미스가 나고 데이터베이스라면 대이동이 벌어집니다. n대에서 n+1대로 갈 때 모듈러가 링보다 정확히 n배 더 옮긴다는 관계가 성립합니다.
가상 노드가 없으면 부하가 고르지 않습니다. 원 위에 점을 무작위로 뿌리면 간격이 들쭉날쭉해서, 노드가 10대일 때 어떤 노드는 20%를 맡고 어떤 노드는 3%만 맡는 일이 실제로 생깁니다. 노드 하나를 여러 점으로 쪼개 뿌리면 이 편차가 대략 1/√V로 줄어듭니다. 100개면 10%, 400개면 5%입니다.
여기서 세는 것은 키의 비율이지 데이터 양이 아닙니다. 키마다 크기가 다르면 실제로 옮기는 바이트는 달라집니다. 또 실제 시스템은 복제본을 여러 벌 두므로 한 노드가 빠질 때 움직이는 데이터가 이 계산보다 많을 수 있습니다.
해시 링만이 답은 아닙니다. 랑데부 해싱(HRW)은 링을 만들지 않고도 같은 성질을 얻고, 점프 컨시스턴트 해시는 메모리를 거의 쓰지 않습니다. 다만 노드마다 가중치를 다르게 주거나 노드를 임의로 빼야 하는 요구가 있으면 방식마다 다루기 쉬운 정도가 다르니, 실제 선택은 운영 조건을 보고 하셔야 합니다.

사용 방법

  1. 1지금 노드 수와 바꾼 뒤 노드 수를 넣습니다.
  2. 2전체 키 개수를 넣으면 실제로 움직이는 키가 몇 개인지 나옵니다.
  3. 3가상 노드 수를 바꿔 가며 부하가 얼마나 고르게 나뉘는지 확인합니다.

자주 묻는 질문

거의 전부 옮겨 갑니다. 자리를 지키는 비율은 min(n,m)×gcd(n,m)/(n×m)이라, 10대에서 11대로 늘리면 9.1%만 남고 90.9%가 움직입니다. 4대에서 5대로 늘려도 80%가 움직입니다. 두 배로 늘리는 경우에만 예외적으로 절반이 남는데, 이것을 모듈러의 일반적인 성질로 착각하기 쉽습니다.

옮기는 비율이 |n−m|/max(n,m)로 줄어듭니다. 10대에서 11대로 늘릴 때 9.1%만 움직이며, 이는 모듈러의 90.9%에 비하면 정확히 10분의 1입니다. n대에서 n+1대로 갈 때 모듈러가 링보다 정확히 n배 더 옮긴다는 관계가 성립합니다. 노드가 많을수록 차이가 커집니다.

노드와 키를 같은 원 위에 올리고, 각 키를 시계 방향으로 가장 가까운 노드에 맡깁니다. 노드가 하나 늘면 그 노드가 새로 맡게 되는 구간의 키만 움직이고 나머지는 그대로 있습니다. 노드가 빠질 때도 그 노드가 맡던 구간만 다음 노드로 넘어갑니다.

원 위에 점을 무작위로 뿌리면 간격이 고르지 않기 때문입니다. 노드가 10대일 때 어떤 노드는 20%를 맡고 어떤 노드는 3%만 맡는 일이 실제로 생깁니다. 노드 하나를 여러 점으로 쪼개 뿌리면 큰 수의 법칙이 작동해 편차가 줄어듭니다.

부하 편차가 대략 1/√V로 줄어들므로 목표에서 거꾸로 정합니다. 100개면 변동계수가 10%, 400개면 5%입니다. 네 배로 늘려야 편차가 절반이 되므로 무작정 키운다고 좋아지지 않고, 링에 올릴 점이 그만큼 늘어 메모리와 조회 비용이 커집니다. 실무에서는 100~200개를 쓰는 경우가 많습니다.

다를 수 있습니다. 여기서 세는 것은 키의 비율이지 바이트 수가 아니라서, 키마다 크기가 다르면 실제로 옮기는 양이 달라집니다. 또 실제 시스템은 복제본을 여러 벌 두므로 한 노드가 빠질 때 움직이는 데이터가 이 계산보다 많을 수 있습니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서만 이루어지고, 넣으신 값은 이 기기를 벗어나지 않습니다.

알아두면 좋은 점

  • 키가 고르게 퍼져 있다고 보고 계산합니다. 실제 해시 함수의 치우침은 반영하지 않습니다.
  • 키의 비율을 세는 것이라 키마다 크기가 다르면 실제 이동량과 다릅니다.
  • 복제본을 여러 벌 두는 시스템에서는 실제로 움직이는 데이터가 이보다 많을 수 있습니다.
  • 부하 편차는 고정 시드 난수로 실제 링을 만들어 잰 값입니다. 해시 함수가 다르면 세부 숫자가 달라집니다.

함께 보면 좋은 도구

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