-
Consistent Hashing (안정 해시)📚 개발 도서/대규모 시스템 설계 기초 2023. 2. 12. 01:02
해시 키 재배치(rehash) 문제
N개의 캐시 서버가 존재할 때 이 서버들에 부하를 균등하게 나누는 보편적인 방법
serverIndex = hash(key) % N (N: 서버의 개수)
이는 서버가 추가되거나 기존 서버가 삭제되면 문제가 된다.
serverIndex = hash(key) % (N-1) (-1: 삭제된 서버)
장애가 발생한 서버에 보관되어 있는 키뿐만 아니라 대부분의 키가 재분배되게 된다. 대부분 캐시 클라이언트가 데이터가 없는 엉뚱한 서버에 접속하게 되는 것이다.
즉 노드 삭제 및 추가가 있는 경우 hash(key) % N 결과에 미치는 영향이 너무 커서 많은 수의 요청이 실패하여 캐시된 데이터가 다시 로드된다는 것이다. → 대규모 캐시 발생
안정 해시(consistent hash)
해시 테이블 크기가 조정될 때 평균적으로 오직 k/n개의 키만 재배치하는 해시 기술 (n: 노드의 개수, k: 키의 개수)
(전통적 해시 테이블은 노드의 수가 바뀌면 거의 대부분 키를 재배치한다.)
→ 재배치되는 키의 수가 최소화
이는 핫스팟 키 문제(불균형하게 부하가 높은 파티션)를 줄인다. 특정한 샤드에 대한 접근이 지나치게 빈번하면 서버에 과부하 문제가 생길 수 있다.
안정 해시 기본적인 절차
- 서버와 키를 균등 분포 (uniform distribution) 해시 함수를 사용해 해시 링에 배치한다.
- 키의 위치에서 링을 시계 방향으로 탐색하다 만나는 최초의 서버가 키가 저장될 서버다.
노드 추가 및 삭제가 데이터 범위에 미치는 영향을 살펴보자
노드 추가
추가된 노드(node 5)와 이전 노드(node 4) 사이의 데이터에만 영향을 주게 된다.
노드 삭제
삭제된 노드(node 3)와 이전 노드(node 2) 사이의 데이터에만 영향을 주게 된다.
위의 접근법에는 두가지 문제가 존재한다.
- 파티션의 크기를 균등하게 유지할 수 없다.
- 파티션: 인접한 서버 사이의 해시 공간이다.
- 어떤 서버는 굉장히 작은 해시 공간을 할당받고, 어떤 서버는 굉장히 큰 해시 공간을 할당 받는 상황이 가능하다는 것이다.
- → 특정 서버가 삭제되면 한 서버의 파티션이 다른 파티션 대비 두배로 커지는 상황이 나타날 수 있다.
- 키의 균등 분포를 달성하기 어렵다.
위 문제를 해결하기 위해 제안된 기법은
가상 노드(복제) 기법
실제 노드 또는 서버를 가리키는 노드 (하나의 서버는 링 위에 여러 개의 가상 노드를 가질 수 있다.)
→ 각 서버는 하나가 아닌 여러 개 파티션을 관리해야 한다.가상 노드의 개수가 늘어날 수록 표준 편차값이 떨어져 데이터가 고르게 분포된다. 가상 노드 개수는 100~200개를 사용할 경우 표준 편차 값이 평균의 5%~10% 사이다.
가상 노드의 개수를 늘리면 키의 분포는 더 균등해지지지만 (→ 수평적 규모 확장성을 달성하기 쉽다.),
가상 노드 데이터를 저장할 공간은 더 많이 필요하게 될 것이다. (tradeoff 가 필요)🔗 참고
반응형'📚 개발 도서 > 대규모 시스템 설계 기초' 카테고리의 다른 글
RDB와 NoSQL (0) 2023.06.08 [대규모 시스템 설계 기초 - 01] 사용자 수에 따른 규모 확장성 (0) 2023.01.13