안정 해시 설계
책에서는 다양한 캐시 서버를 고르게 분포시키기 위해 안정 해시를 설계하는 것이 중요하다고 강조한다.
- 즉, 분산된 서버 환경에서 요청을 균등하게 분배하고, 확장성을 고려하며, 특정 서버에 과부하가 집중되지 않도록 설계해야 한다고 설명한다.
책에서는 세 가지 방법을 소개하며, 각각의 장단점과 요구사항에 따른 최적의 해법을 설명한다. 이 과정에서 단순한 면접 대비용 질문과 답변이 아니라, 해시 설계의 개념과 실제 적용 방식을 심도 있게 다룬다. 그중 가장 기억에 남는 방법은 가상 노드설정 방식이다.
안정해시 방식을 설정하지 않았을때의 문제
- 안정 해시(Consistent Hash)는 해시 테이블 크기가 조정될 때 평균적으로 오직 k/n개의 키만 재배치하는 해시 기술이다. 여기서 k는 키의 개수이고, n은 슬롯(Slot)의 개수이다. 전통적인 해시 테이블은 슬롯의 수가 바뀌면 거의 대부분의 키를 재배치한다고 설명한다.
안정해시는 서버가 추가되거나 삭제될 때, 키의 재배치를 최소화하기 위해 사용되는 기법이다.
이 과정에서 중요한 개념은 해시공간과 해시링이다.
- 해시링은 해시공간을 원형 구조로 구부려서, 키가 이동할 때 0부터 시작하는 구조를 만들어낸다. 이를 통해 키가 이동할 때마다 기존의 해시값을 다시 계산하는 대신, 가장 가까운 서버로만 데이터를 배분할 수 있다.
- 서버가 꺼지면, 해당 서버에 할당된 키는 다음 서버로 자동으로 이동한다. 이 방식 덕분에 모든 키를 재배치할 필요 없이, 최소한의 데이터만 이동하게 된다.
- 이 구조에서는 서버의 추가, 삭제, 조회가 가능하며, 대부분의 키는 재배치하지 않아도 된다. 즉, 시스템의 확장성과 안정성을 보장하면서, 데이터의 불필요한 이동을 줄일 수 있다.
가상 노드 설정 방식
- 가상 노드를 생성하여 하나의 서버에 여러 개의 가상 노드를 할당하고, 이를 랜덤하게 분배하는 방식이다.
- 이러한 설계를 적용하면 키의 표준편차를 줄이고, 데이터 분포를 더욱 균등하게 만들 수 있다.
- 단, 가상 노드의 개수가 많아질수록 추가적인 메모리와 연산이 필요하다는 점이 고려해야 할 부분이다.
책에서는 안정 해시가 필요한 이유를 깊이 있게 설명하며, 그 핵심 목적이 데이터의 균등 분포와 수평적 확장성 확보에 있다는 점을 강조한다.
읽고 난 후
책을 읽으면서, 데이터베이스 샤딩 작업을 제외하고 과연 안정 해시를 계속 사용할 필요가 있을까 하는 의구심이 들었다. 안정 해시는 주로 서버를 추가하거나 제거할 때 데이터가 균등하게 분포되도록 하는 데 초점을 맞추고 있어, 널리 쓰이는 기술이 아니라는 인상을 받을 수도 있다. 하지만 샤딩에서 가장 큰 문제는 데이터의 균등한 분배이며, 이를 효과적으로 해결하는 방법 중 하나가 안정 해시이다. 따라서 샤딩을 적용할 때 가장 널리 사용되는 방식이라고 볼 수 있다.
핫스팟 키 문제
- 특정 데이터(샤드)에 요청이 몰려 과부하가 발생하는 현상이며, 이를 해결하기 위한 키 랜덤화, 캐시, 샤드 확장 등의 기법을 사용한다.
추가정리
해시란 무엇인가??
데이터를 일정한 크기의 고정된 값이나 키로 변환하는 수학적 함수를 의미한다. 주로 데이터를 빠르게 조회하거나 저장하기 위해 사용된다.
특징
- 일방향성: 해시 함수는 원본 데이터를 해시 값으로 변환할 수 있지만, 그 반대로 해시 값으로부터 원본 데이터를 복원할 수 없다.
- 고정된 크기: 해시 함수의 결과 값은 항상 고정된 크기를 갖는다. 예를 들어, MD5 해시 함수는 항상 128비트(16바이트) 길이의 해시 값을 반환한다.
- 충돌 회피: 이상적으로 해시 함수는 서로 다른 입력에 대해 충돌(collision)을 피해야 한다. 즉, 다른 입력 값들이 동일한 해시 값을 가질 확률이 낮아야 한다. 물론, 이론적으로는 완벽하게 충돌을 피할 수는 없지만, 좋은 해시 함수는 충돌을 최소화하려고 설계된다.
안정해시가 좋은 경우
노드 추가/ 삭제가 자주 발생하는 시스템
- 서버가 추가되거나 제거될 때 데이터 재배치가 최소화되므로, 캐시미스를 줄일수있다.
=> 서버가 추가 되거나 제거 되어도 서버 각각 재배치가 일어나지 않고 몇개의 키만 옮기게 되므로 최소화한다.
데이터 균등 분배가 중요한 경우
- 안정 해시는 특정 키가 특정 노드로 매핑되므로, 해시 충돌이 적고 데이터가 고르게 분포됨
- 가상 노드 개념을 도입하면 더욱 균등한 분배 가능
안정해시가 최선이 아닐수도 있는 경우
관계형 데이터 베이스의 샤딩
- RDBMS는 조인 연산이 많기 때문에, 안정 해시 기반 샤딩은 샤드간 데이터 효율적으로 조인하는데 어려움
- 안정해시 보단 범위 기반 샤딩, 동적 파티셔닝 같은 방법을 고려
데이터 핫스팟 문제
- 특정 키가 특정 노드로 집중될 위험이 있다.
- 일부 키는 너무 자주 접근되는데, 특정 노드에 몰리면 성능이 저하될수 있음
- 가상 노드 활용 또는 키를 더 고르게 분산하는 해시 알고리즘 적용.