0. 들어가며


카산드라나 몽고디비 같은 분산 DB를 사용하면 노드를 추가하거나 삭제하게 되는 경우가 있는데 이 때 단순하게 프로세스 하나 실행해서 추가 및 삭제를 하면 짜잔 되는것이 아니다. 예를 들어 3대의 노드가 있는 DB 클러스터에 노드 1대를 추가한다고 해보자. 그러면 아래와 같은 일들을 해줘야 한다.

  1. 새 노드가 어떤 데이터를 가져갈지 정하기
  2. 기존 노드 → 새 노드로 데이터 전송
  3. 데이터 전송 중에도 read/write 요청 계속 처리
  4. 데이터 전송 끝난 이후 기존 노드에 남아있는 불필요한 데이터 정리

이 과정을 Rebalancing 이라고 한다.

Rebalancing은 데이터를 골고루 다시 나누는 작업임과 동시에 어떤 데이터 범위를 누가 담당할지에 대한 Ownership을 바꾸는 작업이다.

이번 글에서는 먼저 간단한 예제로 rebalancing이 왜 필요한지 살펴보고, 대표적인 분산 DB인 Cassandra와 MongoDB가 각각 이 문제를 어떻게 풀고 있는지 정리해본다.

1. 예제로 먼저 리밸런싱에 대해 이해해보자


가장 단순하게 생각해서 데이터가 key 기준으로 0~99까지 있다고 해보자.

처음에는 노드가 3대이다.

Node A: 0  ~ 32
Node B: 33 ~ 65
Node C: 66 ~ 99

여기에 Node D를 추가한다면 어떻게 해야할까? 기존 데이터들 중 일부를 Node D로 적절히 옮겨야하는데..

이 때 가장 생각하기 쉬운 방법은 전체 데이터를 공평하게 N 등분하여 다시 나누는 것이다.

Node A: 0  ~ 24
Node B: 25 ~ 49
Node C: 50 ~ 74
Node D: 75 ~ 99

이렇게 하면 노드 당 데이터 분포의 측면에서는 가장 좋지만, 실제 운영 중인 DB에 이런 작업을 하면 부담이 너무 크다. 모든 key의 위치를 다시 계산하고, 많은 데이터를 동시에 옮겨야 하며, 그동안 들어오는 요청도 계속 처리해야 하기 때문이다.