샤딩 시스템 개요

Pinterest

글 : 이승용

데이터베이스에 저장하는 데이터의 규모가 대용량이 되면서, 기존에 사용하는 데이터베이스 시스템의 용량의 한계를 맞이하게 된다. 이러한 시점에서 관리자는 시스템 업그레이드를 고려한다. 흔히 말하는 시스템 업그레이드란 장비를 고 사양으로 전환하여 기존 시스템의 처리 용량을 증대시키는 것을 말한다. 이를 Scale-Up이라고 한다.

Scale-Up은 기존 사용하는 장비의 업그레이드이기 때문에, 기존 장비 사양에 따라 증설 계획이 결정된다. 하지만, 일반적으로 데이터베이스 장비는 구매 당시, 시스템 안정성을 고려하여 가장 우수한 성능의 시스템으로 구매한다. 이러한 장비를 다시 고 사양으로 업그레이드한다는 것은 장비 하나를 더 추가하는 것보다 비싼 대가를 치르게 된다.

그렇다면, 비용대비 기존 장비를 어떻게 활용하는 것이 대용량 데이터베이스를 저장하는 방법일까? 이러한 문제점을 해결하기 위해 데이터베이스 시스템은 소프트웨어적으로 데이터베이스를 분산시켜 처리할 수 있는 구조를 만들었다. 이러한 기술 중 하나가 샤딩sharding이다. 샤딩은 데이터베이스가 저장하고 있는 테이블을 테이블 단위로 분리하는 방법과 테이블 자체를 분할하는 방법으로 나누어진다.

여기서, 우리가 기존에 사용하던 데이터베이스에 총 5개의 테이블이 저장되어 있다고 가정하자. 그리고, 5개의 테이블에 대용량 데이터가 몰려 시스템 사양을 초과하여, 이를 샤딩하기 위해 한 대의 테이터베이스 시스템을 2대로 증설한다고 가정하자. 이와 같을 경우, 전자의 경우인 테이블 단위로 분리하는 방법은 총 5개의 테이블에서 첫 번째 장비에는 테이블 3개, 두 번째 장비에는 테이블 2개로 분리하는 것을 말하고, 후자의 경우인 테이블 자체를 분할하는 방법은 총 5개의 테이블을 모두 반반씩 쪼개어 두 개의 장비에 나누어 저장하는 방법을 말한다. [그림 4-1]의 (a)는 테이블 단위로 분리하는 방법을 (b)는 테이블 자체를 분할하는 방법에 대해서 보여준다.

 

 

[그림 4-1]

 

[그림 4-1]과 같이 한 곳에 저장되어있던 테이블을 두 개 이상의 샤드shard[1] 테이터를 분리하는 경우, 테이터베이스 시스템은 사용자 질의에 따라 검색되어야 할 데이터가 어느 샤드에 있는지 위치 정보를 관리하는 모듈이 필요하다. 이러한 샤딩된 데이터의 위치 정보를 관리하는 모듈을 중개자broker라 하며, 질의를 분석하여 샤드를 선택하고, 응답에 대한 결과를 전달하는 역할을 담당한다. [그림 4-2]은 샤딩 시스템의 구조를 보여준다.

샤딩 시스템은 [그림 4-2]와 같이 크게 3 계층으로 – 응용계층, 중개자 계층, 데이터(서버 또는 샤드) 계층 – 으로 구성된다. 응용계층은 데이터에 접근하기 위해 중개자를 통해 모든 데이터 입출력을 진행한다. 따라서 응용은 샤딩된 데이터베이스 시스템의 자세한 구조를 알 필요 없이 마치 잘 추상화된 한 개의 데이터베이스가 존재하는 것처럼 응용 계층은 느끼게 된다. 데이터 계층은 여러 개의 샤드(또는 서버)들로 구성되며, 각각의 샤드는 일반 데이터베이스 시스템과 동일한 역할을 담당한다. 가운데 있는 중개자 계층은 샤딩 시스템의 가장 핵심적인 부분으로 샤드 메타 정보shard meta data를 저장하여 중개자로부터 전달된 질의를 분석하여 적절한 샤드에 명령을 수행하여 그 결과를 응용에 전달한다.

 

[그림 4-2]

 

중개자 계층이 저장하는 샤드 메타 정보는 분할을 결정하는 정책에 따라 다음과 같이 분류된다.

  • 형태에 따른 분류

형태에 따른 분류는 [그림 4-1]과 같이 테이블 자체가 분할되기 때문에 데이터 유형에 따라 저장될 테이블을 분류하는 방법이다. 이러한 분류 방법은 테이블이 분할되지 않기 때문에 테이블간 독립성이 보장된 쿼리에서 높은 성능을 보장한다. 예를 들어, 저장 매체에 따른 분류로 텍스트, 사운드, 동영상과 같이 테이블을 분류하는 방법 또는 사용자 아이디별로 분류하여 테이블을 분류하는 방법 등이 있다.

  •  키 기반 분류

샤딩 시스템에서 가장 많이 사용하는 방법 중 하나로 테이블의 특정 필드를 기준으로 필드 값의 범위에 따라 샤드를 결정하는 방법이다. 보통 범위를 결정하는 필드를 샤드 키shard key라고 하며, 샤드 키의 분할 범위는 샤드 키의 전체 데이터 개수에 따라 자동으로 설정 또는 사용자가 설정하는 방법으로 나누어진다. 전자와 같이 자동으로 분할 범워를 결정하는 것을 자동 샤딩auto sharding이라고 하며, 후자와 같이 사용자가 설정하는 방법을 수동 샤딩manual sharding이라고 한다.

  •  Look-up 테이블 기반 분류

키 기반 분류 방법의 단점은 특정 영역으로 데이터 값이 몰릴 경우에 분할되기 전, 특정 샤드에 데이터가 집중되는 문제점을 가진다. 즉 데이터가 특정 샤드에 몰릴 경우에 해당 샤드는 부하가 발생되어 전체 시스템의 성능을 떨어뜨리는 결과를 초래한다. 또한 샤드가 한 쪽 범위에서 발생되기 때문에 잘못된 샤드 키 설정으로 인한 전체 시스템 성능이 개선되지 않는 문제점을 가지고 있다. 이러한 단점을 해결하기 위해 해쉬 기법을 도입하여 샤드 키 자체를 분할하기 보다 입력된 샤드 키의 해쉬 값을 통한 분할 정책을 사용한다. 샤드 키의 해쉬 값은 랜덤 하게 균등 분배되어 특정 샤드 범위에 데이터가 몰리더라도 균등 분배되는 장점이 있다.

위에서 논한 세가지 샤드 전략이 각각 장단점을 모두 내포하기 때문에 어떤 전략을 사용하는가는 프로그래머에 의해 선택된다. 형태에 따른 분류는 독립된 쿼리가 보장되는 시스템에서 RDB를 분할하는 방법에 효과적이고, 키 기반 분류는 자동 샤딩 시스템에 잘 적용된다. 반면, look-up 테이블은 scale-out[2] 중심의 분산 데이터베이스에 적합한 구조이다.

 

다음글 : MongoDB의 샤딩

 


[1] 개별적 노드를 샤딩에서는 샤드라고 말한다.

[2] Scale-out은 scale-up과 동일한 개념이지만, scale-up이 한 장비에 대한 성능 향상을 통한 확장성 이라면, scale-out은 동일한 장비를 수평적으로 확장시킨 클러스터 구조의 확장이다.


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
  1. 감사합니다.
    18:54에 3월 26th, 2017 | #1

    좋은 정보 감사합니다.

  2. 익명
    23:06에 3월 3rd, 2018 | #2

    Nosql sharding 하고 rdbms하고 결합하면 좋은 컨셉의 제품이 탄생할거 같습니다.
    혹 노하우가 있으면 공개 가능하실런지요

  1. 엮인글들이 아직 없습니다.