로고jiohh blog

5장 - 안정 해시 설계

목표

수평적 규모 확장성을 달성하기 위해서 요청 또는 데이터를 서버에 균등하게 나누는 것이 중요하다.
➡️ 안정해시 설계를 통해 위의 목표를 달성해보자 = 안정해시에 대해 알아보자

해시 키 재배치(rehash) 문제

안정해시에 대해 알아보기전에 기존 해시의 문제점에 대해 알아보자
보편적으로 N개의 캐시 서버가 있을때 serverIndex = hash(key) % N를 이용하여 특정 캐시서버에 접속하도록 분배한다.

서버 풀의 크기가 고정되어 있을 때, 데이터 분포가 균등할 때는 잘 작동한다.

하지만 장애가 발생하면 캐시 클라이언트가 데이터가 없는 엉뚱한 서버에 접속하게 된다.
대규모 캐시 미스가 발생하게 되는데 안정해시는 이를 해결하는 기술이다.

안정 해시

안정 해시는 해시 테이블 크기가 조정될 때 평균적으로 k/n개의 키만 재배치하는 해시 기술

k = 키의 객수 / n = 슬롯의 갯수

해시 테이블의 예시, bucket수는 4이고, slot수는 3이다.

대부분의 전통적 해시 테이블은 슬롯의 수가 바뀌면 거의 대부분 키를 재배치 한다.


안정해시 동작

해시 공간과 해시 링

동작원리를 알아보기위해 해시함수로 SHA-1을 사용 가정

출력값의 범위를 x0~xn까지로 가정하였을 때 해시 공간(버킷?)을 그림으로 표현하면 다음과 같다.

해시 공간을 양쪽으로 구부려 접어 해시 링이 만들어 진다.

해시 서버

해시 함수를 이용하여 서버를 링 위의 어떤 위치에 대응

해시 키

해시할 키 또한 해시 링 위의 어느 지점에 배치 할 수 있다.

서버 조회

어떤 키가 저장되는 서버는, 해당 키의 위치로 부터 시계 방향으로 링을 탐색해 나가면서 만나는 첫 번째 서버이다.


위의 규칙을 바탕으로 서버추가와 서버제거하면 다음과 같이 배치된다.

서버 추가

시계 방향으로 링을 탐색했을 때 만나는 첫 번째 서버를 키가 저장되는 서버로 사용한다면
아래와 같이 서버가 추가되었을때 k0의 서버는 s0에서 s4로 바뀌게 된다.

서버를 추가하더라도 키 가운데 일부만 재배치하게된다.

서버 제거

서버가 제거되면 일부만 재배치된다.


기본 구현법의 두가지 문제

기본구현법 절차

  1. 서버와 키를 균등 분포 해시 함수를 사용해 해시 링에 배치한다.
  2. 키의 위치에서 링을 시계 방향으로 탐색하다 만나는 최초의 서버가 키가 저장될 서버다.

이 접근법에는 두가지 문제가 있다.

  1. 서버가 추가 되거나 삭제되는 상황에서 파티션의 크기를 균등하게 유지하는게 불가능하다.
    (위의 서버 제거 그림 참조 ➡️ 재배치 한 만큼의 파티션크기증가)
  2. 키의 균등 분포를 달성하기 어렵다.

가상 노드

문제를 해결하기 위해 제안된 기법이 가상 노드 기법이다.
가상 노드는 실제노드를 가리키는 노드로 하나의 서버는 여러 개의 가상 노드를 가질 수 있다.

아래는 3개의 가상노드를 갖는 가정하여 나타낸 그림이다. 실제로는 훨씬 큰값이 사용된다.

가상노드에서 접근도 크게 다르지 않다.

가상 노드의 개수를 늘리면 키의 분포가 점점 더 균등해진다.
표준 편차가 작아져서 데이터가 고르게 분포되기 때문이다.

그러나 가상 노드가 증가하면 데이터를 저장할 공간은 더 필요하게 될 것으로 타협적 결정(trade off)가 필요

재배치할 키 결정

서버가 추가되거나 제거될때 어느 범위의 키들이 재배치 되어야할까?

  • s4 서버 추가시 : s3에서 s4사이

  • s1 서버 삭제시 : s1에서 s0사이

  • 노드별 파티션

마치며

안정 해시의 이점

  • 서버가 추가되거나 삭제될 때 재배치되는 키의 수가 최소화된다.
  • 데이터가 보다 균등하게 분포 ➡️ 수평적 규모 확장성을 달성하기 쉽다.
  • 핫스팟키 문제를 줄인다.

실제 사용 예시

  • 아마존 다이나모 데이터베이스의 파티셔닝 관련 컴포넌트
  • 아파치 카산드라 클러스터에서의 데이터 파티셔닝
  • 디스코드 채팅 어플리케이션
  • 아카마이 CDN
  • 매그레프 네트워크 부하 분산기