몽고 DB

I. 현대 웹을 위한 다큐먼트 데이터베이스, 몽고 DB의 개요

가. 몽고 DB의 핵심 아이디어

  • 플랫폼을 위해 개발 : 데이터베이스가 여러대의 서버에 걸쳐 점차로 확장할 수 있어야 한다는 것을 의미함
  • 웹 어플리케이션의 데이터 저장 시스템: 일차적 데이터 자정 시스템으로서 수평적으로 확장가능하록 설계 되었음

 

나. 몽고 DB 를 사용하는 이유

  • 용도관점 :  웹 애플리케이션 분석과 로깅 애플리케이셔 중간 정도의 캐시를 필요로 하는 애플리케이션에서 일차 데이터저장 시스템에 적합
  • 스키마가 존재하지 않는 데이터를 저장하기에 용이하여 미리 구조가 알려지지 않은 데이터를 저장하는데 유용

 

다. 몽고 DB의 특징

특징

설명

Documented-oriented DB

컬럼의 명시가 되어있지 않고 하나의 안에 들어가는 내용을 아주 유연하게 (key,value) 담을 수 있는 계층 구조

Schema-free

스키마 정의가 필요없다

Easy Scaling(확장성)

Auto-sharding 방식을 제공함, 클라우드 환경에서의 확장성 만족

HA(안전성)

Master/slave방식 제공, replica-set 방식 제공, auto-sharding 방식과 혼합하여 구성할 경우 band-width, 트래픽 분산의 이점이 있음

 

II. Document-oriented DB, 몽고 DB의 핵심 기능

가. 다큐먼트 데이터 모델

  • 도큐먼트 지향적 데이터 베이스임
  • 오브젝트의 컬렉션형태로 표현함으로써 객체를 전체적으로 작업함
  • 도큐멘트는 미리 정해진 스키마가 없음
  • Application 이 데이터 구조를 정함

  • 속성의 이름과 값으로 이루어진 쌍의 집합
  • 속성값 : 문자열/숫자/날짜와 같이 간단한 데이터타입/배열/다큐먼트도 가능
  • 구성요소를 하나의 도큐먼트로 다양한 구조의 데이터로 표현
  • 태그/Comment를 배열로 저장 함

 

[관계형 데이터베이스]

  • 정규화, post와 tag의 조인 연산이 필요하고 코멘트를 보여 주기 위해 쿼리수행해야함

 

나. 애드혹 질의

  • 시스템이 받아 들일 수 있는 질의를 미리 정의할 필요가 없다
  • 관계데이터베이스의 기본적인 질의 성능을 유지하려고 하는 것이 몽고DB의 설계 목표

Posts와 comments관련한 예

추천수가 이상이고 ‘’라는 용어로 태그된 모든 포스트 검색

[SQL질의어]

SELECT * FROM posts

INNER JOIN posts_tags ON posts.id = posts_tags.post_id

INNER JOIN tags ON posts_tags.tag_id == tags.id

WHERE tags.text = 'politics' AND posts.vote_count > 10;

[몽고DB질의어]

db.posts.find({'tags': 'politics', 'vote_count': {'$gt': 10}});

  • 여러 개의 속성을 임의로 조합하여 질의할 수 있는 능력을 보여주고 있음
  • 인덱스를 잘 정의하면 퀴리와 정렬 속도가 10배 이상의 단위로 빨라지므로 애드혹 쿼리를 지원하는 시스템은 세컨더리 인덱스를 지원함

 

다. 세컨더리 인덱스

  • B tree로 구현됨
  • 한 컬레션에 64개의 세컨더리 컬렉션을 만들 수 있음
  • 역순,고유,복합키,지리공간적인덱스가 가능함
  • 여러 개의 세컨더리 인덱스를 가지고 질의어를 최적화 할 수 있음

 

라. 복제

  • Replica set이라 부르는 구성을 통해 데이터베이스 복제 기능을 제공
  • 서버와 네트워크 장애가 발생할 겨우 대비해 중복성과 자동 장애 조치를위해 데이터를 여러대의 서버에 분산함
  • 데이터 읽기에 대한 확장을 위해서 사용
  • 웹과 같은 읽기 위주의 애플리케이션에서는 데이터베이스 읽기를 복제셋 클러스터 내의 여러 서버에 분산이 가능함

 

마. 속도와 내구성

  • 쓰기 속도 : 미리 정해진 시간내에 데이터베이스가 얼마나 많은 수의 삽입 수정 삭제 명령을  처리할 수 있는가를 의미
  • 내구성 : 쓰기 연산이 디스크에 제대로 이루어졌는지 확신할 수 있는 정도
  • 쓰기 시맨틱스(write symantics) 와 Jounaling을 통해 속도와 내구성 사이에서 타협할 수 있음
  • 모든 쓰기 : 명령하고 잊어버리기 모드(fire-and-forget) –쓰기 연산을 TCP 소켓으로 보내고 나서 그 결과에 대한 응답을 기다리지 않음단위데이터가 작고 발생량은 방대한데이터나로그에 사용
  • 안전 모드 : 쓰기 연산에 대한 최소 응답을 기다림, 쓰기 연선이 몇 개의 서버에 중복 될 때 까지블록하는데 사용중요도 높은 데이터

 

바. 확장

  • 수평적 확장(Scaling horizontally) 혹은 외적 확장(Scaling out)을 고려

  • 수평적 확장 : 단하나의 노들르 업그레이드 하는 대신에 데이터베이스를 여러대의 서버에 분산시키는 것을 의미함
  • 몽고 DB는 수평적 확장이 가능하도록 설계 됨
  • Auto-Sharding의 파티션 메커니즘을 통해 데이터를 여러 노드에 걸쳐 분산하는 것을 자동으로 관리 해줌
  • 어플리케이션은 샤드 클러스터에 연결하여 사용함으로 내부 메커니즘은 신경을 쓰지 않아도됨

 

III. 몽고 DB와 다른 데이터베이스의 비교 및 사용예

가. 몽고 DB와 다른 데이터베이스의 비교

 

데이터 모델

확장 모델

용례

간단한 키-값 저장 시스템

 

멤캐시디

(Memcached)

키-값, 여기서 밸류는 이진 blob

여러 가지, memcached는 이용 가능한 램으로 노드에 걸쳐 확장함으로써 하나의 단일한 데이터 스토어로 변환한다

캐싱, 웹 ops

정교한 키-값 저장 시스템

카산드라, 볼드모트 프로젝트

(Project Voldemort), 리악(Riak)

여러 가지가 있다. 카산드라는 칼럼(column)으로 부르는 키-값 구조를 사용하고, 볼드모트는 이진 blob을 사용한다.

높은 확장성과 용이한 쟁애조치를 위한 Eventually-consistent, 다중 노드 분산

고효율 verticals (액티비티 피드, 메시지 큐), 캐슁, 웹 oos

관계 데이터베이스

오라클, MySQL, PostgreSQL

테이블

수직적 확장, 제한적인 클러스터링과 수동적인 파티션

트랜잭션이 필요한 시스템 또는 SQL 정규화된 데이터 모델

 

나. 사용예 와 한계

웹어플리케이션

일차적 저장 시스템으로 사용하기에 적당

Agile

일차적 저장 시스템으로사용하기에 적당

Agile 개발

고정된 스키마가 없어 신속한 개발이 가능함

분석과 로깅

분석에 적합한 속도타깃원자적 업데이트와 캡드 컬랙션이라는 특징 때문에 유용함

캐싱

더 빠른 질의어와 전체적으로 표현할 수 있는 데이터 모델 적용

[ 실제 서비스되는 시스템으로 배포하기 전에 한계점]

  • 메모리 맵(memory-mapped)파일을 사용한 결과에서 발생한 것임
  • 보통 64 비트 시스템에서 실행 되어야 함
  • 필요할 경우 메모리 자동 할당 : 공유 환경에서 실행이 어려움
  • 복제와 저널링을 사용 : 셧다운 시 데이터가 손상 될 수 있음, 장애 조치를 위해 복제된 백업 서버를 가지고 있어야 함

댓글