Hash Ring
해시 링(hash ring)은 0부터 최대값까지의 해시값들을 원형으로 연결해서 서버와 데이터를 배치하는 가상의 원형 공간이다.

안정 해시에서 해시 링(hash ring)을 사용하는 이유
1. 경계 문제 해결이 가능하다.
선형 공간을 사용하면 끝점에서 아래와 같은 문제가 발생한다.
선형 공간: [0] --- [서버A] --- [서버B] --- [서버C] --- [MAX]
해시값이 MAX 근처에 있는 키들은 어디로 가야 하는가?
0 근처로 "돌아가는" 로직이 복잡해진다.
하지만 아래와 같이 원형으로 이은 원형 공간에서는 자연스럽게 연결될 수 있다.
원형 공간: [0/MAX]
/ \
[서버C] [서버A]
\ /
[서버B]
2. 모든 위치가 동등하다.
원형에서는 시작점과 끝점이 없기 때문에 특정 위치가 특별하지 않고, 어떤 서버가 추가되어도 동일한 영향을 미치며 수학적으로도 더 균등한 분포를 보장할 수 있따.
3. 거리 계산이 일관적이다.
선형 공간에서는 경계를 넘나드는 복잡한 계산이 추가로 필요하지만, 원형 공간에서는 항상 일관적으로 거리를 계산할 수 있다.
// 선형 공간에서의 문제
function getDistance(from: number, to: number): number {
if (to >= from) {
return to - from;
} else {
// 경계를 넘나드는 복잡한 계산 필요
return (MAX_VALUE - from) + to;
}
}
// 원형 공간에서는 항상 일관적
function getCircularDistance(from: number, to: number): number {
const diff = (to - from + RING_SIZE) % RING_SIZE;
return Math.min(diff, RING_SIZE - diff);
}
4. 서버 추가/제거 시 영향 범위가 명확하다
원형에서는 각 서버가 담당하는 구간이 명확하다.
서버A: 이전 서버 위치 ~ 서버A 위치
새 서버 추가 시: 기존 서버의 구간 일부만 가져감
서버 제거 시: 다음 서버가 해당 구간을 흡수
5. 직관적 이해
원형은 시계와 같은 개념이어서 직관적이며 시각적으로 이해하기 쉬워 디버깅과 모니터링이 용이하다는 장점이 있다.
"시계방향으로 다음 서버" = 명확한 규칙
6. 수학적 일치
원형 공간은 모듈러 연산과 자연스럽게 맞아떨어진다.
// 해시값을 링 크기로 나눈 나머지 = 링 위의 위치
const position = hash(key) % RING_SIZE;
// 다음 서버 찾기도 자연스럽다
const nextPosition = (position + 1) % RING_SIZE;
결론
위와 같이 원형 공간은 안정 해시(Consistent Hash)뿐만 아니라, P2P 네트워크(BitTorrent), 로드 밸런서(NGINX), 분산 데이터베이스(Cassandra, DynamoDB), CDN, 블록체인 등에서 데이터나 요청을 여러 노드에 균등하게 분산시킬 때 널리 사용되며 단순함, 균등성, 확장성을 모두 만족시킬 수 있는 기술이다.