컨시스턴트 해싱이란
분산 캐시나 분산 데이터베이스에서는 데이터를 여러 서버(노드)에 나눠 저장합니다. 이때 어떤 데이터를 어느 노드에 저장할지 정하는 가장 단순한 방법은 ‘해시값 % 노드 개수’ 방식입니다. 하지만 이 방식은 노드가 하나만 추가되거나 제거돼도 전체 데이터의 매핑이 뒤바뀐다는 치명적인 단점이 있습니다. 컨시스턴트 해싱(Consistent Hashing)은 이 문제를 해결하기 위해 고안된 해시 분산 알고리즘으로, 노드가 추가되거나 삭제되어도 전체 데이터 중 극히 일부만 재배치되도록 설계되어 있습니다.
동작 원리: 해시 링과 예시
컨시스턴트 해싱의 핵심은 ‘해시 링(Hash Ring)’이라는 개념입니다. 0부터 2^32-1 같은 큰 범위의 값을 원형으로 배치했다고 상상해보세요. 이 링 위에 각 노드(서버)를 해시값으로 위치시키고, 저장할 데이터(키)도 동일한 해시 함수로 링 위에 위치시킵니다. 그리고 데이터는 자신의 위치에서 시계 방향으로 가장 먼저 만나는 노드에 저장됩니다.
예를 들어 원형 트랙에 서버 A, B, C가 일정 간격으로 서 있고, 관중(데이터)이 트랙 어딘가에 서 있다가 ‘내 위치에서 시계방향으로 가장 가까운 안내원에게 간다’고 생각하면 이해가 쉽습니다. 만약 서버 B가 사라지면, B가 담당하던 구간의 데이터만 다음 노드인 C로 옮겨가면 됩니다. A와 C가 담당하던 나머지 데이터는 전혀 영향을 받지 않습니다.
- 노드 추가: 새 노드가 담당할 구간의 데이터만 이동
- 노드 제거: 해당 노드가 맡던 데이터만 다음 노드로 이동
- 전체 재배치가 필요 없어 캐시 히트율 저하가 최소화됨
실무에서는 노드 하나당 여러 개의 가상 노드(virtual node)를 링에 배치해, 데이터가 특정 노드에 쏠리지 않고 고르게 분산되도록 보완하기도 합니다.
실무에서 왜 쓰는지
Redis Cluster, Memcached 기반 캐시 시스템, Amazon DynamoDB, Apache Cassandra 같은 분산 시스템은 서버 확장이나 장애로 인한 노드 변경이 빈번합니다. 이때 일반 해싱 방식을 쓰면 노드 하나가 바뀔 때마다 대부분의 캐시가 무효화되어, DB에 부하가 급증하는 ‘캐시 폭풍(cache stampede)’ 현상이 발생할 수 있습니다. 컨시스턴트 해싱을 사용하면 노드 변경 시 영향받는 데이터 범위가 1/N 수준으로 제한되기 때문에, 서비스 확장과 장애 대응 시에도 안정적인 성능을 유지할 수 있습니다. 이런 이유로 컨시스턴트 해싱은 대규모 분산 시스템을 설계할 때 반드시 알아야 할 핵심 개념으로 꼽힙니다.