왜 Consistent Hashing 인가?

maketheworldwise·2022년 8월 12일
0


이 글의 목적?

최근 공부하는 내용 중에는 Consistent Hashing이라는 녀석이 있었다. Consistent Hashing은 요청을 더 효율적으로 서버에 균등하게 분배하기 위한 기술이라고 하는데 왜 등장했고 어떤 부분에서 효율적인지 정리해보자.

Hashing

이전에 Hash? Hash Table? HashCode? 라는 글을 정리했었는데, 그와 동일한 개념이라고 보면 된다. 이 글에서는 가장 대표적인 해시 함수인 모듈로 함수로 Consistent Hashing의 등장 배경을 정리했다.

모듈로 함수는 쉽게 말해 서버의 개수를 이용해 계산한다고 생각하면 된다.

serverIndex = hash(key) % N (Server 개수)

단, 이 모듈로 연산에는 치명적인 단점이 존재한다. 서버의 개수가 고정되어있을 경우에는 문제가 없지만, 서버가 추가되거나 삭제될 경우 어떻게 되는가? 연산의 결과는 달라질 것이고 그에 따라 해시 대상들은 재분배해야하는 상황이 발생한다. 즉, 확장성이 떨어진다는 것이다!

이 과정을 이해하기 위해 내가 참고한 영상들을 확인해보면 손쉽게 이해할 수 있다.

우아한 테크 세미나 영상에서는 직접 움직이면서 과정을 살펴보았다. 그리고 데이터의 50% 이상이 재분배가 일어나는 것을 설명했다.

우아한 테그 세미나 영상도 도움이 되었지만, 개인적으로는 내가 찾은 영상이 더 이해하기 쉬웠다.

내가 참고한 영상에서는 4개의 서버가 있을 때, 요청을 모듈로 연산으로 분배하는 과정을 예시로 설명했다.

그리고 새로운 서버가 추가 되었을 때 모듈로 연산의 결과가 달라져 문제가 발생하는 것을 보여주었다.

모듈로 연산의 결과가 달라짐으로서 발생하는 가장 치명적인 단점으로는 쿠키와 세션을 생각할 수 있다. 예를 들어, 특정 요청이 항상 첫 번째 서버로 전달되었는데, 서버가 새로 추가되고 모듈로의 연산의 결과가 달라지면서 해당 요청이 세 번째 서버로 전달되었을 때 문제가 발생한다. 바로 첫 번째 서버에 로그인을 해놓았는데 세 번째 서버로 전달되면서 다시 로그인을 해야하는 문제가 발생한다는 것이다!

Consistent Hashing

위의 재분배로 발생하는 비효율적인 문제를 보완하기 위한 기술이 바로 Consistent Hashing이다. 어떻게 문제를 해결했는지 살펴보자.

Consistent Hashing의 기본 형태는 링(Hash Ring)이다. 내가 시청한 유튜브 영상에 따르면 다음과 같은 순서로 진행된다.

  1. 0부터 n-1까지의 숫자를 균일하게 링 위에 매핑
  2. 각 서버의 키 값과 해시 함수로 해시 코드를 얻어내고, 결과값을 링 위에 배치
  3. 유저가 던지는 요청도 해시 함수를 거쳐 해시 코드를 얻어내어 링 위에 배치
  4. 서버의 위치를 기준으로 반시계 방향에 있는 요청을 해당 서버가 감당

이 구조를 이용하면 특정 서버가 추가되거나 삭제될 경우에 가장 최소의 데이터만 분배되는 형태로 이점을 챙길 수 있다.

여기서 생각해본 점! 확장성에 대한 이점은 분명히 가져올 수는 있지만, 특정 서버에 트래픽이 몰리는 단점이 있을 것 같은데 완벽한 설계라고는 할 수 있을까?

영상에서는 해시 함수를 여러 개 사용하여 서버들을 여러 군데에 매핑을 시키면, 트래픽이 한 서버에 몰리지 않고도 균등하게 분배를 할 수 있다고 했다. 이것도 나름 해결 방안일 수는 있지만, 일시적인 방안처럼 느껴졌다.

이 문제에 대해서 내가 여러 블로그의 글을 읽고 찾은 결과 - Virtual Node 혹은 복제(Replica) 를 이용한 방법으로 해결할 수 있다고 했다. 복제는 읽기용 레플리카 서버를 구성하여 트래픽을 분산하는 방법이고 이미 많은 레퍼런스가 있으므로 생략하고, 생소한 Virtual Node를 정리해보자.

Virtual Node는 생각했던 것 보다 굉장히 단순하다.

먼저 각 서버별로 가상의 노드를 만들어 무작위로 링 위에 배치시킨다. (내가 참고한 레퍼런스는 3개의 서버에서 각각 6개의 가상 노드를 만들어 무작위로 배치했다고 생각하면 된다!)

그리고 요청이 들어왔을 때, 해당 요청의 해시 값 이상에 제일 가까운 노드에 배치하여 더 다양하고 비정형화된 규칙으로 처리하는 방법이다.

이번에 Consistent Hashing에 대해서 알아보았지만 실제로 내가 이 기술을 사용할 수 있을지는 잘 모르겠다. 지금은 해당 기술이 어떤 기술인지, 왜 등장했는지를 이해한 것으로 만족하고 나중에 잘 활용하게 되었을 때 추가적으로 정리해보자! 🫠

이 글의 레퍼런스

profile
세상을 현명하게 이끌어갈 나의 성장 일기 📓

0개의 댓글