http://sys145.tistory.com/4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// 1. DB에 들어가서 User를 만들어야 한다.
 
// server
mongod --port 27017 --dbpath /data/db1
 
// client
mongo --port 27017
use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "Role이름", db: "DB명" } ]
  }
)
 
// 2. DB를 -auth 파라미터로 재시작 한다.
//       client에서 아이디와 패스워드를 가지고 로그인한다.
// server
mongod --auth --port 27017 --dbpath /data/db1
 
// client
// 방법 1
mongo --port 27017 -"myUserAdmin" -"abc123" --authenticationDatabase "DB명"
// 방법 2
mongo --port 27017
use admin
db.auth("myUserAdmin""abc123" )
 
 
// 아래와 같이 다양한 롤을 가지는 사용자를 추가할 수 있다.
use test
db.createUser(
  {
    user: "myTester",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "reporting" } ]
  }
)
 
mongo --port 27017 -"myTester" -"xyz123" --authenticationDatabase "test"
 
use test
db.auth("myTester""xyz123" )
 
 
cs


1. 복합시스템 설계

* Application Side Join

: 기존 시스템은 모든 종류의 데이터를 모두 RDBMS에 저장하고 처리하였다.

: 그로인해 우선순위가 낮은 빅데이터 때문에 데이터의 처리가 지연되는 문제가 발생함

: NoSQL을 도입하여 우선순위가 낮고 대량의 트랜젝션을 발생시키는 데이터들을 NoSQL에서 처리

: RDBMS는 중요한 데이터 처리에만 집중할 수 있기 때문에 쾌적한 환경에서 최상의 결과를 만들어냄.

: 데이터의 성격에 따라 RDBMS와 NoSQL로 분산하여 처리하여 전체 시스템의 퍼포먼스가 향상되는 장점을 가짐

: 여러 DB에 나뉘어 있는 데이터를 프로그램상으로 불러와서 JOIN한다.

: 이를 Application Side Join 이라고 한다.

* Data Export / Import

: RDBMS/NoSQL에 저장된 데이터를 Hadoop 에서 처리를 하려면 HDFS 상에 파일 형태로 변환해주어야함.

: 이때 다양한 DBMS/NoSQL의 데이터를 HDFS로 Import/Export 해주는 'Sqoop'과 같은 Hadoop Echosystem을 사용해야함.

: 정형화된 데이터 처리

: Sqoop, hiho

: 비정형화된 데이터 처리

: Flume, Scribe

* Batch Processing

: 빅데이터 분석 시, 자동화된 병렬처리/분산처리를 지원하는 MapReduce를 많이 사용하며 대표적인 솔루션이 'Hadoop'임

: Hadoop은 배치형 데이터 처리 시스템이며 Map단계와 Reduce단계를 순차적으로 실행하여 결과를 만듦

2. 빅데이터 수집/가공/서비스 과정

* 데이터 수집

: 다양한 서비스에서 제공되는 RESTful API를 사용하여 데이터 수집(JSON, XML)

: 스크래핑(크롤링)을 사용하여 데이터 수집(HTML)

: 데이터 수집 자동화를 위해 전용 로봇을 만들어서 주기적으로 실행

: 수집되는 데이터의 양이 많고, 수집 속도가 빠르기 때문에 수집되는 데이터는 NoSQL에 저장할 것을 권장

* 데이터 분석

: 1차적으로 수집된 데이터는 Hadoop을 이용하여 데이터 가공하는 작업을 진행하기 위해 HDFS상에 Import시킴

: 분석 작업을 위해 프로그래밍 된 Hadoop 프로그램을 주기적으로 실행시켜서 최신 분석 결과를 생성함.

: 생성된 분석 결과는 사용자에게 서비스할 때 사용되는 데이터베이스에서 사용될 수 있는 형태의 데이터로 Export 시킴

: 데이터를 수집하고, 수집된 데이터를 분석하는 데에는 일정한 시간이 소요되기 때문에, 실시간 처리는 물리적으로 불가능함

: 다만, 데이터 분석 주기를 최대한 짧게 함으로써 실시간에 가까운 최신 데이터를 사용할 수 있도록 만들어주는 것이 현실적임.

: 파싱은 NoSQL 로 하고 사용자에게 제공할 DB는 RDBMS로 한다.

* 결과 데이터 서비스

: 결과 데이터를 RDBMS에 저장해준다.

: RDBMS가 직접 연산을 하지 않고 저장하고 필요시 제공만하기 때문에 오버헤드가 적다.

: Hadoop이 주기적으로 실행되면서 최신데이터를 계속 갱신해주기 때문에 저장된 데이터를 제공하는 것만 신경쓰면 됨.

3. 다중 플랫폼 지원 채팅 서비스 구축 사례

* Redis (Remote Dictionary Server)

: 메모리 기반의 key-Value 타입 저장소

: NoSQL중 하나

: 데이터 구조 서버라고 불림

: 데이터 로딩할 때 시간 절약을 위한 메모리 캐시와 같은 용도로 많이 사용됨.

: 단순히 메모리에 Read/Write 하기만 하는 것이 아니라 정기적으로 메모리를 디스크에 저장하기 때문에 자동 복원도 가능.

: 일종의 Push 기능인 Publish/Subscribe 명령 제공

: 데이터베이스이기 때문에 대부분의 플랫폼에서 지원이 용이함.

* Socket.io

: node.js에 기반한 라이브러리

: 실시간 어플리케이션 구현을 위한 크로스 브라우저용 웹 소켓

: 대부분의 브라우저를 모두 지원

: WebSocket, 등 리얼타임 기술들을 모두 지원

: SocketIO는 클라이언트를 위한 JavaScript용 과 서버를 위한 nodeJS용을 따로 배포

: npm을 이용한 간단한 설치

* 데이터 베이스

: 사용자 계정 정보를 비롯한 중요 정보는 MySQL에 저장

: RDBMS는 오랜기간 사용되어왔기 떄문에 운영 노하우가 풍부하고, 데이터 일관성 유지와 보안등에 유리함.

: 채팅 서비스를 운영하면서 발생하는 모든 종류의 로그성 데이터는 MongoDB에 저장

: MongoDB는 로그 데이터와 같이 대량으로 빠르게 저장해야하는 데이터에 적합하고, 데이터베이스의 확장이 용이하기 때문에 용량에 상관없이 저장이 가능함.



1. robomongo 

: 크로스 플랫폼을 지원하는 MongoDB용 GUI 방식 관리 툴

: 처리가 빠르고 직관적인 인터페이스 제공

: 데이터 조회시 유용함.

: 생산성을 높일 수 있음

2. MongoDB 모니터링 도구

* MUNIN

: 네트워크, CPU, 각종 입출력 값 등을 그래프로 보여주는 툴

: 플러그인을 통해 Apache, MySQL 등을 모니터링할 수 있음

: munin-master는 munin-node가 설치되어있는 곳의 상태를 보여줌

* MongoDB Monitoring Service(MMS)

: MongoDB를 Dashboard 형태로 모니터링 할 수 있음

: 10gen MMS웹사이트 회원가입후, 에이전트 설치 및 실행하고 호스트를 등록하는 방식(mms.10gen.com)

* MongoVue

: Windows 환경에서 .NET framework 필요

: 직관적인 UI, SSH 터널링 지원, Free버전 별도 제공(샤딩크기제한됨)

* Pandora FMS

: Open Source(GPL2)

: 동일 서버에 pandora agent와 server가 설치되어야 함

: MongoDB 플러그인을 설치하면 mongoDB 연동가능

: 복잡한 추가 설정 필요

* Meteor

: Web&Mobile App을 구축하기 위한 JS Open Source 플랫폼

: 실시간 업데이트, 모니터링 가능(자동갱신)

: 민감한 코드는 서버 보안 영역에 분리하여 실행 가능

: polling 방식기반이기 때문에 속도가 느리고 서버부담이 큼

: 대안으로 oplog를 이용한 Monitoring 수행가능

: 도메인이나 데이터베이스에 대한 이해 필요




1. MongoDB 튜닝 방법

* MongoDB 튜닝

- 데이터 베이스 튜닝이 필요한 시점

: 설계와 사용자의 패턴이 달라졌을 경우

: 잘못된 설계일 경우

: 데이터가 축적되거나 장비의 노후화 일 경우

- 데이터 튜닝방법

: 데이터 모델 튜닝

: 질의 튜닝

: 아키텍쳐 튜닝

: 인스턴스 튜닝

: 하드웨어 튜닝

* MongoDB 튜닝

: 가장 쉬운 방법은 하드웨어를 업그레이드하는 하드웨어 튜닝

: 데이터 모델이나, 질의 튜닝은 비지니스 모델에 대한 깊은 이해를 필요로 하는 어려운 튜닝 방법

: 또한 데이터 마이그래이션도 동반하기 때문에 라이브 모드에서 쉬운 결정이 아님.

: 아키텍쳐 튜닝이나 인스턴스 튜닝은 실 서비스 단계에서 선택하기에 어려운 점이 많음

: 실행중이기 때문에, 타이밍이나 소요되는 시간을 감안해야 함.

* 데이터 모델 튜닝

: 초기에 설계한 데이터 모델이 제대로 성능을 발휘하지 못할 때 필요한 조치

: 설계미흡, 예측하지 못한 데이터 입력, 용도 변경에 인함.

: 가장 알맞는 데이터 모델을 가지고 있어야 함.

: 최초 컬랙션 생성시 기본 익스텐트 크기가 할당됨

: 너무 작으면 쓰기 작업이 발생할 때 새로운 익스텐트를 할당 받을 때마다 지연이 발생

: RDBMS에서도 발생함

: 초당 몇만건 이상되는 빅데이터처리를 위해서라면 미리 예측해서 지정해야 한다/

: MongoDB의 Document 자료구조

: 데이터를 중첩하여 Embedding형태로 구성하는 것을 추천한다.

: 하지만, 데이터의 밀접도가 낮을 경우 Linking방식으로 설계하는 것을 고려해야 한다.

: MongoDB도 빠른 검색을 위한 인덱스 시스템을 가지고 있음

: 백그라운드 인덱스 타입으로 생성이 가능함

: insert마다 인덱스를 생성하여 성능저하가 발생하지 않도록 해야함.

: MongoDB의 복합 인덱스

: RDBMS처럼 다중 인덱스 가능

: 우선순위에 따라 지정하는 것이 좋고, RUD가 잦은 필드도 제외해야함.

* 질의 튜닝

: MongoDB는 서버에 질의된 문장을 profiling하는 것이 가능함.

: 분석 결과는 db.system.profile Collection 에 저장됨

: 질의 문장들의 분석이 가능함 (Explain 함수)

: 질의 문장의 성능이 저하되는 원인인 인덱스를 찾을 수 있음

* 아키텍쳐 튜닝

: 운영체제의 메모리 설정을 따라기기 때문에 충분한 map Memory 영역이 필요함

: 하나의 시스템에서 하나의 인스턴스만 실행해야한다..

: 단일 노드보다는 다중 노드로 서비스하는 것이 유리하다.

: 샤드 시스템을 통해 분산 저장과 Load balancing의 장점을 얻을수 있다.

* 하드웨어 튜닝

: 가장 쉬운 방법

: SDD사용, 충분한 메모리 공간 사용, 다중코어, 다중 node사용

: Mongopref 유틸리티를 사용하면 MongoDB의 Disk I/O상태 확인 가능

* Profile 시스템

: 질의 결과에 대한 프로파일링 시스템을 제공

: 분석 결과는 db.system.profile 콜랙션에 저장

: 일정 시간이 초과된 질의를 추출할 수 있음

: 성능 튜닝할 대상등을 선정하는 것이 가능해짐

: Propile을 위해 환경설정이 필요하다

> db.commandHelp("profile")    //    사용방법 출력

: 현재 프로파일 설정 상태 확인

> db.getProfilingLevel()    //    결과가 0이면 시스템을 사용하지 않음, 1이면 100ms 이상 걸린 정보를 저장함, 2이면 System에서 발생한 모든 정보를 저장함

: 설정 변경

> db.setProfilingLevel(2)    //    입력이 0이면 시스템을 사용하지 않음, 1이면 100ms 이상 걸린 정보를 저장함, 2이면 System에서 발생한 모든 정보를 저장함

: 저장된 프로파일 정보 조회

> db.system.profile.find()    //    전체내역 확인

> db.system.profile.find({millis:{$gt:5}})    //    특정시간이상 걸린 정보들만 조회

2. MongoDB 보안 팁

* 인증 설정

: 설치과정 중 인증과 관련된 설정을 하는 부분이 없음

: 설치후 누구나 DB에 접속할 수 있음

: 허가된 사용자만이 DB에 접속할 수 있도록 계정, 패스워드를 설정해양 한다.

: 실행 시 인증정보를 사용하겠다는 파라미터를 포함하면 됨

: 데이터베이스별로 계정과 패스워드를 추가하여 사용하는 것을 권장

: 각 DB별 계정 정보는 system.users라는 namespace에 저장됨

: db.removeUser(username) 명령으로 계정 삭제 가능

* MongoDB 종료

: MongoDB 안전종료 방법

: foreground로 실행시 Ctrl-C로 강제종료    //    권장하지않음

: MongoDB Shell 이용시 db.shutdownServer()

: 반드시 -auth 패러미터를 사용하여 mongod를 구동해야함.

: 드라이버 이용시 {"shutdown":1} 명령

* HTTP 인터페이스 보안

: 누구나 HTTP 인터페이스에 접근해서는 안되기 때문에, -auth 패러미터를 사용해서 mongod 인스턴스를 구동해야함



웹팩 : 뭔지 모름

handlebarsjs : 템플릿 엔진

1. MongoDB 로그 수집/분석

* MongoDB 모니터링 전략

1. DB활동을 실시간 리포팅하는 유틸리티 활용

2. DB명령 활용(현재 DB상태에 대한 통계확인가능)

3. MMS 모니터링 서비스(MMS Monitoring Service) 활용

: 데이터에 대한 시각화 및 경고등을 제공하는 무료 서비스

* MongoStat

: MongoDB가 동작하는 내부 상황에 대한 정보를 확인하는 툴

: CRUD와 메모리 상태 등의 정보를 확인

: 1초에 한번씩 mongod, mongos 성능을 측정

: 커맨드 라인에서 mongostat이라고 입력

: rowcount를 통해 row 수 지정 가능


> mongostat -rowcount 50


* MongoStat 명령어

- 레이블 (*)중요표시

: inserts, query, update, delete : 초당 해당 작업 수

: getmore : 초당 발생 작업 수

: command : Slave를 포함하여 초당 실행되는 명령어 수

: flushe : 초당 fsync flush 되는 수

: mapped : 메모리상에 매핑되는 메모리 크기 단위 (MB)

: vsize : 프로세스의 가상 크기 (MB)

: res : 프로세스의 resident 크기 (MB)

: *faults : 초당 발생하는 페이지 폴트 수

: *locked : 글로벌 write락이 발생하는 전체시간에 대한 비율 (%)

: Idx miss : Btree index를 로드하며 인덱스를 읽을 때 페이지 폴트가 나는 비율(%)

: *qr : MongoDB인스턴스로부터 Data를 읽기를 기다리기 위한 client의 queue 길이

: qw : MongoDB인스턴스로부터 Data를 쓰기를 기다리기 위한 client의 queue 길이

: ar : 읽기 작업을 수행중인 Active 클라이언트 수

: aw : 쓰기 작업을 진행중인 Active 클라이언트 수

: netIn : MongoDB로 received된 네트워크 트래픽 양

: netOut : MongoDB에서 밖으로 sent된 네트워크 트래픽 양

: conn : 접속된 connection 수

: set : Replica 이름

: repl : 리플리케이션 유형

: mongotop 은 컬랙션 단위의 응답 속도 확인이 가능함

: 갑자기 page fault가 증가하고 서비스가 지연된다면, full scan쿼리를 날렸을 가능성이 높음

: 쓰기 요청이 많을 경우 qr수치가 높아지고 읽기 대기중인 상태가 많아져 지연된다고 느껴진다.

: 이로써 발생하는 원인을 추정하고 대비하자.

* MongoTop

: 리눅스에서 시스템 상황을 확인할 수 있는 Top과 유사

: DB 인스턴스 내 모든 콜랙션에 대한 read/write 확인 가능

: Mongostat 처럼 몇가지 데이터 컬럼이 존재하는데 stat처럼 복잡하지 않아서 한눈에 알아보기 쉬움


> mongotop 5     //    5초마다 refresh 하라는 뜻


- 레이블

: Ns : DB명 + 컬랙션 명

: Db : DB명

: Total : Mongod프로세스가 해당 콜랙션에서 수행한 작업 총 시간

: Read : Mongod 프로세스가 해당 콜랙션에서 읽기 작업을 수행한 총 시간

: Write : Mongod 프로세스가 해당 콜랙션에서 쓰기 작업을 수행한 총 시간 

: 시간 : 분석 결과를 반환한 시간

* 웹 모니터링 도구

: 위의 도구들은 DB라면 제공하는 기본 명령어

: 웹상에서 모니터링 할수있는 환경을 제공함

: 활성화 시키고 싶다면, mongodb 데몬을 실행할때 -rest옵션을 주면됨.

> mongod --dbpath 경로 --rest

> http://localhost:28071 접근    //    웹에서 확인

* Log 수집

: 장애가 발생했을 경우나 정기적인 점검과정에서 필요

: MongDB 데몬 실행시 logpath 옵션을 사용하면, MongoDB 로그를 저장가능한 상태가 됨

: 많은 정보를 저장하기 때문에 log파일명을 일정시간 단위로 바꾸어 주어야 한다.

> mongod --dbpath 경로 --logpath 경로/testlog.txt    //    textlog.txt에 로그가 저장됨

2. MongDB 로그 수집/분석 방법

* mongostat

: mongod, mongos 성능 측정

> mongostat

> mongostat 30     //    30초 주기 측정

> mongostat --rowcount 20 1 // 20개의 row를 1초 주기로 측정

> mongostat -n 20 1    //    1초주기로 20번 출력하고 종료

* mongotop

: Read / Write / Total I/O 정보 조회

> mongotop

> mongotop 30    //    30초 주기로 조회

> mongotop --locks    //    DB의 Lock상황을 조회








'프로그래밍 > NoSQL - MongoDB' 카테고리의 다른 글

MongoDB 모니터링 도구  (0) 2017.04.04
MongoDB 개발 팁 - 튜닝방법&보안팁  (0) 2017.04.04
MongoDB 운영방법 - 백업/복구  (0) 2017.04.04
MongoDB 집계 명령 & 리모트 명령  (0) 2017.04.04
MapReduce  (0) 2017.04.04

1. MongoDB 데이터 백업/복구 종류

* 데이터 베이스의 백업/복제

: 데이터의 안전한 저장과 값에 대한 일관성 보장

: 장애 발생시 가장 중요하게 필요한 것이 백업과, 복구

: NoSQL특성상 분산되기 때문에 단순히 파일을 복사하는 것만으로는 데이터 복제와 복구가 싶지 않음

: MongoDB는 다양한 백업/복구 기능을 지원

* ShutDown & File copy

: 가장 기초적인 백업 방법

: 간단하긴하지만, I/O를 막아 무결성을 지키기 위해 mongoDB를 끄고 해야하는 단점이 존재

: 새로운 서버에 복사 붙여넣기만 하는 것으로 간단하게 처리 가능

: 너무 용량이 큰 경우 시간이 많이 소요되므로 필요한 경우만 사용.

* FSyncLock & Backup

: 데이터 베이스 전체에 락을 걸고 데이터를 복사하는 방법

: 무결성 이슈에서 자유로움

: 복제, 복구 등 작업이 끝나면 unlock을 해야함.

* MongoDump, MongoRestore

: 가장 흔하게 사용하는 방법

: 컬렉션, DB, 전체 데이터 단위로 백업 가능

: BSON형태로 저장되며, 더 빠르게 백업과 복구가능

: 백업된 데이터는 mongorestore 명령어를 통해 복구 가능

* MongoExport, MongoImport

: Mongodump, MongoRestore와의 차이는, 데이터를 json, csv, TSV형태로 백업이 가능하다.

: BSON보다 느리며 텍스트 형태로 저장

: 데이터를 마이그레이션할 때 외부 툴을 사용할 수 있다.

: MongoImport 명령어로 복구 가능

* Primary, Secondary & Replica

- Replica : MySQL의 리플리케이션에 해당하는 명령어

: Master-Slave를 동기화 하기 때문에 Main서버와 동일한 데이터 유지가능

: 쿼리를 통해 변경/삭제한 것은 복구가 어려움.

- 리플리케이션 세트

: Master-Slave를 통해 자동으로 Main서버가 고장났을 때 Slave서버를 Master로 올려 안정성을 확보한다.

* SnapShot 백업

: 사용자의 데이터를 더 안전하게 보관하기 위한 일종의 버퍼

: 대량의 Insert트래픽을 견딜 수 있어야함.

: 1.6v 부터 Journal 시스템 도입

: 데이터 입력시 메모리상의 Journal 시스템에 해당 내용을 저장한뒤 디스크에 내용을 저장함

: 디스크에 문제가 생긴 경우, Journal에 존재하는 데이터를 통해 복구가 가능

2. MongoDB 데이터 백업/복구 방법

* FSyncLock & Backup

: 실습 데이터 생성

> 실습 데이터 생성하기

: 로컬상에서 데이터 복사

> use admin

> db.copyDatabase("DB명","복사된DB명")    //    ""안에 쓰기

> show dbs

: 원격지로 데이터 복사

> db.copyDatabase("DB명","복사될DB명","192.168.1.77:27017")

: 원격지에서 데이터 가져오기

> db.cloneDatabase("192.168.1.77");

* MongoDump, MongoRestore

: MongoDump (mongo shell 밖에서 실행)

> mongodump --host 127.0.0.1     //    현재 실행되어 있는 DB의 내용을 BSON형태로 백업하겠다.

: MongoRestore (mongo shell 밖에서 실행)

> mongorestore -h 127.0.0.1 ./dump/    //    해당 폴더로 해당 데이터를 복구 시켜준다.

* MongoExport, MongoImport

: MongoExport

> mongoexport -h 192.168.1.77 -c 콜랙션명 -d DB명 -o "경로/test.exp"     //    해당 호스트에서 돌아가고있는 DB의 Collection을 test.exp로 백업하겠다.

: MongoImport

> mongoimport -d test -c things --type json --file "경로"    //    해당 경로의 백업파일을 현재 돌아가고 있는 DB의 DB의 컬랙션에 복구한다.






1. MongoDB의 집계함수

* count

: 컬렉션 내 문서의 갯수를 조회

: RDBMS의 count와 같은 기능

EX)

> db.person.count()    //    Collection의 Document 갯수 반환

> db.person.find({name:"neo"}).count()    //    해당되는 Document들의 갯수 반환

* distinct

: 지정된 키에 대한 중복 제거(주어진 키의 고유한 값 찾기

: 컬렉션과 키를 지정해주어야 함.

: RDBMS의 distinct와 같은 기능

EX)

> db.runCommand({"distinct" : "Collection명","key":"Key명"})    //    해당 키에 대한 중복 제거

> db.phones.distinct('components.number',{'components.number':{$lt:50000}})    //    해당 조건에 맞는 것만 중복 제거

* group

: 지정된 키에 대한 그룹핑

: RDBMS의 group by 와 같은 기능

: 속도가 느리기 때문에 꼭 필요한 곳에만 사용하는 것이 좋음

: sort/limit 등을 사용하기 어려움

: 샤드 클러스터 환경에서 동작하지 않음

EX)

> db.person.group({key:{age:1},initial:{count:0},$reduce:"function(obj,prev){prev.count++;}" })

: reduce명령을 직접 지정하는 것이 가능


2. MongoDB 집계 프레임워크

: 2.1v 부터 지원

: 콜렉션 내의 문서들을 변환하고 결합 가능

: 내부적으로 MapReduce를 사용하지만, 사용이 더 쉬움

: 빠른 성능 보장

: group by, self join 등 SQL과 유사한 API를 제공

: 여과, 선출, 묶음, 정렬, 제한, 건너뛰기 등의 구성요소를 통해 파이프 라인을 만들 수 있음

: 결과는 콜렉션에 기록할 수 없기 때문에 클라이언트로 반환되어야 함

: 집계 결과는 최대 16MB데이터로 제한됨

: 복잡도 순위

group() < aggregation framework(집계 프레임워크) < map/reduce

: 주요개념

Piplines, Expressions

: Shard를 통해 BigData를 저장하고, Aggragation Framework를 통해 Bigdata를 처리한다.

* 주요개념

- PipeLine

: Unix의 Pipe와 동일하며 document를 stream화 시킨다.

: pipline operators는 document의 stream을 처리한다.

: map-reducing과 같은 원리

- Expressions

: input document를 수행한 계산 값을 기반으로 output document를 생성

: $addToSet, $first, $last, $max, $min, $avg, $push, $sum 등의 명령어 지원

* Pipelines의 주요 명령어

: $project : SELECT 절

: $match : WHERE 절

: $group : GROUP BY 절

: $sort : ORDER BY 절

: $limit, $skip, $unwind, $geoNear, $sum, $count...

* Aggregation과 SQL 맵핑 관계

: sql은 DBMS안에서 수행, MongoDB는 Sharding 기반에서 수행

* 집계 프레임워크 예제

> db.콜랙션명.aggregate({$project:{author:1}},
... {$group:{_id:'$author',count:{$sum:1}}},
... {$sort:{count:-1}},
... {$limit:5});
)

* 함수 만들기(그냥 함수 만들기 예제)

> populatePhones = function(area,start,stop){
... for ( var i = start ; i < stop ; i++ ){
... var country = 1 + ((Math.random() * 8)<<0);
... var num = ( country * 1e10 ) + (area * 1e7) + i;
... db.phones.insert({_id:num, components:{country:country, area:area, prefix:(i*1e4) << 0, number:i},display:'+'+country+' '+area+'-'+i});
... }
... }


3. MongoDB 리모트 명령

* 리모트 명령

: 로컬 MongoDB 콘솔에서 수정 명령어를 입력하면 원격 mongodb에서 데이터를 로컬로 불러와서 처리한뒤 다시 원격지에 저장한다.

: 비효율 발생

: eval 명령을 사용하면 원격지에서 바로 명령어를 실행한 뒤 결과를 받을 수 있음.

EX)

> db.eval(update_area);    //    

> db.eval("distinctDigits(db.phones.findOne({'components.number':5551213}))");




http://handlebarsjs.com/

'프로그래밍 > Web개발' 카테고리의 다른 글

php 세션 관련  (0) 2017.03.29

+ Recent posts