DB internal structure
-
MongoDB의 데이터 저장소는 메모리 맵 파일(Memory Mapped File)을 사용한 가상 메모리를 사용한다
- MongoDB의 데이터 구조 : 데이터를 저장 : Record // 인덱스를 저장 : Bucket
- Record : BSON 객체를 저장하는 노드를 레코드로 정의, Record는 BSON 객체의 이중연결리스트 (double linked list)구조로 구성
- Bucket : 인덱스는 레코드에 저장된 데이터를 빠르게 찾기 위해 b-tree 형태로 저장된 노드 구조를 가짐
- b-tree 노드를 버켓(Bucket)이라고 정의
- Extent : MongoDB는 대용량 데이터를 HDD에 쉽게 저장할 수 있는 단위로 레코드들을 grouping한다.
- 이를 Extent라고 한다. Hadoop에서 chunk라고 하는 느낌이라고 생각하면 된다.
- Extent 들을 이용하여 MongoDB는 HDD에 저장될 파일과 삭제된 레코드를 관리한다.
- 자료 구조 관점에서 보면 연결되어 있는 Record들의 Header 역할을 수행하는 것
- 사용자가 하나의 데이터베이스를 만들었다면, MongoDB는 데이터베이스와 관련된 한 개의 네임스페이스(DB Namespace)를 만든다.
- DB Namespace == 컬렉션 (collection Namespace) + Free Extent 리스트(DB에서 삭제된 레코드 리스트를 가지고 있는 Extent 리스트)
- Collection Namespace는 primary index Namespace(B Tree)와 Record Extent list를 가진다. 그래서 MongoDB가 search가 빠른이유이다. primary index namespace에서 이진트리로 찾아내기 때문이다.
-
만약 Primary index 이외에 추가로 필드를 가지고 인덱스를 더 생성하면 B Tree 형태의 Index Namespace를 하나 더 가진다.
- Write(insert/update)를 수행할 때, MongoDB는 해당 레코드가 가리키는 가상 메모리 주소 공간에 데이터를 적재한다.
- Read를 수행할 때, MongoDB는 해당 메모리 주소 공간에 할당된 데이터가 가상 메모리에 로딩되어 있는지 확인하고, 없다면 파일에서 내용을 읽어 가상 메모리에 적재한다.
- MongoDB는 백그라운드로 (주기적으로)가상 메모리에 적재된 데이터를 HDD에 최대 2GB 단위로 파일을 구성한 볼륨(volume)으로 HDD에 데이터를 flush한다.
정리
- 처음 DB를 생성하면 DB Namespace가 형성이 되고, Collection Namespace와 Free Extent List가 형성이 된다. Collection Namespace는 primary index namespace 와 Record Extent list로 구성이 되어있다. Primary index namespace는 이진트리로 구성되어있어 굉장히 탐색이 빠르다. 따라서 다른 index로 search 하고 싶을 때는 index namespace를 하나 더 추가하면 된다.
- function, read을 작동하면 primary index namespace를 통해 search를 한다. 그리고 해당 record 주소 공간에 할당된 데이터가 있다면 불러오고, 아니면 file에서 content를 읽어와 가상 메모리에 적재를 한다.
- function, write를 작동하면 해당 record가 가리키는 가상메모리 주소 공간에 데이터를 적재한다.
출처 : https://nicewoong.github.io/development/2018/02/10/mongodb-internal/
https://docs.mongodb.com/manual/reference/command/
https://m.blog.naver.com/ykim1980/90172854591
MongoDB에 최적화된 BackGround
Use Solid State Disks (SSDs)
MongoDB has good results and a good price-performance ratio with SATA SSD (Solid State Disk).
Use SSD if available and economical.
Commodity (SATA) spinning drives are often a good option, as the random I/O performance increase with more expensive spinning drives is not that dramatic (only on the order of 2x). Using SSDs or increasing RAM may be more effective in increasing I/O throughput.
즉, SATA SSD에 설치를 해야, 최적에 성능을 낼 수 있다는 얘기이다. 물론 NvME에 하면 월등히 빠르겠지만, SATA SSD에서 가격대비 최적의 성능을 낸다고 나와있다.
'대학원 공부 > computer science' 카테고리의 다른 글
git & github : merge & pull (0) | 2020.05.11 |
---|---|
git & github : stash (0) | 2020.05.11 |
Computer Sturcture : Multiprocess vs Multithread (0) | 2020.04.17 |
Computer 부품에 대하여 (0) | 2020.04.17 |
open source : Docker가 도대체 뭘까? (0) | 2020.03.28 |
댓글