본문 바로가기

DB/ETC

NoSQL 정의 특성

No SQL? Not Only SQL?

NoSQL은 관계형 데이터베이스의 한계를 극복하기 위한 데이터 저장소의 새로운 형태로 수평적 확장성을 특징으로 한다.
관계형이 아니기 때문에 join이 없고 고정된 스키마를 갖지 않는다.

대표적인 NoSQL 제품은 Google의 BigTable, Amazon의 Dynamo이 있고, 이외에 비롯해 다양한 오픈소스 제품이 소개되어 있다.
(BigTable, Dynamo, Cassandra, CouchDB, MongoDB, Hbase, Riak, Voldemort 등)

구글의 BigTable paper에 보면 구글의 BigTable이 대체 무엇인지에 대해 간단하고 명료하게 기술하고 있다.
A Bigtable is a sparse, distributed, persistent multidimensional sorted map.



Why NoSQL?

데이터 규모의 확대

웹 서비스의 구조 변화

 

CAP이란?

Availability와 Partition tolerance가 추상적 정의만으로 이해가 힘들 수 있어서 설명을 추가합니다. (용어 때문에 오히려 이해가 어려울 수 있는데 둘 다 파티션에 대한 특성으로 접근해야 합니다.) Availability and Partition Tolerance 글과 댓글을 참고하면 A, P에 대한 정의 및 기능이 좀 더 이해가 쉬울 수 있습니다.

 

CAP 이론과 NoSQL

데이터 저장소는 CAP 중에서 2가지만 선택할 수 있다. 예를 들어 RDB는 CA에 특화되어 있기 때문에 분산 환경에 적용이 어렵다.
NoSQL 제품은 CAP 중에서 C 또는 A를 일부 포기함으로써 분산 확장이 가능하다. 일반적으로 NoSQL 시스템은 관계형을 포기하거나 트랜잭션 구조를 느슨하게 함으로써 수평 확장이 가능하도록 한다.



Map이다
이게 정말 핵심중의 핵심이다. 이것만 이해해도 상당히 많은 기본개념을 이해한거라 나는 생각한다. 바쁘면 이제 이 글의 나머지를 안 읽어도 된다(^^). 거의 모든 noSQL은 Map이다. 즉, 유일한 키와 그것에 관련된 하나의 값을 가진 자료형이 noSQL이 데이타를 저장하는 기본적인 방식이다. JSON방식으로 예를 들면 다음과 같은 형태로 noSQL은 자료를 저장한다.

{
 "zzzzz" : "woot",
 "xyz" : "hello",
 "aaaab" : "world",
 "1" : "x",
 "aaaaa" : "y"
}



영구적이다 (Persistence)
noSQL은 기본적으로 데이타베이스의 역할을 수행한다. 당연히 데이타는 어느 정도 이상은 영구적이어야한다. 다만 메모리기반의 noSQL의 경우 이 영구적인 특성이 조금 떨어진다고 볼수도 있겠다.

분산기반이다 (Distribute)

noSQL이 나온 배경중의 하나는 기존의 RDB가 데이터 확장에 따른 확장성에 제약이 심했기 때문이다. 따라서 대부분의 noSQL은 데이터 저장 및 복제에 대해 설계 초기부터 분산시스템을 기반에 두게 되었다. 구글의 BigTable의 경우 Google File System(GFS)을 기반으로 하고, HBase를 비롯한 많은 noSQL은 하둡(Hadoop)의 분산 파일 시스템(HDFS)을 사용한다.
데이타 복제와 분산처리를 어떻게 하는지 자체에 대한 것은 사실 noSQL 기본 개념과는 큰 상관이 없는 주제이므로, 그리고 나도 사실 그쪽에는 내공이 딸리므로 넘어가자.

정렬기능이 있다 (Sorted)

모든 noSQL이 이 기능을 가지고 있다는 게 아니라 HBase, BigTable같은 일부가 가지고 있는 기능이다. 키와 값이 알파벳순으로 정렬이 되는 기능을 가진다. 실로 어마어마한 데이타를 처리하기 위한 용도로 만들어진게 noSQL이다보니 이런 정렬기능은, 혹은 이런 정렬기능의 성능은 너무나도 중요한 요소이다.

다차원적이다 (Multidimentional)

noSQL의 개념이 기존 데이타베이스에 익숙한 사람들에게 전달되기 위해 많은 noSQL기술들이 기존의 개념을 많이 차용한다. 테이블이나 칼럼 혹은 Row같은 RDB의 개념이 그대로 noSQL에서도 쓰이는 경우가 있고 이로 인해 noSQL의 이해를 어렵게 하는 경우가 있다. 새술은 새푸대에 담았으면 싶다. 그래서 다차원적인 Map을 지원하는게 noSQL의 특징이라고 강조하고 싶다. 다차원적이라는 말이 어렵다면 Map의 Map을 지원한다라고 할까? 즉,

{
 "1" : {
 "A" : "x",
 "B" : "z" },
 "aaaaa" : {
  "A" : "y",
  "B" : "w" 
}
,
 "aaaab" : {
  "A" : "world",
  "B" : "ocean" 
},
 "xyz" : {
 "A" : "hello",
  "B" : "there" 
},
 "zzzzz" : {
 "A" : "woot",
 "B" : "1337" 
}
}

위의 코드와 같이 Map의 Map의 형태로 데이터를 저장하는 것이 가능하다. 이 특성을 이용해서 "1"이나 "aaaa"를 row에 대한 키로 정의하고 "A"나 "B"를 column의 키로 정의하는 것이 가능하고 전체를 하나의 테이블로 정의할수도 있겠다.

엉성하다 (Sparse)
noSQL의 데이타 모델의 특징은 엉성하다는데 있기도 하다. 기존 RDB가 명확한 데이타 스키마 기반으로 데이타를 처리하고 그 스키마를 변경하는데 많은 비용이 들었다면, noSQL의 경우는 그보다 훨씬 더 데이타 모델에 대해 유연성을 제공한다.

{ // ...
 "zzzzz" : 
{
 "A" : 
{
 
"catch_phrase" : "woot"
}
  }
}

위의 예처럼, "zzzz" Row의 "A"칼럼은 이제까지 없었던 "catch_phrase"라는 키를 가지고 있다. 이처럼 noSQL은 데이타 모델에 대해 훨씬 더 유연한 특성을 가지고 있다.


# 참조

  1. noSQL의 기본 개념 정리: 
    http://jimbojw.com/wiki/index.php?title=Understanding_Hbase_and_BigTable
    http://calmglow.egloos.com/4580668
  2. noSQL의 정의와 사례 정리:
    http://fantazic.com/archives/517 



'DB > ETC' 카테고리의 다른 글

데이터베이스 정규화  (2) 2014.02.21
Intent Lock  (0) 2014.02.21
트랜잭션 ACID  (0) 2014.02.21