-
What is MongoDB?Database/MongoDB 2023. 2. 1. 20:20
MongoDB 4.4 를 기준 정리사항입니다.
MongoDB 란?
- 몽고DB(MongoDB)는 크로스 플랫폼 도큐먼트 지향 데이터베이스 시스템입니다.
- NoSQL 데이터베이스로 분류되는 몽고DB는 JSON과 같은 동적 스키마형 도큐먼트들(몽고DB는 이러한 포맷을 BSON이라 부름)을 선호함에 따라 전통적인 테이블 기반 관계형 데이터베이스 구조의 사용을 삼가합니다.
- GPL과 아파치 라이선스를 결합하여 공개된 몽고DB는 자유-오픈 소스 소프트웨어
- 회사인 10gen (현재의 몽고DB)에서 2007년 10월, 계획된 PaaS(서비스형 플랫폼) 제품의 구성 요소로 처음 개발하였으며 10gen이 상용 지원 및 기타 서비스를 제공한 2009년에 오픈 소스 개발 모델로 전향
- 몽고DB는 크레이그리스트, 이베이, 포스퀘어, 소스포지, 뉴욕 타임즈, 구글, 페이스북와 같은 수많은 주요 웹사이트 및 서비스에 백엔드 소프트웨어로 채택되고 있으며 몽고DB는 가장 유명한 NoSQL 데이터베이스 시스템
- Document Model 에서는 제일 많이 사용되고 있는 제품
MongoDB 제품
제품 가격 플랫폼 라이센스 Community 무료 Server, PC SSPL, AGPL v3(4.0.3, 4.1.4) Enterprise 스펙에 따른 과금 Server, PC 상용 Altas Free[512MB Disk, Shared Resource] 이후 Spec 에 따른 과금 Cloud ( AWS, Azure, gcloud ) 상용 Realm 접속량, 사용량에 따른 과금 Mobile 상용 Enterprise의 Community외 추가기능 MongoDB 용어
SQLMongoDB
database database table Collection row Document column field index index MongoDB vs Mysql 용어 주요기능
- Adhoc Query
- 특정한 형식이 없는 쿼리를 일컫습니다.
- 기존 SQL 문이 아닌 JS를 이용한 함수구현연결 쿼리, 범위쿼리, 정규식 검색 등을 통한 쿼리를 사용합니다.
- 색인 (Indexing)
- 프라이머리(primary) 인덱스와 세컨더리(secondary) 인덱스로 인덱싱 할 수 있습니다.
- 한 Collection 에 64개까지 인덱싱 가능합니다.
- ReplicaSet
- Primary-Secondary ( Master-Slave ) 구조를 가진 복제기능을 제공합니다.
- 최소 3대 이상, 홀수로 구성할 것을 권장합니다. 레플리카셋이 프라이머리와 세컨더리 둘만으로 구성되어 있는 경우에는 프라이머리에서 장애가 발생했을때 세컨더리 노드만 남게되고 레플리카 셋의 다수의 멤버 투표를 할수 없는 상황이 만들어지며, 세컨더리는 고립된 노드로 남기 때문에 레플리카 셋이 정상적으로 동작하지 않게 됩니다. 만약 상황이 여의치 않을때 DB로 사용할 수 있는 노드가 2개로 제한되어 있으면, 기타 다른 용도의 노드에 아비터를 구성해 선거권만 주면 2대의 DB노드로도 레플리카 셋을 구성하는 것은 가능합니다.
- Load Balancing
- 샤딩을 사용하여 수직 혹은 수평으로 스케일링 합니다. 이때 ConfigServer 와 메인 라우팅기능을 할 mongos 가 필요합니다.
- File Storage
- 몽고DB는 파일 저장을 위해 여러 머신에 로드 밸런싱, 데이터 리플리케이션 기능과 더불어 GridFS라는 이름의 파일 시스템으로 사용할 수 있다. 이 기능은 그리드 파일 시스템이라고 부르며 몽고DB 드라이버에 포함되어 있다. 몽고DB는 파일 조작의 기능과 콘텐츠를 개발자들에게 노출한다. GridFS는 mongofiles 유틸리티나 Ngnix 플러그인, Lighttpd를 사용하여 접근할 수 있다. GridFS는 파일 하나를 여러 부분이나 덩어리(chunk)로 분리시키며 해당 덩어리들 각각을 별도의 도큐먼트로 저장한다
- Aggreation
- 몽고DB는 애그리게이션 수행을 위해 3가지 수단을 제공한다: 애그리게이션 파이프라인(aggregation pipeline), 맵리듀스 기능(map-reduce function), 단일 목적 애그리게이션 방식(single-purpose aggregation method). 데이터 처리와 애그리게이션 조작을 위해 맵리듀스를 사용할 수 있다. 그러나 몽고DB의 문서에 따르면 애그리게이션 파이프라인이 대부분의 애그리게이션 조작에 더 나은 성능을 제공한다. 애그리게이션 프레임워크를 사용하면 사용자들이 SQL GROUP BY 절이 사용되는 결과의 종류를 취득할 수 있다. 애그리게이션 연산자들은 하나로 묶어서 하나의 파이프라인을 형성할 수 있는데, 이는 유닉스 파이프와 비슷하다. 애그리게이션 프레임워크는 여러 도큐먼트로부터 도큐먼트들을 조인(join)할 수 있는 $lookup 연산자를 포함하고 있으며 표준 편차 등의 통계 연산자를 포함한다.
- Server Side JS Excute
- 자바스크립트를 쿼리, 애그리게이션 기능(맵리듀스 등)에 사용할 수 있으며 직접 데이터베이스로 보내어 실행할 수 있다.
- Capped Collection
- 캡트 컬렉션(capped collection)이라는 이름의 고정 크기의 컬렉션을 지원한다. 이러한 유형의 컬렉션은 삽입 순서를 관리하고 특정 크기에 도달하면 원형 버퍼처럼 동작하게 만들 수 있다.
- 트랜잭션
- 멀티 도큐먼트 ACID 트랜잭션 지원이 2018년 6월 4.0 릴리스의 GA(General Availability)와 더불어 몽고DB에 추가되었다.
MongoDB 제한사항
Document 제한
- 1개의 Document 의 최대크기는 16MB 입니다.
- Document 의 Depth는 100 이상 불가능합니다.
명명 제한
- Database 명은 대소문자를 다르게 동일한 명으로 생성할 수 없습니다.
- Windows 에서 MongoDB 를 사용할 경우 Database명에 /\. "$*<>:|? 를 사용할 수 없습니다.
- Linux & Unix 에서 MongoDB 를 사용할 경우 Database명에 /\. "$ 를 사용할 수 없습니다.
- Database 명은 무명일 수 없으며 최대 64자 미만이어야 합니다.
- Collection 명은 _ 또는 문자로 시작해야하며 다음을 사용할 수 없습니다. $, 빈문자, Null문자, System.
- Database.Collection 길이는 255byte(4.4 이전버전은 120byte) 로 제한됩니다.
- 필드명은 'Null문자' 를 포함할 수 없습니다.
- 필드명은 '$' 로 시작할 수 없습니다.
- 필드명은 중복될 수 없습니다.
Index 제한
- 인덱스의 길이는 1024byte 미만이어야 합니다.
- 하나의 Collection 에 64개까지만 인덱스를 추가할 수 있습니다.
- 복합 인덱스의 경우 필드는 총 31개까지 지원됩니다.
- 인덱스명은 127byte를 초과할 수 없습니다.
- GPS인덱스와 Text인덱스는 결합하여 사용할 수 없습니다.
- GPS인덱스 중 2dsphere 를 쓰는 경우 GeoJson 포멧을 사용해야합니다.
- 멀티키 인덱스는 배열 필드에 대한 쿼리에 사용할 수 없습니다.
- GPS인덱스는 쿼리에 포함할 수 없습니다.
- 인덱스의 크기는 최대 200MB 이며, 옵션을 통해 변경 혹은 무시 할 수 있습니다. 다만 환경사양에 비하여 높게 설정할 경우 메모리가 오버플로우되며 서버가 강제종료 될 수 있습니다.
- Text, GPS 인덱스는 이진비교만 지원하고 정렬에는 지원되지 않습니다.
Collection 제한
- Capped Collection 의 경우 2의 32승보다 최대 Document 수량이 작아야합니다.
ReplicaSet 제한
- ReplicaSet의 구성은 최대 50개로 구성할 수 있습니다.( Primary, Secondary, Abitor 합산 )
- Abitor 는 최대 7개까지 지원됩니다.
- Oplog 크기를 명시적으로 지정하지 않으면 최대 50GB 까지 적재됩니다.
Sharding 제한
- sharded collection은 $where 기능에서 DB개체에 대한 참조를 허용하지 않습니다.
- geoSearch 기능은 사용할 수 없습니다.
- sharding 환경에서 MongoDB는 전체 shards 기준 index의 unique를 보장하지 않으며 만약 해당 index가 prefix로 전체 shard key를 포함한다면 unique 보장합니다.
- shard 환경에서 update/remove시 query에 반드시 shard key 또는 _id가 포함되어 있어야 합니다.
- 데이터가 존재하는 collection을 shard 할 경우 초기 분할 작업이 이루어지며, 분할 작업시 제한은 샤드키의 평균값과 청크의 크기를 기준으로 아래와 같은 계산식을 통해 추정할 수 있습니다.
maxSplits = 16777216 (bytes) / <average size of shard key values in bytes> maxCollectionSize (MB) = maxSplits * (chunkSize / 2)
Avarage Size Of Shard Key Values512 bytes256 bytes128 bytes64 bytes
Maximum Number Of Splits 32,768 65,536 131,072 262,144 Max Collection Size (64MB Chunk Size) 1TB 2TB 4TB 8TB Max Collection Size (128MB Chunk Size) 2TB 4TB 8TB 16TB Max Collection Size (256MB Chunk Size) 4TB 8TB 16TB 32TB - sharded Collection 은 고유 인덱스가 샤드키를 포함하는 경우를 제외하고는 고유 인덱스를 지원하지 않습니다.
- sharded Collection 의 Document 수가 "청크 크기 / 평균 문서 크기" 로 나눈 결과의 1.3배 이상 클 경우 청크를 이동하거나 마이그레이션 작업을 할 수 없습니다.
Shard Key 제한
- 4.2버전 이하에서는 512byte를 초과할 수 없습니다.
- Shard Key 는 MultiKey, Text, GPS 인덱스가 될 수 없습니다.
- 4.2버전 이하에서는 샤드키를 변경할 수 없습니다. 변경이 필요한 경우 Dump -> 삭제 -> 생성 -> 복원 순으로 재생성 해야합니다.
- 정방향이든 역방향이든 단순증가 shard key는 insert시에 단일 shard의 단일 chunk에만 insert 되므로 병목이 될 수 있으며 해결할려면 shard key를 잘 조합하던가, 아니면 hashed shard key를 이용할 것을 권고합니다.
Operation 제한
- Index를 통한 정렬을 할 수 없는 경우 100MB (4.2이하 32MB) 이내의 메모리를 사용할 경우에만 결과를 반환하며, 초과시에는 오류를 반환합니다. 초과하였을 때 디스크의 임시파일에 저장하는 동작을 통하여 시스템 메모리를 초과하는 데이터를 저장할 수 있습니다. (cursor.allowDiskUse()allowDiskUse())
- Aggregation 동작의 메모리 사용제한은 100MB 입니다. 만약 그 이상을 처리하기 위해서 allowDiskUse 를 켜면, $graphLookup 은 무시됩니다.
- $out은 읽기와 동시에 사용할 수 없습니다
- $merge는 읽기와 동시에 사용할 수 없습니다.
- Geospatial Query는 $or 을 사용할 수 없습니다. (2dsphere)
- Geospatial 의 위도는 -180 ~ 180, 경도는 -90 ~ 90 으로 제한됩니다.
- 분산처리 시 capped Collection 에는 사용할 수 없습니다.
- 분산처리 시 Collection 의 config, admin 정보 및 local Database 정보를 읽거나 쓸 수 없습니다.
- 분산처리 시 system.* collection은 쓰기동작을 할 수 없습니다.
- 분산처리 시 explain query는 사용할 수 없습니다.
- 분산처리 시 cursor를 생성하여 사용하는 경우 트랜젝션에서 getMore 는 사용할 수 없습니다.
- 분산처리 시 KillCursors 를 처음 호출할 수 없습니다.
- 트렌젝션은 기본 60초의 실행제한시간이 있습니다.
- Batch 동작시 10만줄로 제한됩니다.
- View 정의에는 $out, $merge 가 포함될 수 없습니다.
- View는 읽기 전용으로 이름변경이 불가능하고 텍스트 인덱스를 지원하지 않습니다.
- View는 find 작업시 $, $elemMatch, $slice, $meta, $geoNear 를 지원하지 않습니다.
Session 제한
- 인증(LDAP, x509, Kerberos 등) 을 사용한 세션연결시 $external 사용자명은 10kb 를 초과할 수 없습니다.
- 30분 동안 읽기/쓰기 작업을 수신하지 않은 세션은 만료됩니다. 읽기/쓰기와 무관하게 지속적인 연결이 필요한 경우 refreshSessions 를 주기적으로 호출해줌으로써 세션갱신을 처리하도록 해야 합니다.
Shell 제한
- 쉘 프롬프트는 각 라인에 대한 4095 개 코드 포인트의 제한이 있습니다. 코드 포인트가 4095 개 이상인 줄을 입력하면 쉘이 해당 줄을 자릅니다.