MongoDB 샤딩 개요

스케일링(scaling)

샤딩을 말하기 전에 먼저 스케일링에 대해 알아보겠다.

일반적인 스케일링을 말하자면, 시스템 규모가 커지면 스케일링(확장)이 필요하게 된다. 스케일링 방법은 크게 “수직 스케일링”, “수평 스케일링” 이렇게 2가지 종류로 나눈다.

수직 스케일링

수직 스케일링은 CPU나 RAM, 스토리지를 보다 고성능인 것으로 교체해 나가는 방법이다. 스케일링은 간단하지만, 애초에 CPU나 메모리에 한계가 있기 때문에 어느 정도로 성능 한계가 있다.

수평 스케일링

데이터 세트로 시스템 분할을 하여, 여러 개의 서버로부터 병렬로 처리하도록 하는 방법이다. 포괄적으로 성능은 수직 스케일링보다 날 수 있지만 스케일링 할수록 복잡성이 커지므로 관리가 어려워진다.

샤딩(sharding)이란?

샤딩이란, 데이터를 복수 서버에 분산시키는 “수평 스케일링” 구조이다.

샤딩을 하는 것으로 크게 3개의 이점(“읽고 쓰기 처리가 빠리진다 & 성능을 올리기 쉽다”, “스토리지가 증설하기 쉽다”, “가용성이 높다”)가 있다. 각각 자세한 내용은 아래에서 살펴 보겠다. MongoDB는 표준 기능으로 샤딩 수평 스케일링)을 지원한다.

읽기/쓰기

데이터를 샤드 클러스터에 분산하고 저장하면 읽기/쓰기 처리(파일 I/O)를 분산 처리할 수 있다. 파일 읽기/쓰기(파일 I/O)는 느린 처리이므로 이를 분산화함으로써 보다 빠른 읽기/쓰기를 할 수 있게 된다. 또, 읽고 쓰기의 부하가 오더라도 서버를 늘려 가는 것으로 수평 스케일링할 수 있다.

스토리지

샤드 클러스터에는 조각 데이터가 분산되어 저장된다. 데이터량이 늘어날 때에도 서버를 늘려서 수평 스케일링할 수 있다.

고가용성

샤드 클러스터에서는 부분 읽기 및 쓰기가 가능하다. 읽고 쓸 수 없으면 작업을 수행할 수 있는 샤드 서버에서 가져올 수도 있다.

샤드 클러스터

MongoDB의 샤딩은 다음 3가지 구성 요소(샤드, 라우터, 구성 서버)로 구성된다. 각각의 관계와 설명은 다음과 같다.

샤드

샤드 서버에는 컬렉션을 분할한 조각 데이터(청크)를 저장한다. 샤드 서버는 복제 세트로 구성될 수 있다.

라우터

mongos는 쿼리 라우터로 애플리케이션에서 샤드 클러스터로의 인터페이스를 제공한다. 샤드 클러스터에 액세스할 때는 항상 mongos 경유로 액세스한다. 샤드화되어 있지 않은 컬렉션이어도 반드시 mongos 경유하여 액세스 한다.

구성 서버

샤드 클러스터 설정에 대한 메타데이터를 저장한다. 어떤 샤드 서버에 데이터가 있는지 등도 이 서버에 저장된다. MongoDB 3.4 이상부터는 구성 서버를 레프리카셋으로 구성한다.

샤드 키

“샤드 키"란, 데이터를 분산해 샤드 서버에 보존할 때에 키로서 이용하는 정보를 말한다. MongoDB는 “샤드 키"를 사용하여 컬렉션 내 문서 분산을 수행한다.

다음 그림은 x샤드 키로 분산된 간단한 예이다.

… 그림 …

“샤드 키"에 대한 포인트는 아래 3자지디다.

  • 모든 문서에 존재하는 불변의 필드 또는 필드군으로 구성한다.
  • 일단 샤드 키를 결정하고 분산을 수행되면, 샤드 키를 다시 변경할 수 없다.
  • 샤딩할 컬렉션에는 샤드 키가 포함된 인덱스가 필요하다.

물론 샤드 키의 선택에 의해 성능, 효율, 확장성에 큰 영향을 주는 것은 말할 필요도 없다. 샤드 키 선택이 부적절하다면 위에서 설명한 대로 샤드 서버에 편향이 발생하여 비효율적인 동작이 발생할 수 있다.

청크

앞서 언급했듯이 MongoDB는 “샤드 키"값으로 데이터 저장을 분산하지만,이 때 “청크"라는 덩어리마다 그룹화하여 샤드 서버에 분산 저장한다. MongoDB는 자동으로 “청크"가 샤드 클러스터 내에서 균형있게 분산되도록 이동한다.

청크로 분할 및 그것을 각 샤드에 분산 보존하는 이미지는 아래와 같다.

… 그림 …

샤드 데이터에 대한 조작 제약

샤딩된 데이터(샤드 데이터)에 대한 조작에는 몇 가지 제한사항이 있다.

  • group 명령을 사용할 수 없다.
  • 대신 aggregate 없이 MapReduce 를 이용한다.
  • updateOne 또는 _iddeleteOne 를 지정해야 한다.
  • 샤드 키 _id가 포함되어 있지 않으면 오류가 발생한다.
  • 샤딩한 컬렉션에는 독특한 인덱스가 필요하다.

샤드 컬렉션 및 비샤드 컬렉션

MongoDB에서는 샤드화하는 컬렉션과 샤드화하지 않는 컬렉션을 혼합할 수 있다. 샤드화할 컬렉션은 샤드 클러스터에 분산되어 저장되지만 샤드되지 않은 컬렉션은 기본 샤드에 저장된다.

데이터 분산 방법

샤드화할 때의 분산 방법은 “해시 샤드"와 “레인지 샤드"의 2가지가 있다.

해시 샤드

샤드 키의 해시 값을 이용하여 데이터 분산을 수행한다. 해시를 이용한 샤드의 경우, 샤드 키의 값이 가까워져도 청크가 엉망이 되기 쉬운 특징이 있다. 즉, 샤드 키가 단조 변화하는 경우에 분산화하기 쉬운 분산화 방법이다. 반대로 데이터가 분산되기 쉽기 때문에, 데이터 구조나 취득 방법에 따라서는 브로드캐스트 조작이 늘어날 우려도 있다.

레인지 샤드

샤드 키 범위에 따라 데이터 분산을 수행힌다. 해시 샤드와 달리, 샤드 키의 값이 가까우면 같은 청크 상에 존재할 가능성이 높아지는 분산화 방법이다. 샤드키의 선정이 부적절하다면 모처럼 샤드라는 분산화 기술을 이용하려고 하는데도 특정 서버에 부하가 치우쳐 버릴 우려가 있다.