ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Consistent Hashing (일관된 해싱): 데이터 분산의 핵심
    Tech Career/System designs 2025. 7. 31. 23:01
    반응형

    들어가며: 분산 시스템에서 데이터는 어떻게 '골고루' 분배될까?

    대규모 분산 시스템을 설계할 때 가장 중요한 과제 중 하나는 데이터나 요청을 여러 서버(노드)에 어떻게 효율적으로 분배할 것인가입니다. 단순히 hash(key) % N (N은 서버 개수)과 같은 모듈러 연산을 사용하면 되지 않을까 생각할 수 있습니다. 하지만 이 방식은 서버가 추가되거나 제거될 때 치명적인 문제점을 발생시킵니다. 서버 개수 N이 변하면 대부분의 키-서버 매핑이 바뀌어 대규모 데이터 재분배가 일어나고, 이는 곧 시스템 성능 저하와 장애로 이어질 수 있습니다.

    이러한 문제를 해결하기 위해 등장한 개념이 바로 Consistent Hashing (일관된 해싱)입니다. Consistent Hashing은 분산 시스템에서 노드가 추가되거나 제거될 때 영향을 받는 키-서버 매핑의 수를 최소화하여 재분배 오버헤드를 줄이는 혁신적인 방법입니다. Amazon Dynamo, Apache Cassandra, Memcached 등 수많은 대규모 분산 시스템에서 핵심적인 기술로 활용되고 있습니다.

    이번 포스팅에서는 Consistent Hashing이 왜 필요하고, 어떻게 작동하며, 실제 시스템에서 어떻게 활용되는지 자세히 살펴보겠습니다.


    1. 일반적인 해싱(Modulus Hashing)의 한계

    먼저, Consistent Hashing이 왜 필요한지 일반적인 해싱 방식의 문제점을 짚어보겠습니다.

    • 개념: server_index = hash(key) % N (N은 서버의 총 개수)
    • 문제점:
      • 노드 추가/제거 시 대규모 재분배: 만약 서버가 하나 추가되어 N이 N+1이 되거나, 서버 하나가 다운되어 N이 N-1이 되면, % N 연산의 결과가 대부분 달라집니다.
      • 결과: 기존에 매핑되어 있던 거의 모든 데이터(Key-Value 쌍)가 새로운 서버로 이동하거나, 다른 서버에 재요청되어야 합니다. 이는 네트워크 부하, 서버 부하, 그리고 심각한 성능 저하로 이어집니다.
      • 예시: 3대의 서버(S0, S1, S2)가 있을 때 키 'A'가 hash(A) % 3 = 1로 S1에 매핑되었다고 가정합시다. 서버 S3가 추가되어 4대가 되면, hash(A) % 4는 더 이상 1이 아닐 가능성이 매우 높습니다.

    2. Consistent Hashing의 기본 원리: 해시 링(Hash Ring)

    Consistent Hashing은 이러한 문제를 '해시 링(Hash Ring)'이라는 개념을 도입하여 해결합니다.

    • 2.1. 해시 링의 구성:
      • 해시 공간(예: 또는 크기의 범위)을 원형 링으로 매핑합니다. 이 링은 0부터 최대 해시 값까지 시계 방향으로 배열된 연속적인 구간을 나타냅니다.
      • 노드(서버)를 링에 배치: 각 서버(S0, S1, S2...)는 고유한 해시 값을 계산하여 이 링 위의 특정 지점에 배치됩니다. 보통 서버의 IP 주소나 이름을 해싱하여 배치합니다.
      • 키(데이터)를 링에 배치: 저장할 데이터의 키(Key)도 동일한 해시 함수를 사용하여 해시 값을 계산하고, 이 해시 값을 링 위의 특정 지점에 배치합니다.
    • 2.2. 키(데이터)의 매핑 방식:
      • 어떤 키에 해당하는 데이터가 어느 서버에 저장될지는, 해당 키의 해시 값으로부터 시계 방향으로 링을 따라가면서 처음 만나는 서버에 매핑됩니다.
      • 예시: 키 K1의 해시 값이 S0와 S1 사이에 있다면, K1은 시계 방향으로 가장 먼저 만나는 S1에 매핑됩니다.
    더보기

    값이 연속으로 존재할 수 있고, 반드시 링위의 어느 두 노드 사이에 존재하게 됨으로써 항상 고정된 노드에 맵핑이 가능해지는것이죠.

    물론 노드가 링에 추가 된다해도 재배치 역시 어렵지 않게 이루어 집니다. 항상 시계 방향으로 링위에서 처음 만나는 다음 서버에 배치 되므로 가장 가까운 노드(nearest next node)로 할당이 되는것이죠. (인접 노드가 변경이 없는 값들은 그대로 있으면 되므로 재분배 비용이 최소화)


    3. Consistent Hashing의 장점: 노드 변경 시 최소한의 재분배

    Consistent Hashing의 진정한 강점은 노드 추가/제거 시 드러납니다.

    • 3.1. 노드 추가 (예: S3 추가):
      • 새로운 노드 S3가 링 위의 특정 지점에 추가됩니다.
      • 이때 S3가 링에 추가되면서 S3 바로 이전(반시계 방향)에 있던 노드(예: S1)가 담당하던 키 중 일부만 S3로 재분배됩니다.
      • 다른 대부분의 노드(S0, S2)가 담당하던 키-서버 매핑은 그대로 유지됩니다. 이는 대규모 재분배가 발생하는 모듈러 해싱과 극명한 차이를 보입니다.
      • 장점: 전체 데이터의 1/N 정도만 재분배되므로, 시스템의 안정성과 성능에 미치는 영향이 최소화됩니다.
    • 3.2. 노드 제거 (예: S1 제거):
      • 노드 S1이 링에서 제거됩니다.
      • S1이 담당하던 모든 키들은 **S1 다음(시계 방향)에 있던 노드(예: S2)**가 인계받게 됩니다.
      • 마찬가지로 다른 노드(S0)가 담당하던 키-서버 매핑은 영향을 받지 않습니다.
      • 장점: 노드 제거 시에도 재분배의 범위가 최소화되어 시스템의 안정성을 유지합니다.

    4. Consistent Hashing의 실제 적용과 보완: 가상 노드 (Virtual Nodes)

    Consistent Hashing은 효율적이지만, 몇 가지 문제점과 그에 대한 보완책이 있습니다.

    • 4.1. 문제점:
      • 데이터 불균형 (Data Skew): 노드가 링에 불균일하게 배치되거나, 특정 해시 구간에 키가 집중되면 데이터가 특정 노드에 몰릴 수 있습니다. 이는 서버 간 부하 불균형으로 이어집니다.
      • 노드 추가/제거 시 불균형: 소수의 노드만 있을 경우, 노드가 하나 추가/제거될 때 재분배되는 양이 여전히 상대적으로 커서 불균형이 심화될 수 있습니다.
    • 4.2. 보완책: 가상 노드 (Virtual Nodes / Vnodes)
      • 개념: 실제 물리적인 각 서버를 링 위에 여러 개의 '가상 노드' 또는 '복제본'으로 표현합니다. 예를 들어, 3대의 물리 서버가 각각 100개의 가상 노드를 가지면 링 위에는 총 300개의 가상 노드가 분포하게 됩니다.
      • 장점:
        • 부하 분산 균일화: 가상 노드가 링에 더 고르게 분포하므로, 키들이 여러 물리 서버에 더 균일하게 분산되어 부하 균형이 향상됩니다.
        • 재분배 효율성 증가: 노드 추가/제거 시 영향을 받는 가상 노드의 수가 늘어나지만, 그만큼 더 작고 많은 단위로 데이터가 이동하므로 전체적인 재분배 효율성이 높아지고 오버헤드가 줄어듭니다.
        • 핫스팟(Hotspot) 완화: 특정 물리 노드가 특정 키 범위의 모든 부하를 받는 것을 방지합니다.
      • 대표적인 예시: Apache Cassandra, Amazon DynamoDB 등 많은 분산 데이터베이스 시스템에서 가상 노드 개념을 활용하여 데이터 분산 및 확장성을 관리합니다.

    5. Consistent Hashing의 활용 분야 및 트레이드오프

    Consistent Hashing은 다음과 같은 분야에서 널리 활용됩니다.

    • 분산 캐싱 시스템: Memcached, Redis Cluster 등에서 캐시 서버에 데이터를 분배하고 노드 장애 시 영향을 최소화합니다.
    • 분산 데이터베이스: Cassandra, DynamoDB 등에서 데이터를 물리적인 노드에 샤딩하고 복제본을 관리하는 데 사용됩니다.
    • 로드 밸런싱: 특정 세션이나 요청을 특정 서버에 고정적으로 매핑해야 할 때 사용될 수 있습니다.

    트레이드오프:

    • 장점: 노드 추가/제거 시 재분배 오버헤드 최소화, 높은 확장성가용성 확보.
    • 단점: 구현 복잡성 증가, 가상 노드 수가 적을 경우 부하 불균형 발생 가능성, 키 분포에 따른 핫스팟 발생 가능성.

    마치며: 분산 시스템 설계의 핵심 퍼즐 조각

    Consistent Hashing은 대규모 분산 시스템을 설계할 때 마주하는 데이터 분산 및 노드 관리 문제를 우아하게 해결하는 핵심적인 기술입니다. 단순한 해싱의 한계를 이해하고, 해시 링과 가상 노드라는 개념을 통해 어떻게 효율적인 확장이 가능한지 이해하는 것은 여러분의 시스템 설계 역량을 한층 더 높여줄 것입니다.

    다음 포스팅에서는 분산 시스템의 또 다른 중요한 구성 요소이자 면접 단골 질문인 'Key-Value Store (키-값 저장소)' 설계에 대해 깊이 있게 다뤄보겠습니다. 오늘 배운 Consistent Hashing이 Key-Value Store의 기반 기술로 어떻게 활용되는지 직접 확인하는 시간이 될 것입니다.

    궁금한 점이 있으시다면 언제든지 질문해 주십시오!

    반응형

    댓글

Designed by naubull2.