앞 단계에서 이동량이 첫 제약이고, 담당은 물어보지 않고 계산으로 알아야 한다고 정했습니다. 계산으로 담당을 정하는 가장 단순한 방법부터 봅니다.
서버 수로 나눈 나머지
담당 서버 번호 = 해시(키) % 서버 수
좋은 점이 많습니다. 계산이 연산 두 번이라 0.1ms 예산에 여유가 크고, 해시가 고르면 분포도 고르며, 구현이 한 줄이고 들고 있을 상태가 서버 수 하나뿐입니다.
서버 수가 바뀌면 규칙 자체가 바뀐다
문제는 나누는 수가 규칙의 일부라는 것입니다. 서버 수가 바뀌면 모든 키의 계산 결과가 함께 바뀝니다. 값이 조금 밀리는 것이 아니라 규칙 없이 재배열됩니다.
| 서버 수 | 한 대 늘릴 때 제자리에 남는 키 |
|---|---|
| 3에서 4 | 약 4분의 1 |
| 10에서 11 | 약 11분의 1 |
| 100대 에서 101대 | 약 1퍼센트 |
서버가 많아질수록 나빠집니다. 규모를 키우려고 서버를 늘리는데 늘릴수록 늘리기가 어려워지는 구조입니다.
요구사항과 대조하면 탈락한다
앞 단계에서 계산한 숫자를 그대로 씁니다. 담당이 99퍼센트 바뀌면 적중률이 거의 0으로 떨어지고 원본 요청이 20배가 됩니다. 적중률 95퍼센트 이상 유지라는 요구사항을 정면으로 어깁니다.
그리고 이 일이 주당 3~4번 일어납니다. 한 번이면 새벽에 감당할 수 있지만 매주라면 구조를 바꿔야 합니다.
그래도 이 방법이 맞는 경우
나머지 연산을 나쁜 방법으로 외우면 안 됩니다. 서버 수가 고정이거나, 담당이 바뀌어도 잃을 것이 없으면 이보다 단순하고 값싼 방법이 없습니다.
| 상황 | 나머지 연산이 |
|---|---|
| 서버 수가 고정. 늘릴 계획이 없다 | 충분하다. 더 정교한 방법은 과설계다 |
| 상태가 없는 계산을 나눠 준다 | 충분하다. 담당이 바뀌어도 잃을 것이 없다 |
| 담긴 데이터가 있고 구성이 바뀐다 | 무너진다. 이 요구사항이 그렇다 |
무엇을 담고 있는지가 판단을 가릅니다. 담당이 바뀔 때 잃는 것이 없다면 나머지 연산으로 충분합니다.
서버 수를 넉넉하게 잡아 두면 되지 않나
미리 1,000으로 나눠 두고 서버 100대가 각각 10개 조각을 맡는 방법이 있습니다. 조각 수는 고정이므로 나머지 규칙은 그대로이고, 서버가 늘면 조각의 담당만 옮깁니다.
이 방법은 실제로 쓰입니다. 다만 조각과 서버의 매핑 표를 누군가 관리하고 모두에게 알려야 하고, 처음 정한 조각 수가 상한이 됩니다. 조각 수를 늘리는 순간 다시 같은 문제로 돌아갑니다.
다음 단계에서 매핑 표 없이 같은 효과를 얻는 방법을 봅니다.