시작

현재 메신저 서비스를 보면 다른 테이블에서 Message 테이블을 참조할 일은 딱히 보이지 않는다.

Message를 FK로 사용할 일이 없다면 관계형보단 일반적으로 I/O가 빠른 Nosql을 사용해도 되지않을까?

 

MongoDB를 알아보자.

RDBMS와 keyword비교

Document는 JSON {} 형태로 구성된다. 

 

Field는 Column처럼 고정되지 않고 자유로운 key : value 형태이다.

value는 boolean, array([ ]), null, nested한 document({ }) 등이 가능하다.

Document

{
    _id: ObjectId('64f9eb1cdb80f40007827e02'),
    text: '안녕하세요',
    'boolean': true,
    array: [
        1,
        2,
        3,
        4
    ],
    empty: null
}

하나의 Document는 다음과 같은 field를 가진다. ( _id라는 key에 ObjectId타입의 value )

 

ObjectId는 PK와 같은 고유한 키를 의미한다.

차이점은 PK는 DBMS가 직접 부여하고 ObjectId는 클라이언트에서 생성한다.

 

Router(mongos)는 ObjectId를 보고 데이터가 존재하는 Shard에서 데이터를 요청할 수 있는데 Sharding된 데이터를 빠르게 가져오기 위해 클라이언트에서 key를 생성한다는 듯 하다.

 

ObejctId는 12bytes binary data로 다음과 같이 구성된다.

Unix Timestamp(4bytes) + Random Value(5bytes) + Count(3bytes)

MongoDB의 분산 시스템

복제

Master-Slave 구성

Master 장애시 Slave에서 Master 선출

 

샤딩(Sharding)

대용량 데이터를 저장하기 위한 방법으로 소프트웨어적으로 db를 분산시켜 처리하는 구조

샤딩 방식에는 테이블 단위 분리, 테이블 자체 분할이 있다.

 

위 이미지를 보면 앞의 말을 이해할 수 있다.

'Router(mongos)는 ObjectId를 보고 데이터가 존재하는 Shard에서 데이터를 요청할 수 있다.'

 

맵 리듀스(Map Reduce)

한 대 이상의 하드웨어를 활용해 데이터를 분산하여 연산하고 다시 합치는 기술로 맵과 리듀스 단계로 나누어 처리한다.

 

참고 자료

https://kciter.so/posts/about-mongodb

 

MongoDB 이해하기

사내에서 MongoDB를 잘 쓰기위한 스터디를 하게되어 이번 기회에 관련 자료를 정리하기로 했다. MongoDB가 왜 필요한지, 더 잘사용하기 위해서 무엇이 필요한지를 중심으로 처음 MongoDB를 사용할 때

kciter.so

https://www.bearpooh.com/163

 

MongoDB 특징과 주요 개념

MongoDB의 구조와 주요 특징에 대해 정리한다. Docker를 이용한 MongoDB 설정 방법은 아래 포스팅을 참고한다. Docker로 MongoDB 설정하기 MongoDB는 대표적인 NoSQL 데이터베이스 서비스이다. NoSQL은 기존 RDBMS

www.bearpooh.com

https://www.youtube.com/watch?v=81JnYGT2HVQ&list=PL9mhQYIlKEheyXIEL8RQts4zV_uMwdWFj&index=4