////
Search
Duplicate
5️⃣

5장. 안정 해시 설계

수평적 규모 확장 시, 요청을 균등하게 분배하기 위해서 필요한 기술이다.
이 해시 기술이 풀어내야 하는 문제부터 알아보자.

해시 키 재배치 문제

N개의 서버가 있을 때, 이 서버들에게 부하를 균등하게 나누는 보편적인 방법은 serverIndex = hashKey % N 해시 함수를 사용하는 것이다.
이 방법은 보통 평상시에는 문제가 발생하지 않다가 서버가 추가되거나 삭제되면 문제가 발생한다.
재배치 과정에서 기존 해시 함수를 사용하는 경우, 키가 특정 서버에 몰리거나 아예 할당되지 않는 경우도 발생하기 때문에, 안정 해시가 등장했다.

안정 해시

안정 해시란 해시 테이블의 사이즈가 조정될 때, 평균적으로 k/n 개의 키만 재배치하는 기술이다.
여기서 k는 키의 갯수이고, n은 슬롯, 서버의 갯수다.

해시 공간과 해시 링

해시 함수로 SHA-1을 사용한다고 했을 때, SHA-1의 해시 공간 범위는 0부터 2^160-1이다
해시 링의 경우, 해시 공간을 구부려 원형 큐와 같은 형태를 만들었다고 가정하면 이해가 쉽다.
이후, 해시 함수를 사용해서 서버의 이름이나, IP에 연산을 가한 결과값을 토대로 이 해시 링 위에 위치시킨다.
키 역시 특정 값을 만들어 연산을 가한 후, 결과 값을 해시 링 위에 위치시킬 수 있다.

서버 조회

각 키가 저장되는 서버는, 해당 키의 위치로부터 시계 방향으로 링을 탐색해나갈때 처음으로 발견할 수 있는 서버다.
이때, 서버 추가와 삭제가 발생하는 경우, 재배치는 특정 key만 재배치되고 나머지는 그대로임이 보장된다.

기본 구현법의 두 가지 문제

안정 해시 알고리즘의 기본 절차는 다음을 따른다.
서버와 키를 균등 분포 해시 함수를 사용해 해시 링에 배치한다.
키의 위치에서 링을 시계 방향으로 탐색하다 만나는 최초의 서버가 키가 저장될 서버다.
이 접근법은 두 가지 문제를 가진다.
하나는 서버가 추가되거나 삭제되는 상황을 고려했을 때, 파티션의 크기를 균등하게 유지하는 것이 불가능하다는 것이다.
나머지 하나는 키의 균등 분포를 달성하기가 어렵다는 것이다.
이런 문제를 해결하기 위해 가상 노드 또는 복제라 불리는 기법을 사용한다.
가상 노드의 경우, 각 노드마다 할당된 파티션의 크기가 너무 크기 때문에, 그 크기를 줄이기 위해 노드를 여럿 할당하여 할당되는 파티션의 사이즈 자체를 줄여, 편차를 줄이는 방법이다.
키의 균등 분포를 위해 키를 재배치할 수 있다.
추가되는 경우, 새로이 추가된 서버와 새로이 추가된 서버에서 반시계 방향으로 탐색을 진행하다 만나는 처음 만나는 서버 사이의 키를 재배치해야 한다.
삭제되는 경우, 삭제되는 서버의 반시계 방향에 있는 최초 서버 사이에 있는 키들이 삭제되는 서버의 시계 방향에 있는 최초 서버에 배치되어야 한다.

마치며

안정 해시가 왜 필요한지, 어떻게 동작하는지를 확인하였으며, 안정 해시의 이점은 다음과 같다.
서버가 추가되거나 삭제될 때, 재배치되는 키의 수가 최소화된다.
데이터가 보다 균등하게 분포하게 되므로 수평적 규모 확장성을 달성하기 쉽다.
핫스팟 키 문제를 줄인다. 특정 샤드에 대한 과부하를 안정 해시는 데이터를 좀 더 균등하게 분배하여 이런 문제가 생길 가능성을 줄인다.
안정 해시를 사용하는 대표적인 예시는 다음과 같다.
아마존 다이나모 데이터베이스의 파티셔닝 관련 컴포넌트
아파치 카산드라 클러스터에서의 데이터 파티셔닝
디스코드 채팅 어플리케이션
아카마이 CDN
매그레프 네트워크 부하 분산기