본문 바로가기
SQL/NoSQL

[데이터베이스/DB] NoSQL이란? (4-1) : mongoDB의 개념 및 구조, NoSQL간 차이점

by newstellar 2021. 10. 27.
반응형
 

[데이터베이스 DB] NoSQL이란? (2-1) : HBase의 개념/특징/아키텍처

2021.09.01 - [SQL/NoSQL] - NoSQL이란? (1) : 개념 및 사용 목적, RDBMS와의 차이점 [데이터베이스 DB] NoSQL이란? (1) : 개념 및 사용 목적, RDBMS와의 차이점 학습목표 1. 빅데이터 처리를 위한 Hadoop 플랫폼..

newstellar.tistory.com

 

 

[데이터베이스/DB] NoSQL이란? (3-1) : 카산드라(Cassandra) 개념 및 장단점

[데이터베이스 DB] NoSQL이란? (2-3) : HBase 사용법 (feat. Hive & Impala) 2021.09.02 - [SQL/NoSQL] - [데이터베이스 DB] NoSQL이란? (2-2) : HBase 사용법(Shell, command) [데이터베이스 DB] NoSQL이란? (2-2..

newstellar.tistory.com

 

NoSQL의 다른 예시인 HBaseCassandra에 대해 궁금하신 분은 이전 포스팅을 살펴보시기 바랍니다.

 

 

학습목표
1. mongoDB가 무엇인지, 그 특징과 적용 분야를 설명할 수 있습니다.
2. mongoDB와 다른 NoSQL 제품들과의 차이점을 이해할 수 있습니다.
3. mongoDB 구조 및 구성요소에 대해 이해합니다.

 

1. mongoDB란?

 

  1) 개념

  • Wikipedia에 따르면, mongoDB(몽고DB)는 크로스 플랫폼 Document 지향 DB 시스템입니다. 말이 되게 어려운데, 간단히 말하면 기존 RDB의 테이블 구조를 지양하고, JSON과 같은 도큐먼트 형태의 포맷 구조를 취한 것입니다.


    mongoDB 공식 홈페이지에서는 다음과 같이 mongoDB를 설명하고 있습니다.

    • mongoDB는 데이터를 유연한 JSON 유사 문서에 저장합니다. 즉, 필드가 문서에 따라 다를 수 있으며, 데이터 구조가 시간에 따라 변할 수 있습니다. mongoDB에서는 이를 BSON(Binary JSON) format이라고 부릅니다.

    • 문서 모델은 애플리케이션 코드의 객체들로 mapping하며, 데이터를 작업하기 쉽게 만듭니다.

    • 임시 쿼리, 인덱싱, 실시간 집합 강력한 데이터 액세스 및 분석 방법 제공합니다.

    • mongoDB는 코어에서 배포된 데이터베이스로, 매우 높은 가용성, 수평 확장, 지리적 분포가 빌트인되고 사용하기가 용이합니다.

 

  • C++로 작성되었으며 2007년에 개발을 시작하여 2009년에 오픈소스 개발 모델로 전향했습니다. "humongous DB"에서 이름을 "mongoDB"라고 따왔습니다.


  • mongoDB의 특징은 Sharding(샤딩)을 통한 Scalability(확장성)와 Replica Set을 이용한 Availability(가용성)입니다. 다양한 언어의 API를 제공하고 있으며(C, C++, C#, Java, JavaScript, Perl, PHP, Python, Ruby, Scala) 비정형 데이터에 적합한 Schema-less 방식입니다. 따라서 다양한 field를 포함하는 document 형태로서 동적으로 스키마를 정의할 수 있게 됩니다.

 

 

 

  2) 용어

RDB와 mongoDB의 비교 모식도

 

  • _id : Document's Primary Key
    - 모든 Document에 필요한 field로서, 시간 / 머신ID / 프로세스ID(PID) / 순차번호로 구성하여 고유성을 보장합니다.


  • Collection : Document를 그룹화
    - 관계형 데이터베이스(RDB)의 Table과 같은 개념으로, 구조에 제한이 없다는 것이 특징입니다.


  • Cursor : Pointer to the result set of a query
    - 클라이언트가 커서를 통하여 결과 검색이 가능합니다.


  • Database : Container for collections
    - 각 DB는 파일시스템에 자체 파일 set을 보유하고, mongoDB는 여러 DB를 저장합니다.


  • Document : RDB의 row 개념
    - mongoDB Collection에 있는 레코드로, key-value 형태로 구성됩니다. value에 다른 document, array, document array가 가능합니다.


  • Field : name-value pair in a Document
    - Document에 1개 이상의 Field가 존재해야 하며, RDB의 Column과 유사한 개념입니다.


  • JSON : JavaScript Object Notation
    - 구조화된 데이터를 표현하기 위한 readable text 형식으로 많은 프로그래밍 언어에서 지원합니다.

 


2. mongoDB의 특징

 

  1) 핵심적인 특징

  • Queries
    - Ad-hoc 쿼리Document 기반의 다양한 쿼리를 지원합니다.

    - 여기서의 Ad-hoc 쿼리란 사용자가 직접 작성하는 비정형화된 쿼리를 말합니다.

  • Index Support
    - Document의 모든 Field에 index가 가능합니다.

  • Multiple Servers
    - 여러 서버에서 DB를 실행하고, HW 고장 시 시스템을 보호하기 위해 데이터를 복제합니다.

  • Auto Sharding
    - Shard(물리적 파티션)에 데이터를 분산 저장하고, Sharding으로 자동 로드 밸런싱합니다.}

    - Config Server (데이터 범위, Shard 위치 정보 등의 메타 정보를 저장)

    - Router Server (쿼리 수행을 위한 proxy 역할)

    - Shard (분할된 데이터 subset, replica set로 배포가능)

  • Map Reduce
    - key-value를 구성하는 Map과 Reduce 함수의 조합을 통해 분산/병렬 처리를 지원합니다.

  • Replication (★★★)
    - Replication = Redundancy + High Availability (용량을 내어주고 속도를 취한다.)

    - Replica Set는 둘 이상의 데이터 사본으로 구성되며, 각 Replica Set 멤버는 어느 시점에서나 Primary 또는 Secondary Replica 역할을 수행합니다. 기본적으로 Primary Replica에서 쓰기와 읽기 작업이 수행되며, Secondary Replica는 내장된 Replication 기능으로 데이터의 사본을 관리합니다.

    PSS 시스템 : 하나의 Primary와 여러 개의 Secondary 구조


    - Primary Replica가 실패할 시 Replica Set에서는 어떤 Secondary가 Primary가 되면 좋을지 선거 과정을 수행합니다. 이를 PSS 시스템이라고 부릅니다. 다만 Secondary가 하나밖에 없다면 혼자서는 Primary를 선출할 수 없기 때문에 서버 장애가 발생합니다.

    Secondary끼리 새로운 Primary를 선출하는 과정


    - Primary 선출 과정에서의 드러나는 PSS 시스템의 단점을 해결하기 위한 방식이 PSA 시스템입니다. Primary와 Secondary 외에도 Arbiter가 존재하는데, Arbiter는 데이터를 보관하지 않는 대신 Primary 선출 과정에 개입합니다.

    PSA 시스템



  • Failure Handling
    - 많은 수의 Replica들로 시스템, 데이터센터, 네트워크 분할 장애 시 데이터 가용성을 보장하니다.

 

 

 

  2) Why mongoDB ?

장점 단점
- Ad-hoc Query

- Replication & Sharding

- Schema-less

- Aggregation framework (*)

- Indexing (**)

- Grid File System (***)
- SQL 지원 X

- Join 기능 지원 X

- 많은 메모리 소모

- 데이터 크기 제한

- Nest 개수 제한


(*) Aggregation framework

  • 데이터 레코드를 Pipeline 순서대로 처리하고 계산된 결과를 전달하는 집계(Aggregation) 작업으로, 여러 Document의 값을 그룹화하고 그룹화된 데이터에 다양한 작업을 수행하여 단일한 결과를 전달합니다.

 

 

(**) Indexing

  • 테이블의 모든 레코드를 순회할 필요 없이 주어진 테이블에서 레코드를 빠르게 검색하기 위한 데이터구조입니다.

  • 미리 데이터 순서를 정리해서 빠른 검색을 지원하며, 두 개의 index가 필요하면 복합 index를 사용합니다.
    (복합 index에서는 key의 순서가 중요)

    (1) Single Field Index - _id 인덱스 외에 별도로 사용자가 지정

    (2) Compound Index - 여러 Field에 대한 사용자 정의 인덱스로, 각 Field의 순서가 중요

    (3) Multikey Index - Array, Embedded Document를 Field로 갖는 Index

    (4) Geospatial Index - 지리 좌표 데이터의 효율적인 쿼리를 제공하기 위한 특별한 Index
    (2d indexes, 2dsphere indexes 등)

    (5) Text Index - 컬렉션에서 문자열 검색을 지원하는 Index로, 값이 문자열 또는 문자열 요소 배열인 Field를 포함

    (6) Hashed Index - B tree가 아닌 Hash 자료구조를 이용하여, key 데이터가 균일하지 않게 분포하는 경우 일관성을 유지하기 위해 Hashed Index가 유용

 

 

(***) Grid file system

  • Document의 메모리 사이즈 제한(BSON의 경우 16MB)을 해결하고자 잘라서 별도의 Document로 저장하는 방식으로, 전체 파일의 내용을 atomically 업데이트할 때는 부적절합니다.

  • 디폴트로 prefix 'fx'를 이용하여 파일을 두 곳의 컬렉션에 저장합니다.
    (fs.files는 파일 메타 정보 / fs.chunks는 binary chunks)

 

 

 

  3) Where to use mongoDB ?

  • 웹 어플리케이션을 위한 RDBMS 대체

  • Semi-structured 컨텐츠 관리 시스템

  • 실시간 분석 & 고속 로깅(Logging)

  • Big Data & Data Hub

  • User Data Management

  • Facebook / ebay / Adobe / SEGA / coinbase / EA / SAP / Google 에서 사용 중

 

 

  4) mongoDB의 구조 (Architecture)

  • Tree Structure를 보여주는 아주 좋은 예시가 있어 가져와 보았습니다.

 

  • Parent References의 구조
[
  { _id: "MongoDB", parent: "Databases" },
  { _id: "dbm", parent: "Databases" },
  { _id: "Databases", parent: "Programming" },
  { _id: "Languages", parent: "Programming" },
  { _id: "Programming", parent: "Books" },
  { _id: "Books", parent: null }
]​



  • Child References의 구조
[
  { _id: "MongoDB", children: [] },
  { _id: "dbm", children: [] },
  { _id: "Databases", children: [ "MongoDB", "dbm" ] },
  { _id: "Languages", children: [] },
  { _id: "Programming", children: [ "Databases", "Languages" ] },
  { _id: "Books", children: [ "Programming" ] }
]​

 

 

  • Array of Ancestors 구조
[
  { _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" },
  { _id: "dbm", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" },
  { _id: "Databases", ancestors: [ "Books", "Programming" ], parent: "Programming" },
  { _id: "Languages", ancestors: [ "Books", "Programming" ], parent: "Programming" },
  { _id: "Programming", ancestors: [ "Books" ], parent: "Books" },
  { _id: "Books", ancestors: [ ], parent: null }
]​

 

 

  • Materialized Paths 구조
[
  { _id: "Books", path: null },
  { _id: "Programming", path: ",Books," },
  { _id: "Databases", path: ",Books,Programming," },
  { _id: "Languages", path: ",Books,Programming," },
  { _id: "MongoDB", path: ",Books,Programming,Databases," },
  { _id: "dbm", path: ",Books,Programming,Databases," }
]​




  • Nested Sets 구조

[
  { _id: "Books", parent: 0, left: 1, right: 12 },
  { _id: "Programming", parent: "Books", left: 2, right: 11 },
  { _id: "Languages", parent: "Programming", left: 3, right: 4 },
  { _id: "Databases", parent: "Programming", left: 5, right: 10 },
  { _id: "MongoDB", parent: "Databases", left: 6, right: 7 },
  { _id: "dbm", parent: "Databases", left: 8, right: 9 }
]​

 


참고자료
- https://docs.mongodb.com/manual/replication
- https://kciter.so/posts/about-mongodb
반응형

댓글