5. 안정 해시 설계
안정 해시가 왜 등장했는가?
modular 연산에 따라서 분포된 데이터들에서, 서버가 제거된다면 거의 모든 데이터의 위치가 변경된다.
그러므로 서비스에 큰 부담이 된다.
안정 해시란?
서버를 추가/제거해도 최소한의 데이터만 이동하자임
기본 원리
hash ring
hash function
![[Pasted image 20250810151336.png]] ![[Pasted image 20250810151407.png]]
modular 연산을 사용하지 않으며, 키는 해시 링의 어느 지점에 배치됨.
![[Pasted image 20250810151449.png]]
키가 저장되는 위치는 시계방향으로 링을 탐색하다가 만나는 첫 번째 서버
서버 추가
![[Pasted image 20250810151611.png]]
s4가 추가됨
그러면 key0 만 재배치됨.
왜?
서버 4가 추가된다음에 key0만 시계방향으로 돌 때 가장 처음 만나게 될 서버이기 때문
다른 키들을 재배치 되지 않는다.
서버 제거
![[Pasted image 20250810151725.png]]
서버 1 제거
key1 만 서버 2로 재배치
나머지 키에는 영향 없음
안정 해시 알고리즘
서버, 키를 균등 분포 해시 함수를 이용해서 해시 링에 배치
키의 위치에서 링을 시계방향으로 탐색하다가 만나는 최초의 서버가 키가 저장될 서버
문제점
서버 추가, 삭제를 감안하면 균등한 크기의 파티션 유지를 불가
키의 균등 분포를 달성하기 어려움
이러한 문제점을 해결하기 위해?
가상 노드 또는 복제 노드 기법이 나옴
가상 노드
실제 노드 또는 서버를 가르키는 노드
하나의 서버는 링 위에 여러개의 가상 노드를 가질 수 있음.
![[Pasted image 20250810153017.png]]
sx_x -> 가상 노드
서버 0을 링위에 배치하기 위해서 s0_0, s0_1, s0_2 세개의 가상노드를 사용
데이터는 시계방향으로 돌면서, 가장 가까운 가상노드를 만났을 경우에, 해당 키를 저장할 서버가 된다.
그러나 가상노드는 실제 서버(s0, s1)를 바라보고 있음.
왜 가상 노드를 사용하는가?
가상 노드의 갯수를 늘리면 키의 분포는 균등해진다.
재배치할 키 결정
![[Pasted image 20250810153235.png]]
s4추가
key0이 s4로 재배치되어야함
정리
안정 해시 이점
서버 추가, 삭제 될 때 재배치되는 키의 수가 최소화됨
수평적 규모 확장성 달성하기 위함
핫스팟 문제 줄인다.
특정 샤드에 대한 지나친 접근, 서버 과부하 이슈
안정해시가 사용되는 기술
amazon dynamoDB의 partition
apache cassandra 클러스터에서의 data partition
discord
akamai cdn
meglev 네트워크 부하 분산기
기타
대규모 웹 서비스를 위한 분산 캐시 시스템을 설계해주세요. 캐시 서버가 자주 추가/제거될 수 있고, 캐시 미스를 최소화
캐시 서버가 동적으로 스케일링되는 환경에서 캐시 무효화를 최소화가 핵심
해시 기반 샤딩(key % N)을 사용하면 서버 추가/제거 시 거의 모든 키의 위치가 변경되어 대규모 캐시 미스가 발생
안정 해시(Consistent Hashing) 사용
캐시 미스 최소화 전략
예열(Warming) 전략, 새 서버를 링에 추가하기 전 필요한 데이터 미리 복사
안정 해시를 사용하는 시스템에서 특정 서버에 부하가 집중되는 핫스팟 문제가 발생했습니다. 어떻게 해결하시겠습니까
핫 스팟이 발생하는 이유?
데이터 스큐(Skew): 특정 키가 매우 인기 있음
해시 공간 불균등: 가상 노드가 충분하지 않음
시간적 패턴: 특정 시간대 특정 데이터 집중
해결
인기 데이터 복제 전략
가상 노드 동적 조정
안정 해시를 사용하는 분산 스토리지에서 서버 장애 시 데이터 손실 없이 빠르게 복구하는 방법을 설계
데이터 손실을 막으려면 복제가 필수
W (쓰기 쿼럼) + R (읽기 쿼럼) > N (복제 수)
쓰기: 3개 중 2개 서버가 성공해야 완료
읽기: 3개 중 2개 서버에서 읽어서 최신 버전 선택
Last updated
Was this helpful?