링은 이동량 문제를 풀었지만 두 가지를 남겼습니다. 구간 크기가 고르지 않고, 서버가 빠질 때 그 몫이 한 서버에 전부 갑니다. 두 문제가 같은 방법으로 풀립니다.
무작위 위치는 고르지 않다
서버 위치는 해시 값이라 무작위입니다. 무작위로 찍은 점들은 고르게 퍼지지 않습니다. 어떤 구간은 크고 어떤 구간은 작습니다. 서버 100대에서 가장 큰 구간은 평균의 네 배를 넘기 쉽습니다.
담당 양이 네 배면 그 서버의 메모리와 조회 부하도 네 배입니다. 서버 사양은 같은데 부하가 네 배라면 그 한 대가 먼저 무너집니다.
한 서버를 여러 번 올린다
서버 하나를 링에 여러 지점으로 올립니다. 이름에 번호를 붙여 다른 해시 값을 얻습니다.
서버1-0, 서버1-1, 서버1-2, ... 각각 다른 위치
어느 지점에 걸리든 담당은 서버1
구간이 잘게 쪼개져 여러 곳에 흩어지면 합계가 평균으로 모입니다. 한 서버가 큰 구간 하나에 당첨될 확률은 그대로지만, 작은 구간 150개의 합은 평균에서 크게 벗어나기 어렵습니다.
| 서버당 지점 수 | 담당 양의 편차 |
|---|---|
| 1개 | 크다. 최대가 평균의 네 배 |
| 150개 | 작다. 몇 퍼센트 안 |
사양 차이를 여기서 쓴다
요구사항에 서버 사양이 최대 2배 차이라고 적혀 있습니다. 지점 수를 다르게 주면 담당 양이 그 비율로 달라집니다.
평범한 서버: 150개 지점
메모리가 두 배인 서버: 300개 지점
균등하게 나누는 것이 오히려 불균형이 되는 경우입니다. 사양이 두 배인 서버에 같은 양을 주면 그 서버의 메모리가 절반 남고, 작은 서버는 꽉 찹니다.
빠질 때의 쏠림도 함께 풀린다
지점이 흩어져 있으므로 한 서버가 빠지면 그 지점들의 뒤를 여러 서버가 나눠 받습니다.
| 지점 수 | 서버 한 대가 빠지면 |
|---|---|
| 1개 | 다음 한 대가 전부 받는다 |
| 150개 | 여러 대가 조금씩 나눠 받는다 |
앞 단계에서 남겨 둔 연쇄 실패 위험이 이것으로 줄어듭니다. 하나의 장치가 두 문제를 푸는 것이 이 설계의 좋은 점입니다.
대가는 링의 크기다
지점 수를 늘리면 링의 항목이 늘어납니다.
서버 100대 x 150개 = 링 항목 15,000개
메모리는 크지 않지만 담당을 찾는 비용이 항목 수에 따라 늘어납니다. 정렬해 두고 반씩 좁혀 찾으면 15,000개에서 14단계면 되므로 0.1ms 예산 안입니다. 다음 단계에서 이 찾기를 다룹니다.
지점 수는 편차와 비용의 균형점입니다. 무조건 크게 잡으면 링 갱신과 탐색이 무거워지고, 작게 잡으면 편차가 남습니다.