홈페이지 > MongoDB > The Data Structure of MongoDB (1)

The Data Structure of MongoDB (1)

Pinterest

글 : 이승용

 

빅데이터가 소개되면서 NoSQL이 각광받게 되었으며, 그 중 MongoDB는 NoSQL에서 선두 자리를 차지하고 지속적으로 발전되고 있다.다. 오픈 소스인 MongoDB는 누구가 그 내부 구조를 살펴 볼 수 있음에도 불구하고 방대한 양 때문에 MongoDB에 대한 내부 구조에 대해 자세하게 논하지는 못하고 있다. 사실 끊임없이 업그레이드되는 프로젝트의 내부 구조를 매번 분석한다는 것도 매우 어렵다. 하지만, 필자는 이번 기회에 필자가 분석한 MongoDB의 내부 데이터 구조를 살펴봄으로써, NoSQL의 기술 트랜드가 어떠한 방식으로 발전되고 있는지 알아보고, 개선 방향에 대해서도 살펴보기로 한다. 이번에는 그 첫번째로 MongoDB에서 사용되는 데이터 구조의 용어를 기본 개념만 알아본다.

MongoDB의 데이터 구조는 크게 데이터를 저장하는 레코드record와 인덱스를 저장하는 버켓bucket으로 구성된다. MongoDB는 BSON 객체를 데이터 저장 단위로 사용하기 때문에, 저장하고 있는 모든 데이터를 BSON 객체의 이중연결리스트double linked list구조로 구성하고, BSON 객체를 저장하는 노드를 레코드로 정의한다. 반면 인덱스는 레코드에 저장된 데이터를 빠르게 찾기 위해 b-tree 형태로 저장된 노드 구조를 가지며, b-tree 노드를 버켓이라고 정의한다.

MongoDB는 대용량 데이터를 HDD에 쉽게 저장할 수 있는 단위로 레코드들을 그룹핑grouping하는데, 이를 익스텐드extent라고 한다. MongoDB의 익스텐드는 자료 구조 관점에서 보면 연결되어 있는 레코드들의 헤더 역할을 수행하는 것이지만, 이 익스텐드들을 이용하여 MongoDB는 HDD에 저장될 파일과 삭제된 레코드를 관리한다.

 

MongoDB 데이터 구조

[그림 1] MongoDB 데이터 구조

 

[그림 1]은 앞에서 설명한 MongoDB의 데이터 구조가 유기적으로 수행되는 모습을 도식화한 것이다. 사용자가 하나의 데이터베이스를 만들었다면, MongoDB는 데이터베이스와 관련된 한 개의 네임스페이스namespace를 만든다.[1] 데이터베이스 네임스페이스는 RDB의 테이블과 동일한 MongoDB의 컬렉션collection 네임스페이스와 데이터베이스 별로 삭제된 레코드 리스트를 가지고 있는 프리 익스텐드Free Extent 리스트를 가진다. 컬렉션 네임스페이스는 사용자가 insert 질의를 통해 정의한 컬렉션 명으로 구성되며, 컬렉션 생성과 동시에 _id 필드의 기본 인덱스 네임스페이스를 가지게 된다. 만약 사용자가 _id 이외의 필드를 인덱스를 구성하였다면, 생성된 인덱스 필드에 하나의 인덱스 네임스페이스가 구성되고, 필드 값은 b-tree 형태로 인덱스를 구성한다.

MongoDB는 데이터를 저장하는 레코드나 인덱스를 저장하는 버켓이나 모두 데이터를 저장하는 공간이다. MongoDB의 데이터 저장소는 메모리 맵 파일Memory Mapped File을 사용한 가상 메모리를 사용한다. 가상 메모리는 시스템이 지원하는 운영체제 버전에 따라 가상 주소 공간을 할당 받게 되고 할당 받은 주소 공간을 마치 파일을 처리하는 방식으로 프로그램을 구성할 수 있다.[2]

[그림 1]과 같이 실질적인 데이터 저장 공간을 가지고 있는 레코드와 버켓은 그 크기에 맞는 가상 메모리의 주소를 가지고 있고, 사용자가 insert/update를 수행하였다면 MongoDB는 해당 레코드가 가리키는 가상 메모리 주소 공간에 데이터를 적재한다. 만약 사용자가 특정 위치의 데이터를 읽는다면, MongoDB는 해당 메모리 주소 공간에 할당된 데이터가 가상 메모리에 로딩되어 있는지 확인하고, 로딩되어 있지 않다면 파일에서 내용을 읽어 가상 메모리에 적재한다.[3]

또한 MongoDB는 백그라운드로 가상 메모리에 적재된 데이터를 HDD에 최대 2GB 단위로 파일을 구성한 볼륨volume으로 HDD에 데이터를 적재한다. 이를 플러쉬flush를 수행한다고 하며, 주기적으로 가상 메모리 공간에 로딩된 데이터를 HDD에 저장한다.[4]

 


[1] 사용자는 use 명령을 이용하여 데이터베이스를 선택한다.

[2] 32비트 OS에서는 가상 메모리의 한계로 2G만 선택할 수 있다. 여기서 2G는 Windows가 예약한 32비트 User Area 공간의 크기이다.

[3] MongoDB는 이러한 작업을 Page Fault Exception이 발생할 때 수행한다.

[4] 디폴트 주기 값은 60초로 설정되어 있다.


  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
Categories: MongoDB Tags: ,
  1. 아직 댓글이 없습니다.
  1. 12:40에 7월 23rd, 2014 | #1
  2. 08:11에 7월 26th, 2014 | #2
  3. 11:11에 7월 29th, 2014 | #3
  4. 11:27에 8월 2nd, 2014 | #4
  5. 01:32에 8월 9th, 2014 | #5
  6. 05:13에 8월 13th, 2014 | #6
  7. 09:04에 8월 22nd, 2014 | #7
  8. 18:26에 8월 25th, 2014 | #8
  9. 02:49에 8월 26th, 2014 | #9
  10. 15:55에 8월 27th, 2014 | #10
  11. 04:06에 8월 29th, 2014 | #11
  12. 01:39에 8월 30th, 2014 | #12
  13. 14:01에 9월 5th, 2014 | #13
  14. 21:18에 9월 13th, 2014 | #14
  15. 12:36에 9월 14th, 2014 | #15
  16. 22:54에 9월 20th, 2014 | #16
  17. 02:36에 9월 24th, 2014 | #17
  18. 04:32에 9월 25th, 2014 | #18
  19. 22:40에 9월 26th, 2014 | #19
  20. 04:20에 10월 3rd, 2014 | #20
  21. 21:50에 10월 10th, 2014 | #21