SlideShare a Scribd company logo
1 of 29
Download to read offline
아꿈사
                               http://cafe.naver.com/architect1
                                                     최성기
                                          florist.sk@gmail.com



MongoDB 완벽가이드
7장 : 고급 기능 (Advanced Topics)
7장 ‘고급기능’은
아래 5가지 주제에 대해 설명한다.

    1.   DB 명령어
    2.   제한 컬렉션
    3.   GridFS
    4.   Server-side 스크립팅
    5.   DBRef : 데이터베이스 참조
1. DB 명령어
- db.runCommand(…).. 수행 원리와 대표 명령어들.


     1.   DB 명령어
     2.   제한 컬렉션
     3.   GridFS
     4.   Server-side 스크립팅
     5.   DBRef : 데이터베이스 참조
db.runCommand( { 명령 문서 } )
  이런 형식의 명령어를 3장에서 이미 만났던 적이 있다.


  { getLastError : 1 }
  마지막 명령어로 영향받은 문서의 수를 확인


  { findAndModify : ‘…’, ... }
  한 번의 연산으로 문서를 찾고 수정한다.


               그 뒤로도 매 장마다 이미 신나게 사용함.
                                   아이 씐나 ~
쉘에서 함수 형태로 제공되는 다른 명령어들도
 내부적으로는 db.runCommand()를 거쳐서 실행된다.


  함수형 명령           runCommand 명령
  db.test.drop()   db.runCommand( {“drop” : “test”} )


> db.test.drop()     > db.runCommand({"drop" : "test"});
true                 {
                     "nIndexesWas" : 1,
                     "msg" : "indexes dropped for collection",
                     "ns" : "test.test",
                     "ok" : 1 (책에는 true로 나온다)
                     }
책이 쓰인 시점에서 명령어는 약 75개,
 자료 작성시점 1.8.2 버전 기준으로 약 100여 개가 된다.

 shell 명령어 확인 : db.listCommands()
 관리자 웹페이지 : http://localhost:28017/_commands


너무 휙 지나감. 볼 수가 없어…        웹페이지 도움말이 펴놓고 참고하기 좋다.
유용한 명령어들만 몇 개 모아보자면…
{ “collStats” : 컬렉션 이름 }
컬렉션 데이터 크기, 할당 공간 용량, 인덱스 크기 통계.

{ “ping” : 1 }
서버가 살아있는지 확인. 잠금 상태여도 바로 리턴된다.

{ “renameCollection” : 컬렉션 이름, “to” : 새 이름 }
컬력션 이름을 변경한다.

{ “repairDatabase” : 1 } { “serverStatus” : 1 }
DB 복구 명령 / 서버 모니터링 통계 수치. 8장에서 다룬다.
2. 제한 컬렉션
- Capped Collections : 사이즈가 고정된 특수한 컬렉션.


     1.   DB 명령어
     2.   제한 컬렉션
     3.   GridFS
     4.   Server-side 스크립팅
     5.   DBRef : 데이터베이스 참조
제한 컬렉션은 circular queue처럼 동작한다.
크기 고정. 가득 찬 상태에서 문서 추가 시 가장 오래된 문서가 삭제된다.




   공간이 있을 때는 입력 순서대로 들어가다가...   큐가 꽉 차면 가장 오래된 문서가 새 문서로 대체된다.
제한 컬렉션의 제약

 - 문서 삭제 불가능.
 - 문서 수정 불가능.
 - 색인 생성 불가능.

    … 결국 데이터를 추가 하고 (순서대로) 읽어내는 데에만 특화.
제한 컬렉션의 속성
- 입력 속도가 매우 빠르다.
 추가공간 할당/관리 등이 필요 없음.


- 입력 순서대로 뽑는 쿼리가 매우 빠르다.
 이미 디스크상에 입력 순서대로 존재하고 있기 때문.


- Age-Out(에이지 아웃)
 오래된 데이터는 자동으로 제거.
제한 컬렉션의 생성
일반 컬렉션은 자동으로 생성되기도 하지만
제한 컬렉션은 꼭 명시적으로 생성 되어야 한다.



db.createCollection(
      컬렉션이름, { capped:true, size:100000 } );


db.createCollection(
컬렉션이름, { capped:true, size:100000, max:100 } );
제한 컬렉션의 생성
이미 존재하는 일반 컬렉션을 제한 컬렉션으로
변환하는 것도 가능하다.



db.runCommand(
     { “convertToCapped” : 컬렉션이름, size : 10000 } )
자연스럽게 정렬하기
- sorting as natural : 입력 순서나 입력 반대 순서로 매우 빨리 정렬.


 > db.my_collection:find().sort( { “$natural” : 1 } );




 문서 입력 순서 { “$natural” : 1 }       입력 반대 순서 { “$natural” : -1 }
꼬리를 무는 커서
 - Tailable Cursors

결과를 모두 꺼냈을 때도 종료되지 않는 커서.
새 데이터가 추가되면 바로 새로운 결과를 꺼낼 수 있다.
제한된 컬렉션에서만 사용 가능.
드라이버마다 사용법은 조금 다르다.
3. GridFS
- 파일 시스템 : MongoDB에 대용량 이진파일 저장하기.


     1.   DB 명령어
     2.   제한 컬렉션
     3.   GridFS
     4.   Server-side 스크립팅
     5.   DBRef : 데이터베이스 참조
GridFS의 장점
어플리케이션 구조 단순화
파일 저장을 위한 다른 아키텍쳐를 사용할 것 없이 한 저장소에 같이 저장.


복제, 자동 조각화 사용 가능
DB를 위한 복제/조각화 기능 이용 가능. 장애 복구와 분산 확장에 용이.


특정 파일시스템의 문제를 피한다.
같은 디렉터리에 대량의 파일을 저장해도 문제가 발생하지 않는다.


높은 디스크 지역성(locality)
2Gb 청크로 데이터파일을 할당.
mongofiles.exe                              GridFS 유틸리티
커맨드라인 명령으로 GridFS를 다룰 수 있다.

   D:> mongofiles put foo.txt
   connected to: 127.0.0.1
   added file: { _id:
   ObjectId('4c0d2a6c3052c25545139b88'),
   filename: "foo.txt", length: 13, chunkSize: 262144,
   uploadDate: new Date(1275931244818),
   md5: "a7966bf58e23583c9a5a4059383ff850" }
   done!
   D:> mongofiles list
   connected to: 127.0.0.1
   foo.txt 13
   D:> mongofiles get foo.txt
   connected to: 127.0.0.1
   done write to: foo.txt
각 언어별 드라이버마다 GridFS를 다루는 인터페이스 제공.

C 인터페이스의 파일 올리기 :
gridfs_offset gridfile_write_file(gridfile* gfile, FILE* stream);
void gridfile_write_buffer( gridfile* gfile, const char* data, … );


C++ 인터페이스의 파일 올리기 :
GridFS 대부분의 작업은 클라이언트 드라이버가 처리한다.
서버는 거들 뿐…


                   fs.files 컬렉션
                   { 파일 헤더 }

                   fs.chunks 컬렉션
                   { 파일 데이터 0 }
    binary
                   { 파일 데이터 1 }
                   { 파일 데이터 2 }
클라이언트 이진 파일              :
                   { 파일 데이터 N }
4. Server-side 스크립팅
- 서버에서 실행되는 자바스크립트. 저장 프로시저와 유사.


    1.   DB 명령어
    2.   제한 컬렉션
    3.   GridFS
    4.   Server-side 스크립팅
    5.   DBRef : 데이터베이스 참조
db.eval()                      스크립트를 서버에 보내고 결과를 받는다.


코드나 함수를 보내면 된다. 인자를 전달해야 할 때 함수를 넘기자.

  > db.eval("return 1;")
  1

  > db.eval("function() { return 1; }")
  1

  > db.eval("function(u) { print('Hello, '+u+'!'); }", [username])
  null (값을 리턴하는 함수가 아니다. 메시지는 서버 로그에 찍힌다.)

  > db.eval("function(x,y,z) { return x + y + z; }", [num1, num2, num3])
  ...
system.js                           자바스크립트 변수를 저장하는 특수 컬렉션


 >   db.system.js.insert({"_id" : "x", "value" : 1})
 >   db.system.js.insert({"_id" : "y", "value" : 2})
 >   db.system.js.insert({"_id" : "z", "value" : 3})
 >   db.eval("return x+y+z;")
 6

 > db.system.js.insert({"_id" : "log", "value" :
     function(msg, level) {
     var levels = ["DEBUG", "WARN", "ERROR", "FATAL"];
     level = level ? level : 0; // check if level is defined
     var now = new Date();
     print(now + " " + levels[level] + msg);
     }})
 > db.eval("x = 1; log('x is '+x); x = 2; log('x is greater than 1', 1);");
Note: Security
클라이언트가 명령어를 보낼 때, 인젝션 공격 가능성에 주의해야 한다.

  > func = "function() { print('Hello, "+username+"!'); }"

  // username 변수에 “); db.dropDatabase(); print(“가 들었다면…

  > func = "function() { print('Hello, '); db.dropDatabase(); print('!'); }"
  > db.eval( func )

  서버로그 :             Hello, !
  Shell :            { “dropped” : my_collection, “ok” : 1 }



 대부분의 드라이버는 DB에 코드를 보낼 때 특수 형태를 사용한다.
 C++ 드라이버엔 없는 듯…? 아무튼 코드 작성자가 신경 써야 함.
5. DBRef : 데이터베이스 참조
- 한 문서가 다른 문서를 참조하기 위한 방법 중 하나.


    1.   DB 명령어
    2.   제한 컬렉션
    3.   GridFS
    4.   Server-side 스크립팅
    5.   DBRef : 데이터베이스 참조
DBRef                    MongoDB의 문서를 고유하게 식별하고 참조한다.

한 컬렉션 내에서(혹은 다른 DB에서도)
특정 문서를 참조할 수 있도록 하는 내장 문서(embedded document).

  { “$ref” : collection, “$id” : id_value }
  { “$ref” : collection, “$id” : id_value, “$db“ : database }

 {"_id" : 5, "author" : "mike", "text" : "MongoDB is fun!"}
 {"_id" : 20, "author" : "kristina", "text" : "... and DBRefs are easy, too",
 "references": [{"$ref" : "users", "$id" : "mike"}, {"$ref" : "notes", "$id" : 5}]}


forign key등의 개념이 약한 점을 위해 뭔가 만드는 중인 듯.
개발 편의를 고려한 기능으로 보이나 아직 많이 모자라다.
책에도 굉장히 자신감 없는 어투로 설명되어있다. (본질적이지 않다. 안써도 된다… -_-;; )
Driver     support for DBRef
서버에서는 DBRef에 대한 예외처리가 없는듯.
대부분 클라이언트의 드라이브 구현에 달려있다.

좋은 예 : DBRef로 참조한 문서에서 자동 역참조 지원.
나쁜 예 : DBRef를 내장문서가 아닌 일반 문서로 처리. 그냥 無...



  결국 어느 언어로 된 드라이버를
  쓰느냐가 중요하다는 건데…
Driver          support for DBRef

 http://www.mongodb.org/display/DOCS/Database+References 에서
 언어별 드라이버의 지원 여부와 정보를 확인할 수 있다.


                                    기대를 저버리지 않고
                                 C++은 지원하지 않는다.
                                 나쁜 예! 그냥        無!...
MongoDB 완벽가이드
7장 : 고급 기능 끄읕.

More Related Content

What's hot

Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]MongoDB
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개흥배 최
 
Mongo DB로 진행하는 CRUD
Mongo DB로 진행하는 CRUDMongo DB로 진행하는 CRUD
Mongo DB로 진행하는 CRUDJin wook
 
Redis data design by usecase
Redis data design by usecaseRedis data design by usecase
Redis data design by usecaseKris Jeong
 
Mongo db 활용 가이드 ch7
Mongo db 활용 가이드 ch7Mongo db 활용 가이드 ch7
Mongo db 활용 가이드 ch7주영 송
 
몽고디비교육1일차
몽고디비교육1일차몽고디비교육1일차
몽고디비교육1일차seung-hyun Park
 
Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Minchul Jung
 
Mongo db 복제(Replication)
Mongo db 복제(Replication)Mongo db 복제(Replication)
Mongo db 복제(Replication)Hyosung Jeon
 
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항Minchul Jung
 
201804 neo4 j_cypher_guide
201804 neo4 j_cypher_guide201804 neo4 j_cypher_guide
201804 neo4 j_cypher_guideJunyi Song
 
엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나종민 김
 
Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터jinho park
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XpressEngine
 
하둡 좋은약이지만 만병통치약은 아니다
하둡 좋은약이지만 만병통치약은 아니다하둡 좋은약이지만 만병통치약은 아니다
하둡 좋은약이지만 만병통치약은 아니다민철 정민철
 
Apache solr소개 20120629
Apache solr소개 20120629Apache solr소개 20120629
Apache solr소개 20120629Dosang Yoon
 
검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민종민 김
 
이것이 레디스다.
이것이 레디스다.이것이 레디스다.
이것이 레디스다.Kris Jeong
 
[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습smartstudy_official
 

What's hot (20)

Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
 
Mongo DB로 진행하는 CRUD
Mongo DB로 진행하는 CRUDMongo DB로 진행하는 CRUD
Mongo DB로 진행하는 CRUD
 
Redis data design by usecase
Redis data design by usecaseRedis data design by usecase
Redis data design by usecase
 
Mongo db 활용 가이드 ch7
Mongo db 활용 가이드 ch7Mongo db 활용 가이드 ch7
Mongo db 활용 가이드 ch7
 
몽고디비교육1일차
몽고디비교육1일차몽고디비교육1일차
몽고디비교육1일차
 
Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작Ch1 일래스틱서치 클러스터 시작
Ch1 일래스틱서치 클러스터 시작
 
Mongo db 복제(Replication)
Mongo db 복제(Replication)Mongo db 복제(Replication)
Mongo db 복제(Replication)
 
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
 
201804 neo4 j_cypher_guide
201804 neo4 j_cypher_guide201804 neo4 j_cypher_guide
201804 neo4 j_cypher_guide
 
엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나
 
Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터
 
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
XECon+PHPFest2014 발표자료 - ElasticSearch를 이용한 통합검색 구축방법 - 김훈민
 
하둡 좋은약이지만 만병통치약은 아니다
하둡 좋은약이지만 만병통치약은 아니다하둡 좋은약이지만 만병통치약은 아니다
하둡 좋은약이지만 만병통치약은 아니다
 
Apache solr소개 20120629
Apache solr소개 20120629Apache solr소개 20120629
Apache solr소개 20120629
 
검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민
 
이것이 레디스다.
이것이 레디스다.이것이 레디스다.
이것이 레디스다.
 
하둡관리
하둡관리하둡관리
하둡관리
 
elasticsearch
elasticsearchelasticsearch
elasticsearch
 
[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습[스마트스터디]MongoDB 의 역습
[스마트스터디]MongoDB 의 역습
 

Similar to [110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'

Node.js DBMS short summary
Node.js DBMS short summaryNode.js DBMS short summary
Node.js DBMS short summaryHoChul Shin
 
MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기Seongkuk Park
 
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기sung ki choi
 
log-monitoring-architecture.pdf
log-monitoring-architecture.pdflog-monitoring-architecture.pdf
log-monitoring-architecture.pdfSungkyun Kim
 
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDBNAVER D2
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기OnGameServer
 
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석smartstudy_official
 
비동기 파일 로딩
비동기 파일 로딩비동기 파일 로딩
비동기 파일 로딩Bongseok Cho
 
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016Amazon Web Services Korea
 
Hadoop Introduction (1.0)
Hadoop Introduction (1.0)Hadoop Introduction (1.0)
Hadoop Introduction (1.0)Keeyong Han
 
[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)NAVER D2
 
Redis Overview
Redis OverviewRedis Overview
Redis Overviewkalzas
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드cranbe95
 
ITs 2주차_기본명령어(발표)
ITs 2주차_기본명령어(발표)ITs 2주차_기본명령어(발표)
ITs 2주차_기본명령어(발표)Chulgyu Shin
 
DBMS 아키텍처
DBMS 아키텍처DBMS 아키텍처
DBMS 아키텍처HaksunLEE6
 

Similar to [110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능' (20)

Node.js DBMS short summary
Node.js DBMS short summaryNode.js DBMS short summary
Node.js DBMS short summary
 
MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기
 
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
 
log-monitoring-architecture.pdf
log-monitoring-architecture.pdflog-monitoring-architecture.pdf
log-monitoring-architecture.pdf
 
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
 
HDFS Overview
HDFS OverviewHDFS Overview
HDFS Overview
 
Git
Git Git
Git
 
비동기 파일 로딩
비동기 파일 로딩비동기 파일 로딩
비동기 파일 로딩
 
Kubernetes
Kubernetes Kubernetes
Kubernetes
 
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
 
Hadoop Introduction (1.0)
Hadoop Introduction (1.0)Hadoop Introduction (1.0)
Hadoop Introduction (1.0)
 
[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)[211] HBase 기반 검색 데이터 저장소 (공개용)
[211] HBase 기반 검색 데이터 저장소 (공개용)
 
SPARK SQL
SPARK SQLSPARK SQL
SPARK SQL
 
Redis Overview
Redis OverviewRedis Overview
Redis Overview
 
AWS RDS, DYNAMO
AWS RDS, DYNAMOAWS RDS, DYNAMO
AWS RDS, DYNAMO
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
 
ITs 2주차_기본명령어(발표)
ITs 2주차_기본명령어(발표)ITs 2주차_기본명령어(발표)
ITs 2주차_기본명령어(발표)
 
DBMS 아키텍처
DBMS 아키텍처DBMS 아키텍처
DBMS 아키텍처
 

More from sung ki choi

[아꿈사] 게임 기초 수학 물리 1,2장
[아꿈사] 게임 기초 수학 물리 1,2장[아꿈사] 게임 기초 수학 물리 1,2장
[아꿈사] 게임 기초 수학 물리 1,2장sung ki choi
 
[120316] node.js 프로그래밍 5장
[120316] node.js 프로그래밍 5장[120316] node.js 프로그래밍 5장
[120316] node.js 프로그래밍 5장sung ki choi
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
[111217 아꿈사연말모임] 웹소켓과온라인게임
[111217 아꿈사연말모임] 웹소켓과온라인게임[111217 아꿈사연말모임] 웹소켓과온라인게임
[111217 아꿈사연말모임] 웹소켓과온라인게임sung ki choi
 
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.sung ki choi
 
[아꿈사/110903] 도메인주도설계 4장
[아꿈사/110903] 도메인주도설계 4장[아꿈사/110903] 도메인주도설계 4장
[아꿈사/110903] 도메인주도설계 4장sung ki choi
 
[아꿈사/110528] 멀티코어cpu이야기 5,6장
[아꿈사/110528] 멀티코어cpu이야기 5,6장[아꿈사/110528] 멀티코어cpu이야기 5,6장
[아꿈사/110528] 멀티코어cpu이야기 5,6장sung ki choi
 
[아꿈사/110514] 멀티코어cpu이야기 시작발표
[아꿈사/110514] 멀티코어cpu이야기 시작발표[아꿈사/110514] 멀티코어cpu이야기 시작발표
[아꿈사/110514] 멀티코어cpu이야기 시작발표sung ki choi
 
[110331] visual studio 속성 관리자
[110331] visual studio 속성 관리자[110331] visual studio 속성 관리자
[110331] visual studio 속성 관리자sung ki choi
 
100828 [visual studio camp #1] C++0x와 Windows7
100828 [visual studio camp #1] C++0x와 Windows7100828 [visual studio camp #1] C++0x와 Windows7
100828 [visual studio camp #1] C++0x와 Windows7sung ki choi
 
110212 [아꿈사발표자료] taocp#1 1.2.8. 피보나치수열
110212 [아꿈사발표자료] taocp#1 1.2.8. 피보나치수열110212 [아꿈사발표자료] taocp#1 1.2.8. 피보나치수열
110212 [아꿈사발표자료] taocp#1 1.2.8. 피보나치수열sung ki choi
 
101102 endofdb select.1_rdbms
101102 endofdb select.1_rdbms101102 endofdb select.1_rdbms
101102 endofdb select.1_rdbmssung ki choi
 
100526 windows7 mfc_최성기_배포용
100526 windows7 mfc_최성기_배포용100526 windows7 mfc_최성기_배포용
100526 windows7 mfc_최성기_배포용sung ki choi
 
100511 boost&tips 최성기
100511 boost&tips 최성기100511 boost&tips 최성기
100511 boost&tips 최성기sung ki choi
 
Touch Ux With Win32
Touch Ux With Win32Touch Ux With Win32
Touch Ux With Win32sung ki choi
 

More from sung ki choi (15)

[아꿈사] 게임 기초 수학 물리 1,2장
[아꿈사] 게임 기초 수학 물리 1,2장[아꿈사] 게임 기초 수학 물리 1,2장
[아꿈사] 게임 기초 수학 물리 1,2장
 
[120316] node.js 프로그래밍 5장
[120316] node.js 프로그래밍 5장[120316] node.js 프로그래밍 5장
[120316] node.js 프로그래밍 5장
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
[111217 아꿈사연말모임] 웹소켓과온라인게임
[111217 아꿈사연말모임] 웹소켓과온라인게임[111217 아꿈사연말모임] 웹소켓과온라인게임
[111217 아꿈사연말모임] 웹소켓과온라인게임
 
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.
[111015/아꿈사] HTML5를 여행하는 비(非) 웹 개발자를 위한 안내서 - 1부 웹소켓.
 
[아꿈사/110903] 도메인주도설계 4장
[아꿈사/110903] 도메인주도설계 4장[아꿈사/110903] 도메인주도설계 4장
[아꿈사/110903] 도메인주도설계 4장
 
[아꿈사/110528] 멀티코어cpu이야기 5,6장
[아꿈사/110528] 멀티코어cpu이야기 5,6장[아꿈사/110528] 멀티코어cpu이야기 5,6장
[아꿈사/110528] 멀티코어cpu이야기 5,6장
 
[아꿈사/110514] 멀티코어cpu이야기 시작발표
[아꿈사/110514] 멀티코어cpu이야기 시작발표[아꿈사/110514] 멀티코어cpu이야기 시작발표
[아꿈사/110514] 멀티코어cpu이야기 시작발표
 
[110331] visual studio 속성 관리자
[110331] visual studio 속성 관리자[110331] visual studio 속성 관리자
[110331] visual studio 속성 관리자
 
100828 [visual studio camp #1] C++0x와 Windows7
100828 [visual studio camp #1] C++0x와 Windows7100828 [visual studio camp #1] C++0x와 Windows7
100828 [visual studio camp #1] C++0x와 Windows7
 
110212 [아꿈사발표자료] taocp#1 1.2.8. 피보나치수열
110212 [아꿈사발표자료] taocp#1 1.2.8. 피보나치수열110212 [아꿈사발표자료] taocp#1 1.2.8. 피보나치수열
110212 [아꿈사발표자료] taocp#1 1.2.8. 피보나치수열
 
101102 endofdb select.1_rdbms
101102 endofdb select.1_rdbms101102 endofdb select.1_rdbms
101102 endofdb select.1_rdbms
 
100526 windows7 mfc_최성기_배포용
100526 windows7 mfc_최성기_배포용100526 windows7 mfc_최성기_배포용
100526 windows7 mfc_최성기_배포용
 
100511 boost&tips 최성기
100511 boost&tips 최성기100511 boost&tips 최성기
100511 boost&tips 최성기
 
Touch Ux With Win32
Touch Ux With Win32Touch Ux With Win32
Touch Ux With Win32
 

[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'

  • 1. 아꿈사 http://cafe.naver.com/architect1 최성기 florist.sk@gmail.com MongoDB 완벽가이드 7장 : 고급 기능 (Advanced Topics)
  • 2. 7장 ‘고급기능’은 아래 5가지 주제에 대해 설명한다. 1. DB 명령어 2. 제한 컬렉션 3. GridFS 4. Server-side 스크립팅 5. DBRef : 데이터베이스 참조
  • 3. 1. DB 명령어 - db.runCommand(…).. 수행 원리와 대표 명령어들. 1. DB 명령어 2. 제한 컬렉션 3. GridFS 4. Server-side 스크립팅 5. DBRef : 데이터베이스 참조
  • 4. db.runCommand( { 명령 문서 } ) 이런 형식의 명령어를 3장에서 이미 만났던 적이 있다. { getLastError : 1 } 마지막 명령어로 영향받은 문서의 수를 확인 { findAndModify : ‘…’, ... } 한 번의 연산으로 문서를 찾고 수정한다. 그 뒤로도 매 장마다 이미 신나게 사용함. 아이 씐나 ~
  • 5. 쉘에서 함수 형태로 제공되는 다른 명령어들도 내부적으로는 db.runCommand()를 거쳐서 실행된다. 함수형 명령 runCommand 명령 db.test.drop() db.runCommand( {“drop” : “test”} ) > db.test.drop() > db.runCommand({"drop" : "test"}); true { "nIndexesWas" : 1, "msg" : "indexes dropped for collection", "ns" : "test.test", "ok" : 1 (책에는 true로 나온다) }
  • 6. 책이 쓰인 시점에서 명령어는 약 75개, 자료 작성시점 1.8.2 버전 기준으로 약 100여 개가 된다. shell 명령어 확인 : db.listCommands() 관리자 웹페이지 : http://localhost:28017/_commands 너무 휙 지나감. 볼 수가 없어… 웹페이지 도움말이 펴놓고 참고하기 좋다.
  • 7. 유용한 명령어들만 몇 개 모아보자면… { “collStats” : 컬렉션 이름 } 컬렉션 데이터 크기, 할당 공간 용량, 인덱스 크기 통계. { “ping” : 1 } 서버가 살아있는지 확인. 잠금 상태여도 바로 리턴된다. { “renameCollection” : 컬렉션 이름, “to” : 새 이름 } 컬력션 이름을 변경한다. { “repairDatabase” : 1 } { “serverStatus” : 1 } DB 복구 명령 / 서버 모니터링 통계 수치. 8장에서 다룬다.
  • 8. 2. 제한 컬렉션 - Capped Collections : 사이즈가 고정된 특수한 컬렉션. 1. DB 명령어 2. 제한 컬렉션 3. GridFS 4. Server-side 스크립팅 5. DBRef : 데이터베이스 참조
  • 9. 제한 컬렉션은 circular queue처럼 동작한다. 크기 고정. 가득 찬 상태에서 문서 추가 시 가장 오래된 문서가 삭제된다. 공간이 있을 때는 입력 순서대로 들어가다가... 큐가 꽉 차면 가장 오래된 문서가 새 문서로 대체된다.
  • 10. 제한 컬렉션의 제약 - 문서 삭제 불가능. - 문서 수정 불가능. - 색인 생성 불가능. … 결국 데이터를 추가 하고 (순서대로) 읽어내는 데에만 특화.
  • 11. 제한 컬렉션의 속성 - 입력 속도가 매우 빠르다. 추가공간 할당/관리 등이 필요 없음. - 입력 순서대로 뽑는 쿼리가 매우 빠르다. 이미 디스크상에 입력 순서대로 존재하고 있기 때문. - Age-Out(에이지 아웃) 오래된 데이터는 자동으로 제거.
  • 12. 제한 컬렉션의 생성 일반 컬렉션은 자동으로 생성되기도 하지만 제한 컬렉션은 꼭 명시적으로 생성 되어야 한다. db.createCollection( 컬렉션이름, { capped:true, size:100000 } ); db.createCollection( 컬렉션이름, { capped:true, size:100000, max:100 } );
  • 13. 제한 컬렉션의 생성 이미 존재하는 일반 컬렉션을 제한 컬렉션으로 변환하는 것도 가능하다. db.runCommand( { “convertToCapped” : 컬렉션이름, size : 10000 } )
  • 14. 자연스럽게 정렬하기 - sorting as natural : 입력 순서나 입력 반대 순서로 매우 빨리 정렬. > db.my_collection:find().sort( { “$natural” : 1 } ); 문서 입력 순서 { “$natural” : 1 } 입력 반대 순서 { “$natural” : -1 }
  • 15. 꼬리를 무는 커서 - Tailable Cursors 결과를 모두 꺼냈을 때도 종료되지 않는 커서. 새 데이터가 추가되면 바로 새로운 결과를 꺼낼 수 있다. 제한된 컬렉션에서만 사용 가능. 드라이버마다 사용법은 조금 다르다.
  • 16. 3. GridFS - 파일 시스템 : MongoDB에 대용량 이진파일 저장하기. 1. DB 명령어 2. 제한 컬렉션 3. GridFS 4. Server-side 스크립팅 5. DBRef : 데이터베이스 참조
  • 17. GridFS의 장점 어플리케이션 구조 단순화 파일 저장을 위한 다른 아키텍쳐를 사용할 것 없이 한 저장소에 같이 저장. 복제, 자동 조각화 사용 가능 DB를 위한 복제/조각화 기능 이용 가능. 장애 복구와 분산 확장에 용이. 특정 파일시스템의 문제를 피한다. 같은 디렉터리에 대량의 파일을 저장해도 문제가 발생하지 않는다. 높은 디스크 지역성(locality) 2Gb 청크로 데이터파일을 할당.
  • 18. mongofiles.exe GridFS 유틸리티 커맨드라인 명령으로 GridFS를 다룰 수 있다. D:> mongofiles put foo.txt connected to: 127.0.0.1 added file: { _id: ObjectId('4c0d2a6c3052c25545139b88'), filename: "foo.txt", length: 13, chunkSize: 262144, uploadDate: new Date(1275931244818), md5: "a7966bf58e23583c9a5a4059383ff850" } done! D:> mongofiles list connected to: 127.0.0.1 foo.txt 13 D:> mongofiles get foo.txt connected to: 127.0.0.1 done write to: foo.txt
  • 19. 각 언어별 드라이버마다 GridFS를 다루는 인터페이스 제공. C 인터페이스의 파일 올리기 : gridfs_offset gridfile_write_file(gridfile* gfile, FILE* stream); void gridfile_write_buffer( gridfile* gfile, const char* data, … ); C++ 인터페이스의 파일 올리기 :
  • 20. GridFS 대부분의 작업은 클라이언트 드라이버가 처리한다. 서버는 거들 뿐… fs.files 컬렉션 { 파일 헤더 } fs.chunks 컬렉션 { 파일 데이터 0 } binary { 파일 데이터 1 } { 파일 데이터 2 } 클라이언트 이진 파일 : { 파일 데이터 N }
  • 21. 4. Server-side 스크립팅 - 서버에서 실행되는 자바스크립트. 저장 프로시저와 유사. 1. DB 명령어 2. 제한 컬렉션 3. GridFS 4. Server-side 스크립팅 5. DBRef : 데이터베이스 참조
  • 22. db.eval() 스크립트를 서버에 보내고 결과를 받는다. 코드나 함수를 보내면 된다. 인자를 전달해야 할 때 함수를 넘기자. > db.eval("return 1;") 1 > db.eval("function() { return 1; }") 1 > db.eval("function(u) { print('Hello, '+u+'!'); }", [username]) null (값을 리턴하는 함수가 아니다. 메시지는 서버 로그에 찍힌다.) > db.eval("function(x,y,z) { return x + y + z; }", [num1, num2, num3]) ...
  • 23. system.js 자바스크립트 변수를 저장하는 특수 컬렉션 > db.system.js.insert({"_id" : "x", "value" : 1}) > db.system.js.insert({"_id" : "y", "value" : 2}) > db.system.js.insert({"_id" : "z", "value" : 3}) > db.eval("return x+y+z;") 6 > db.system.js.insert({"_id" : "log", "value" : function(msg, level) { var levels = ["DEBUG", "WARN", "ERROR", "FATAL"]; level = level ? level : 0; // check if level is defined var now = new Date(); print(now + " " + levels[level] + msg); }}) > db.eval("x = 1; log('x is '+x); x = 2; log('x is greater than 1', 1);");
  • 24. Note: Security 클라이언트가 명령어를 보낼 때, 인젝션 공격 가능성에 주의해야 한다. > func = "function() { print('Hello, "+username+"!'); }" // username 변수에 “); db.dropDatabase(); print(“가 들었다면… > func = "function() { print('Hello, '); db.dropDatabase(); print('!'); }" > db.eval( func ) 서버로그 : Hello, ! Shell : { “dropped” : my_collection, “ok” : 1 } 대부분의 드라이버는 DB에 코드를 보낼 때 특수 형태를 사용한다. C++ 드라이버엔 없는 듯…? 아무튼 코드 작성자가 신경 써야 함.
  • 25. 5. DBRef : 데이터베이스 참조 - 한 문서가 다른 문서를 참조하기 위한 방법 중 하나. 1. DB 명령어 2. 제한 컬렉션 3. GridFS 4. Server-side 스크립팅 5. DBRef : 데이터베이스 참조
  • 26. DBRef MongoDB의 문서를 고유하게 식별하고 참조한다. 한 컬렉션 내에서(혹은 다른 DB에서도) 특정 문서를 참조할 수 있도록 하는 내장 문서(embedded document). { “$ref” : collection, “$id” : id_value } { “$ref” : collection, “$id” : id_value, “$db“ : database } {"_id" : 5, "author" : "mike", "text" : "MongoDB is fun!"} {"_id" : 20, "author" : "kristina", "text" : "... and DBRefs are easy, too", "references": [{"$ref" : "users", "$id" : "mike"}, {"$ref" : "notes", "$id" : 5}]} forign key등의 개념이 약한 점을 위해 뭔가 만드는 중인 듯. 개발 편의를 고려한 기능으로 보이나 아직 많이 모자라다. 책에도 굉장히 자신감 없는 어투로 설명되어있다. (본질적이지 않다. 안써도 된다… -_-;; )
  • 27. Driver support for DBRef 서버에서는 DBRef에 대한 예외처리가 없는듯. 대부분 클라이언트의 드라이브 구현에 달려있다. 좋은 예 : DBRef로 참조한 문서에서 자동 역참조 지원. 나쁜 예 : DBRef를 내장문서가 아닌 일반 문서로 처리. 그냥 無... 결국 어느 언어로 된 드라이버를 쓰느냐가 중요하다는 건데…
  • 28. Driver support for DBRef http://www.mongodb.org/display/DOCS/Database+References 에서 언어별 드라이버의 지원 여부와 정보를 확인할 수 있다. 기대를 저버리지 않고 C++은 지원하지 않는다. 나쁜 예! 그냥 無!...
  • 29. MongoDB 완벽가이드 7장 : 고급 기능 끄읕.