MongoDB 1
MongoDB
What is MongoDB?
MongoDB는 NoSQL 방식의 DB로 스키마를 고정하지 않고(schema-less) Document 저장방식을 취하게 된다. 스키마를 구조화하고 있지 않기 때문에 데이터의 종류를 제한하지 않고 다양하게 설정할 수 있다. 아래와 같이 json 형태로 data를 저장할 수 있다.
{
key:
data:
embedded: {
key:
}
}
join이 불가능하기 때문에 연관되어 있는 데이터는 모두 함께 저장해야한다.
Characteristics
Structure
MongoDB는 위와 같이 기본 구조를 가지게 되는데, Primary + 2 * secondary(보통 secondary로 구성)로 구성된 replica set 구조를 가진다. client은 primary로 필요한 데이터를 주고 받게되고, secondary에서는 primary의 복제본을 저장하고 있게 된다. 이렇게 primary, secondary 형태로 데이터를 관리해서 primary node가 비정상적으로 작동할 때 secondary가 primary를 대체함으로써 안정적인 서비스 제공이 가능하다.
replicaset은 위 처럼 primary 에서는 secondary에 데이터 복제본을 전달하게 되고, 각 node에 대해서 항상 heartbeat을 체크해서 해당 node가 정상적으로 동작하는지 감독한다.
Sharding
MongoDB는 NoSQL의 공통적인 특징은 Auto Sharding을 지원한다. 데이터를 분산해서 저장하여 많은 양의 데이터를 저장하고 이를 효율적으로 질의할 수 있는 시스템을 구성하고 있다.
MongoDB의 Sharding 구조를 보면 위와 같은 구조로 이루어져있다. Client(응용계층)에서는 Router(mongos,중개자계층)을 통해 각각의 shard(데이터 계층)으로 부하를 분산해서 데이터를 요청하게 된다. 이때, 각각의 shard에 저장된 데이터가 다르므로, 원하는 데이터의 위치를 파악하기 위해 config server(mongod)를 활용하여 데이터의 위치를 파악해서 특정 shard로 데이터를 요청한다. 응용 계층은 중개자 계층을 통해 데이터를 요청하게 되는데, 이때 중개자 계층은 client으로 하여금 하나의 DB로 데이터를 요청하는 것처럼 느끼게 만든다.
Memory Issue
- 메모리맵 형태의 파일 엔진 DB으로 메모리에 상당히 의존적이다. 메모리 크기가 성능을 좌우하고 메모리 크기를 넘어서는 경우에 대해서 성능이 급격히 하락하게 된다.
MongoDB는 데이터를 write하는 과정에서 memory에 작성하고 이를 디스크에 주기적으로 옮기는 방식으로 데이터를 작성하게 된다. 이때, Physical Memory와 Virtual Memory을 사용해서 부족한 메모리 영역에 대해서 page 형식으로 관리해서 필요한 부분만 memory에 올려서 사용하게 된다. 만약 데이터를 작성하고자 할 때, page가 메모리에 없는 경우에는 page-fault가 발생하게 되며 disk에서 page를 찾는 과정이 필요하게 된다. MongoDB에서 page-fault 처리를 진행하기 때문에 memory 크기에 성능이 좌우되는 것이다.
Data Modeling
MongoDB도 RDBMS와 유사한 방식으로 모델링 되게 된다. 단지 용어/특징에서 조금의 차이를 보인다.
Type | Description |
---|---|
Datebase | Collection을 모아 놓은 집합, 물리적인 컨테이너 |
Collections | RDBMS의 Table와 같은 역할이지만 고정된 schema가 없다는 특징이 있다. |
Documents | RDBMS의 row에 해당되는데, 각각의 데이터를 의미한다. 각 document은 key:value 형태의 데이터가 모여있는 집합이라고 생각할 수 있다. |
Fields | RDBMS의 column 값으로 document 내부의 각각의 key:value 쌍을 field로 본다 |
Index
다른 NoSQL과 달리 MongoDB는 Index 설계가 잘 되어있다. 원하는 필드에 대해서 index을 걸 수 있으며, MongoDB에서 index는 B-Tree 구조를 취하고 있다.
MongoDB에 제공해주는 index으로 대표적으로 아래와 같다.
Type | Description |
Single Field | 기본 인덱스로 _id 필드에 대해서 기본 인덱스가 설계되어 있다. |
Compound | 두 개 이상의 필드를 활용한 복합 인덱스 |
Multikey | 하나의 document 내부에 배열 형태의 데이터를 저장하는 것이 가능한데, 각 배열의 원소에 대해서 인덱스를 정의할 수 있다. |
Geospatial | 위치 기반의 인덱스로 공간내에 거리나 범위를 계산할 때 사용되는 인덱스 |
Text | 문자열 필드에 대한 인덱스 |
Pros and Cons
Pros
- ReplicaSet을 통해 안정적인 서비스 제공이 가능하다
- Auto Shading을 기본으로 하기 때문에 대용량 데이터에 대한 저장이 가능하다. 각종 로그 데이터, 세션 정보가 빈번하게 발생하는 SNS와 같은 빅데이터를 저장하기에 적합하다.(NoSQL의 공통적인 특징)
- document 기반의 데이터 저장 방식을 통해 유연한 데이터 저장이 가능
- memory mapped 방식을 통해 데이터를 처리하기 때문에 방대한 데이터에 대해 빠른 처리가 가능하다.
Cons
- transaction이 불가능하기 때문에 금융, 빌링, 결제, 등의 신뢰성 기반의 서비스 제공이 불가능
- memory에 의존하는 데이터 처리 방식을 취하기 때문에 memory 크기가 성능을 좌우한다.
- 데이터를 중복해서 저장하기 때문에 공간 효율이 떨어지는 경향(NoSQL의 공통적인 특징)
Installation
- 공식사이트에서 platform에 맞는 DB를 설치한다. 해당 실습 과정에서는 윈도우 버전을 활용하였다. default로 설치를 진행하게 되면 MongoDBCompass와 같은 시각화 tool을 제공하며, MongoDB Server을 service로 실행시켜 자동으로 MongoDB가 동작하게끔 되어 있다.
-
MongoDB의 bin 폴더를 환경변수로 등록해서 빠른 명령어 사용이 가능하도록 한다.
- mongod 명령어를 활용해서 mongodb server을 실행한다. dbpath option을 이용해서 db의 경로를 지정한다.
mongod -dbpath "C:\Program Files\MongoDB\db"
- compass program을 이용해서 mongodb에 접속한다.
- 윈도우 서비스로 등록해서 빠른 실행이 가능하도록 하자
우선 아래와 같은 설정 파일을 생성해서 mongod의 환경설정 값을 저장한다.
mongod.conf
storage:
dbPath: C:\Program Files\MongoDB\db
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: C:\Program Files\MongoDB\db\log\logs.log
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
아래의 service 생성 과정은 관리자 권한을 통해 cmd 프롬프트 창을 통해 실행하도록 한다.
//service 생성
mongod --config 'C:\Program Files\MongoDB\Server\6.0\bin\mongo.conf' --install --serviceName MongoDB --serviceDisplayName MongoDB
//service 실행
net start MongoDB
//service 종료
net stop MongoDB
- mongo shell을 설치해서 shell 환경에서 DB에 접근할 수 있도록 한다.(시각화 tool이 있지만 때로는 shell을 활용하는 것이 더 빠르다.)
추가로 환경변수도 지정하여 명령어을 바로 실행할 수 있도록 한다.
아래의 명령어를 활용하여 원하는 MongoDB 서버에 접속할 수 있다.(default는 localhost:27017이다.)
mongosh [option] <dp IP>
mongo shell을 활용하여 MongoDB에 접속하게 되면 아래와 같은 화면이 출력된다.
References
- 영상
- 문서
댓글남기기