MongoDB 란?
1. MongoDB 란?
MongoDB 란 스키마의 제약없이 json 형태로 document를 저장하는 오픈소스 NoSQL DB
No SQL? Not Only SQL?
NoSQL은 관계형 데이터베이스의 한계를 극복하기 위한 데이터 저장소의 새로운 형태로 수평적 확장성을 특징으로 한다.
관계형이 아니기 때문에 join이 없고 고정된 스키마를 갖지 않는다.대표적인 NoSQL 제품은 Google의 BigTable, Amazon의 Dynamo이 있고, 이외에 비롯해 다양한 오픈소스 제품이 소개되어 있다.
(BigTable, Dynamo, Cassandra, CouchDB, MongoDB, Hbase, Riak, Voldemort 등)구글의 BigTable paper에 보면 구글의 BigTable이 대체 무엇인지에 대해 간단하고 명료하게 기술하고 있다.
A Bigtable is a sparse, distributed, persistent multidimensional sorted map.
2. MongoDB 특징
- schemaless
정의된 스키마가 없고 Document(RDBMS 의 Row)와 Collection (RDBMS 의 Table) 의 개념만이 존재한다. 설계 및 개발시 유연하게 할 수 있으나, join 같은 복잡한 쿼리는 불가능하다. - scalability
MongoDB는 Big Data 의 개념으로 높은 확장 및 분산을 염두에 두고 설계되어 시스템 scale-out 이 용이하다. - 기능
- 다양한 Indexing 을 제공 : Unique Indexing, Composite Indexing, Geospatial Indexing 등
- 저장 자바 스크립트(Stored Javascript) 로 자바스크립트 함수와 값을 서버 단에 저장 가능
- 집계(Aggregation) : MapReduce를 비롯하여 다양한 집계 기능을 제공
- 제한 콜렉션(Capped Collection) : 크키가 제한된 콜렉션으로 새로운 문서 추가시 오래된 문서는 자동 삭제
- 파일 저장소(File Storage) : 큰 파일과 파일의 메타 데이터를 편리하게 저장할 수 있는 프로토콜 제공 -
High Performance
- HTTP/REST 보다 Binary Wire Protocol 을 기본으로 사용하여 통신에 오버헤드가 적다.Binary Wire Protocol
The HTTP-NG team proposed the Binary Wire Protocol to enhance how the next-generation HTTP protocol supports remote operations.HTTP-NG defines "object types" and assigns each object type a list of methods. Each object type is assigned a URI, so its description and methods can be advertised. In this way, HTTP-NG is proposing a more extensible and object-oriented execution model than that provided with HTTP/1.1, where all methods were statically defined in the servers.
- 데이터가 추가될 공간을 동적으로 미리 할당해 두어 저장소를 더 쓰더라도 일관된 성능을 유지할수 있으며 기본 저장소 엔진은 Memory Mapped File 을 사용한다.
- SQL 서버가 가장 빨리 쿼리를 실행하기 위하여 쿼리를 분석하고 최적화 하는 Query Optimizer 제공
3. 무엇이 불편한가?
- config server 에 부하 집중
- 현실적인 Spatial query 는 “Near”, “Box”, “Center” 연산만 지원합니다.
- 저장블럭이 2G 단위로 커집니다.
- 단편화된 저장공간을 모으는 것이 offline mode 에서만 가능합니다.
- 관리툴이 미흡해서 운영이 불편할 것 같네요.
document에는 sharding 관련해서 file index 가 config server 에 구성된다고 써있습니다.
config server에 병목이 발생되면, 대용량 분산 서버 구성도 말짱 헛일이 될 수 있습니다.
Auto-sharding을 구성하면서 반드시 config server 부하 테스트를 해보시길 바랍니다.
병목이 발생된다면, Hadoop 등으로 분산형 스토리지를 구축할 필요가 있을 것 같습니다.
Near 연산은 기준점에서 가장 가까운 것부터 출력해줍니다.
Box 연산은 사각형 내의 poi 를 출력해줍니다.
Center 연산은 원형의 반경내 poi 를 출력해줍니다.
polygon 내의 poi 검색은 현재 개발자 버전만 지원한다고 하지만, Indexing 생성이 제대로 되지 않는 등의 문제가 있었습니다.
아직까지 조정이 불가능합니다. 큰 불편은 아니지만, 알아두어야 할 것 같습니다.
64M, 128M, 512M,1G,2G,2G,2G…. 이렇게 블럭이 늘어납니다.
따라서, 한 개씩 disk를 offline 으로 떨구어 가면서 repair를 해야 합니다.
불편할 것 같네요. PC환경에서 테스트 시에는 1GB에 20분 정도 걸렸다고 합니다.
저장블럭은 2G씩 늘어나는데, 삭제가 많은 환경이면 Disk 낭비가 심할 것 같은데요.
빈번한 delete, insert 가 반복되는 환경에는 권하고 싶지 않습니다.
프로그래밍 할 때도 delete, insert 형식으로 데이터를 update하지 마세요.
많은 disk 를 repair하다 보면, 많이 헷갈릴 듯.
손토매틱(반대말 오토매틱)으로 하던지, 별도 개발을 해야 할 것 같습니다.
4. mongoDB 어떤 곳에 써야 하나?
- 기본적으로 하나의 table(collection)이 무한정 커지는 경우
- 쌓아놓기만 하고, 삭제가 적은 경우
collection 설계하고, shard 에 태우면 됩니다. 쉽죠? 오라클은 partitioning table, archive backup, hot backup/recovery 이런거에 신경써야 하는 반면, mongo db는 disk 하나를 더 끼우고 configuration에 더해주면 끝입니다.
어떤 경우가 하나의 table 이 무한정 커지는 경우일까요?
“로그 데이터”에 적용하면 좋겠네요.
파일로그를 분석 하려면 어차피 DB에 넣어야 하는데, 기가급이 넘어가도 Handling 이 쉽지 않죠.
“회원정보 테이블”에 좋겠네요.
물론 회원수가 일정하면 상관없겠지만, Foursquare나 Facebook 같은 글로벌 서비스의 경우는 회원수 관리하기가 만만치 않을 듯.
“메시징 데이터 테이블”도 좋겠네요.
하루에도 수억 건씩 쌓이니까요.
delete가 많은 거대 데이터라면 주기적으로 repair 를 해야 하는데, 서버 환경이나 운영에 드는 손 씀씀이로 볼 때, 현실적으로 가능할까 싶습니다.
쌓아놓기만 하고, 삭제가 적은 경우가 어떤 경우일까요?
“오래된 음원 DB”를 만들 때는 좋겠군요.
값싼 Disk 에 오랫동안 많이 넣어두면 보관하기 좋고, read/write 성능도 떨어지지 않을 듯.
CDDB나 bugs 같은 곳은 좋을 듯.
“poi” 나 “check-in” 데이터를 넣어두기 좋겠네요.
많은 상점들이 사라졌다 생겼다 하겠지만, foursquare 와 같은 user check-in 데이터들은 거의 삭제할 이유가 없으니(데이터가 재산인 사업환경), 정말 딱 적합하다는 생각이 듭니다.
MongoDB 어떻게 사용할 것인가?
http://dev.paran.com/2011/09/15/how-to-use-mongo-db/
포스퀘어(foursquare)가 MongoDB를 선택한 이유 : Auto-Sharding
http://dev.paran.com/2011/07/08/mongodb-atfoursquare-biggest-reason-auto-sharding/
MongoDB 초보자를 위한 보안 관련 Tips
http://dev.paran.com/2011/06/22/mongodb-security-tips-for-beginners/
참고문헌