MongoDB - NoSQL 이란

BIC DATA/MongoDB 2014. 2. 10. 18:10

MongoDB는 NoSQL이다.


NoSQL 이란? NoSQL은 "Not Only SQL" 이라고도 불린다. )

우리가 익숙하게 사용하고있는 RDBMS 형태의 관계형 데이터베이스가 아닌 다른 형태의 데이터 저장 기술을 의미한다. 

제품에 따라 각기 그 특성이 매우 달라서 NoSQL을 하나의 제품군으로 정의할 수는 없다.


NoSQL 제품군이 RDBMS와의 다른 점으로는 

  1. 스키마가 없다. 즉, 데이터 관계와 정해진 규격 ( table - column 의 정의 )이 없다.
  2. 관계정의가 없으니 Join이 불가능 하다. ( 하지만 reference와 같은 기능으로 비슷하게 구현은 가능하다. ) 
  3. 트랜잭션을 지원하지 않는다. 
  4. 분산처리 (수평적 확장)의 쉽게 제공한다. 
    ( 대부분의 NoSQL DB는 분산처리기능을 목적으로 나왔기 때문에 분산처리 기능을 자체 프레임워크에 포함하고 있다 )

* 트랜젝션과 JOIN 기능은 분산 시스템에서 효율적으로 제공하기 어렵기 때문에 제외 되었으며, 높은 확장성을 제공하는 아키텍처를 위한 결정이다. 


등이 있다. 

그리고 위의 내용들은 어느것이 장점이다 단점이다 말하기는 힘들다. 이유는 용도에 따라 장단점이 달라지기 때문이고 NoSQL이 RDBMS의 대안은 아니라는 것이다. 

그리고 NoSQL은 대부분이 오픈 소스이기에 잘 판단하고 사용해야 한다.


그럼 NoSQL은 왜 등장하게 되었을까?

빅 데이터 시대를 맞이하여 서비스를 제공하는 시스템에서 많은 양의 데이터를 효율적으로 처리가 필요하게 되었다.

이로인해 데이터의 분산처리( 샤딩 ), 빠른 쓰기 및 데이터의 안정성 ( 복제 )

즉 분산형 구조를 통해 데이터를 여러 대의 서버에 분산해 저장하고, 분산 시에 데이터를 상호 복제해 특정 서버에 장애가 발생했을 때에도 데이터 유실이나 서비스 중지가 없는 형태의 구조다.



MongoDB : NoSQL 중 Document DataBase인 DB

Document 타입은 MS 워드와 같은 문서를 이야기하는 것이 아니라 XML, JSON, YAML과 같이 구조화된 데이터 타입으로, 복잡한 계층 구조를 표현할 수 있는 구조라는 것이다.

이러한 구조는 RDB보다 직관적인 데이터 모델을 갖는다. ( 객체와의 매핑도 용이하다. )


MongoDB는 C++로 작성되어 있으며 JSON의 2진 버전인 BSON을 사용하여 key value를 쌍으로 데이터를 유지하는 JSON 형태의 문서에 데이터를 저장한다.

또한 높은 읽기/쓰기 효율과 자동 장애조치(복제기능)를 통한 확장(수평적 확장)의 용이성을 염두해두고 만들어 졌다. 

필자 생각 : 여기서 높은 읽기 쓰기 라고 적었는데. 쓰기의 효율은 밑에도 설명하겠지만 우선 메모리에 쓰기 때문이고,  읽기의 효율은 어려운 Join Query와 같은 것이 없는 단순성을 말하는 것으로 생각된다. )



 MongoDB 특징

1. 도큐먼트 지향 데이터 베이스

 { 

    _id:ObjectID('4bd9e8e17cefd644108961bb'), 

    title: 'Adventures in Databases',

    url: 'http://example.com/databases.txt',

    author: 'msmith',

    vote_count: 20,

   

    tags: ['databases', 'mongodb', 'indexing'],

   

    image:{

        url: 'http://example.com/db.jpg',

        caption: '',

        type: 'jpg',

      size: 75381,

        data:"Binary"

    },


    comments:[

        { user: 'bjones', text: 'Interesting article!' },

        user: 'blogger',text: 'Another related article is at http://example.com/db/db.txt' },

    ]

}

<도큐먼트 데이터베이스 구조>

위의 도큐먼트 데이터베이스 구조를 RDBMS에서는 적어도 4개의 table이 만들어져 관계를 형성하고 있었을 것이다.

또 각 테이블달 datatype을 정의하고 정규화를 진행했을 것이다. 


도큐먼트 지향적인 데이터 모델에서는 오브젝트를 자연스럽게 모아놓은 형태로 표현함으로 객체를 전체적으로 작업할 수 있다는 장점이다.

필자 생각 : 객체를 전체적으로 작업할수 있다는 것은 객체화가 쉽고 하나의 객체로 모든 작업을 할수 있다는 이야기를 하는것 같다. )

가변적으로 속성을 표현할수 있다 ( 위의 표에서 어느 데이터에서는 이미지가 없어도 되고 있어도 된다. )


다시한번 위의표를 보고 알수있는 도큐먼트 지향 데이터베이스의 특징은 다음과 같다.

  1. 첫째. 정해진 규격이 없다. ( 유연하다. )
    미리 정해진 스키마가 없다. 이것의 장점은 데이터베이스가 아닌 애플리케이션이 데이터 구조를 정한다는 것이다.(애플리케이션에 집중할수 있다.)
    데이터 설계가 빈번히 바뀌는 초기 단계에서 개발 속도를 단축 시킨다. 
  2. 개발자에게 익숙한 JSON 형태이다.
    RDB처럼 table의 정규화가 없이 하나의 database collection(table)으로도 모든 데이터를 저장 할 수 있다.

2. 애드혹 질의 (ad hoc query) - 임의의 필드 질의
RDB의 일반적인 SQL Query를 말하며, 문법은 다르지만 MongoDB도 질의어를 제공하고 있다.

MongoDB는 범위 질의, 정규식 검색, 정확 일치, 다른 특별한 질의 형식을 제공한다. 질의에서는 Javascript로 만들어진 사용자 정의 함수도 사용할 수 있다. 


3. 세컨더리 인덱스
MongoDB에서는 여러 개의 세컨더리 인덱스를 가지고 다양한 질의어를 최적화할 수 있다.
한 컬렉션에 64개까지 만들수 있으며, 오름차순, 역순, 고유, 복합 키, 지리공간적 인덱스도 가능하다.

4. 복제 ( 복제셋 )
몽고 디비의 복제셋은 서버와 네트워크 장애시 중복성과 자동 장애조치를 위해 데이터를 여러 대의 서버에 분산해서 관리한다. 
복제 셋은 하나의 프라이머리와 여러개의 세컨더리로 존제 한다. 

5. 속도(데이터 저장속도)와 내구성(디스크에 제대로 저장이 되었는지)

데이터베이 시스템에는 쓰기속도와 내구성 사이에 역 관계가 존재한다.

MongoDB는 쓰기의 속도에 강점이 있다. 이는 메모리에 데이터들을 먼저 저장한 후 뒤에서 스레드로 해당 데이터를 데이터베이스에 저장 하기 때문이다.

이는 메모리에 저장된 데이터들이 데이터베이스에 저장되기 전에 셧다운 되면 데이터를 잃을수 있는 단점이 있지만 해결 방안이 있다.

MongoDB 2.0 부터 저널링이 사용 가능 상태로 기본 설정 되어있다. 

저널링은 모든 쓰기에 대해 로그를 기록한다.

쓰기부하에 대한 성능을 향상시키기 위해 저널링을 하지 않은 채 서버를 실행 할수 있다. 


6. 확장

대부분의 데이터베이스 시스템에서 확장을 위한 가장 쉬운 방법은 하드웨어를 업그레이드하는 것이다. (수직적 확장 , 상향식 확장 이라고 한다.)

수직적확장은 간단하고 신뢰할만 하며 비용이 절감되는 장점은 있으나 한계가 있다.

MongoDB는 수평적 확장(데이터베이스를 여러대의 서버에 분산시키는 것)을 제공하여 이를 기본 기능으로 제공한다 (자동 샤딩)



끝으로 MongoDB가 다른 NoSQL 데이터베이스와 다른점은 쿼리가 매우 쉽게 변하기 때문에 관계형 데이터베이스를 MongoDB로 쉽게 변환할수 있는 강력한 문서지향 쿼리 언어이기 때문이다.




참고자료


[1] 월간 마이크로소프트웨어 2013년 3월호 - 조대협

NoSQL이란 무엇인가?

http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=42440


[2]OUTSIDER'S DEV STORY Blog - outsider

NoSQL에 대해서 #1

http://blog.outsider.ne.kr/519


[3]우승이의 블로그

NoSQL – 도대체 어떻게 선택해야 할까?

http://kimws.wordpress.com/2012/02/26/nosql-%EB%8F%84%EB%8C%80%EC%B2%B4-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%84%A0%ED%83%9D%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C/



출처 - http://jabsiri.tistory.com/76

: