1. 정의
- C++로 작성된 오픈소스 문서지향(Document-Oriented) 적 Cross-platform 데이터베이스
2. 데이터 모델
- Database : Collection 들의 물리적인 컨테이너 로 파일시스템에 여러파일들로 저장된다
- Collection : MongoDB Document의 그룹 으로 schemaless 하다
- Document
- Document는 RDMS의 record 와 비슷한 개념으로 한개이상의 key-value pair 으로 이뤄져있습니다
{
"_id": ObjectId("4b866f08234ae01d21d89604"),
"username": "mr.sense",
"address": { city: "seoul", zipcode: "11140"" }
}
- _id 는 12bytes의 hexadecimal 값으로서, 각 document의 유일함(uniqueness)을 제공 _
- Document 는 동적(dynamic)의 schema 를 갖는다
3. architecture
- 구성
- mongos
- mongos demon : router
- config server : sharding meta 정보를 관리한다
- mongod
- primary : read/write
- secondary : read only
4. features
- hash, range 방식의 sharding 방식 지원
- auto failover 지원
- primary node 가 down 시, election 을 통해 secondary 가 primary 로 선출
- replica
- primary 의 write 이후 작성되는 oplog 를 전송받아 secondary 에 write 한다(최대 11)
5. 데이터 구조
- 논리 데이터 구조
- 하나의 collection 에 대해 b-tree 구조 로 복수개의 index 를 관리한다
- extent : 데이터가 저장되는 논리적인 단위
- document : 정렬된 key/value의 집합
- 물리 데이터 구조
- OS에 의해서 제공되는 Virtual Memory를 사용하게 되는데, Pysical Memory 양이 작더라도 Virtual Memory는 훨씬 큰 공간을 가질 수 있다
(하지만 메모리 사이즈가 작으면 page fault 가 자주 발생해서 시스템이 느려진다)
- Virtual Memory는 page라는 블럭 단위로 나뉘어 지고, 이 Block들은 Disk의 block에 mapping이되고, 이 block들의 집합이 하나의 데이타 파일이 된다
- memory block -- OS 에 의한 write --> disk block
6. read / write
- write
- step1. primary memory 에 write
- step2. primary disk 로 flush
- step3. secondary 요청으로 Oplog 를 복사 후 적용
- (*) 이 때, write 성공의 조건은 write concern type 에 의해 결정된다
- read
- https://docs.mongodb.com/manual/core/read-preference/
- "local" readConcern : reads from the primary reflect the latest writes in absence of a failover;
- "majority" readConcern : read operations from the primary or the secondaries have eventual consistency.
7. lock
- database 단위의 lock 을 지원한다 == document 의 변경시 database 전체가 write lock 발생
참고
https://docs.mongodb.com
http://bigmatch.i-um.net/2013/12/mongodb%EB%A5%BC-%EC%93%B0%EB%A9%B4%EC%84%9C-%EC%95%8C%EA%B2%8C-%EB%90%9C-%EA%B2%83%EB%93%A4/