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 인스턴스를 구동해야함



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}))");




MapReduce 개념 살펴보기

1. 맵 리듀스(MapReduce)

: 대용량의 데이터를 안전하고 빠르게 처리하기 위한 방법

: 한대 이상의 하드웨어를 활용하는 분산 프로그래밍 모델

: Hadoop은 HDFS(Hadoop File System)이라는 대규모 분산 파일 시스템을 구축하여 탁월한 성능과 안정성을 보여줌

: 맵 리듀스는 대용량 파일에 대한 로그 분석, 색인 구축, 검색에 탁월한 능력을 보여줌

* 맵 리듀스 동작원리

* 맵 리듀스 특징

: 맵 리듀스는 데이터를 분산하여 연산하고 다시 합치는 기술

: 맵 단계는 key-Value의 형태를 가짐 (이 형태는 분산에 있어서 필수적인 형태)

: 맵과 리듀스는 사용자가 임의로 코딩이 가능한 형태로 제공

: 분산을 통해 분할된 조각으로 처리한 뒤, 다시 모아 계산을 완료

* 장/단점

장점

: 대용량 처리를 단순하게 만듬

: 데이터 모델이나, 스키마에 독립적

: 높은 확장성

단점

: RDBMS보다 불편한 스키마

: 낮은 성능, 단순한 데이터 처리

: 개발환경의 불편함과 운영노하우 부족

* 맵리듀스와 RDBMS의 비교

* 맵리듀스와 RDBMS의 관계

: 대용량 처리를 위해 기존의 RDBMS를 보완

: 일관처리 방식으로 전체 데이터 셋을 분석할 필요가 있는 문제에 적합

: 대부분의 클라우드 시스템이 이렇게 운여되고 잇음

2. Hadoop의 HDFS, 맵리듀스

* HDFS 개요

- 구성요소

: 클라이언트 : 데이터 송수신 요청

: 네임 노드 : HDFS 전체 시스템 제어

: 데이터 노드 : 수천대의 서버로 구성, 데이터 저장 역할

- 데이터 처리원칙

: Block size : 파일을 저장하는 단위(64MBor128MB)

: Replication : 모든 블록은 여러 노드에 분산되어 저장(기본3개)

* HDFS 파일 전송 과정

* HDFS파일 수신 과정

* HDFS의 오류 및 장애 대응

: 네임 노드 오류가 발생했을 경우 모든 클러스터가 죽는 문제가 발생한다.

- 데이터 노드 오류 처리

: 데이터 노드는 네임노드에 3초 단위로 heart beat 전송

: 10분동안 받지 못하면 죽었다고 판단.

- 데이터 송수신 시 오류 처리

: 클라이언트가 송신시 데이터 노드는 ACK 응답을 한다.

: ACK응 답이 오지 않으면 죽었거나 네트워크 오류로 판단

- 데이터 체크섬(checksum) 확인

: 데이터 전송시 해당 데이터에 대한 체크섬을 같이 보냄

: 데이터 노드에서 데이터와 체크섬을 같이 저장하여 이를 통해 블록리포트를 작성하여 네임노드에 보낸다.

* 불완전 복제 방지

: 오류 발생으로 복제 개수가 완전하지 않은 블록을 불완전 복제라고 한다.

: 데이터 노드에 새로운 복제소로 복사할 것을 요청하여 개수를 맞춘다.

* 복제 위치 선정 전략

: 클러스터는 여러개의 데이터 노드를 가지는 랙으로 분리됨

: 같은 렉이 아니라 다른 렉에 있는 데이터 노드에 저장하기 위한 알고리즘이 있음

* Hadoop의 맵 리듀스

- 설계 특성

: 분산 컴퓨팅에 적합한 함수형 프로그래밍

: 배치형 데이터 처리 시스템

: 어플리케이션 로직의 주요 관심사를 파악, 많은 요소들 반영

- 주요기능

: 자동화된 병렬처리 및 분산처리

: 프로그래머를 위한 추상 클래스

: 상태 및 모니터링 툴들

* 맵리듀스 과정

: 원본데이터(파일,DB레코드)는 map 함수에 의해서 key-value쌍으로 전환

: map() 함수: 입력을 출력 key와 관련되는 1..N개의  key-value를 생성

: Map 단계 다음에서 출력 key의 중간 value들은 하나의 리스트로 합쳐짐

: reduce() 함수: 같은 출력 key를 가지는 final value로 중간 value들을 통합

* 맵 리듀스 특징


3. MongoDB의 맵 리듀스

* MongoDB 맵 리듀스 특징

: RDBMS에서 제공하는 데이터 집계함수들을 지원하지 않음

: mapreduce를 통해 집계 구현 가능


MapReduce 실행

1. Word Count 개념

: 입력 파일의 텍스트 내용에 포함된 단어의 수를 세는 프로그램

: 입문용 MapReduce 프로그래밍 예제

: 입력파일의 사이즈가 클수록 MapReduce가 효율적이다.

: 두가지 함수를 구현해야 한다.

: map (in_key, in_value) -> (inter_key, inter_value) list

: reduce (inter_key, inter_value list) -> (out_key, out_value) list

* Split Mapper

: 데이타 셋을 Key-Value 의 리스트로 변경하는 map() 함수

> map( String input_key, Sting input_value) : 

// input_key : document name

// input_value : document contents

for each word w in input_value : 

emit(w,1);

* Sum Reducer

> reduce(String output_key, Iterator<int> intermediates_values) :

// output_key : a word

// output_values : a list of counts

int result = 0;

for each v in intermediate_values :

result +=v;

emit(output_key,result);

2. Wod Count 구현

* 맵 리듀스 함수 구현

: MapReduce 데이터 입력

> db.words.save({text:"read a book"});

> db.words.save({text:"write a book"});

: map() 함수 구현

> map = function(){
... var res = this.text.split(" ");
... for (var i in res)
... key = {word:res[i]};
... value={count:1};
... emit(key,value);
... }
... }

: reduce() 함수 구현

> reduce = function(key,values){
... var totalcount = 0;
... for (var i in values){
... totalcount = values[i].count + totalcount;
... }
... return {count:totalcount};
... }

* 맵 리듀스 실행

: MapReduce 명령 실행

> db.words.mapReduce(map,reduce,"wordcount") ;

: MapReduce 실행 결과 확인

> db.wordcount.find();


MapReduce 구현

1. Inverted Search Index 개념

* Inverted Search Index

: value의 내용을 key로 하  고, key의 내용을 반대로 value로 하는 패턴

: 검색엔진에서 많이 사용하는 방법

: 검색 키워드를 키로 해서 URL을 value로 하는 테이블을 다시 만든다음 검색 키워드로 검색하면 신속하게 검색 키워드를 가지고 있는 URL을 찾아낼 수 있음

* Inverted Mapper

: 데이터 셋을 key, value의 리스트로 변경하는 map() 함수

* Inverted Search Index 수행과정

: 엄청난 양의 데이터를 잘라 데이터 노드에게 나누어 준다.

: 각 노드는 맵 함수를 실행시켜 많은 중간 데이터를 만들어 낸다.

: 중간 데이터는 최종적으로 reduce의 input으로 들어가게 되고, 최종 결과를 만든다.

2. Inverted Search Index 구현

* 맵 리듀스 실행

: MapReduce 데이터 입력

> db.actors.save({actor:"Richard Gere", movies:{'Pretty Woman','Runaway Bridge','Chicago'}});

: map() 함수 구현

> map =function() {
... for (var i in this.movies){
... key = {mvie : this.movies[i]};
... value = {actors:[this.actor]};
... emit(key, value);

: reduce() 함수 구현

> reduce = function(key,values){
... actor_list = {actors:[]};
... for(var i in values){
... actor_list.actors = values[i].actors.concat(actor_list.actors);
... }
... return actor_list;
... }

: MapReduce 명령 실행

> db.actors.mapReduce(map,reduce,"pivot");

: 실행결과 확인

> db.pivot.find();



1. 리플리카 셋의 개념과 동작원리

* 리플리카 셋 (ReplicaSet)

: primary 서버 - 리플리카셋에서 첫번째 입력을 담당하는 서버

: secondary 서버 - primary 서버를 제외한 나머지 서버

: primary 서버에 문제가 생기면 자동으로 secondary 서버에서 I/O를 담당함

* 리플리카 셋 주요 특징

: primary  서버는 secondary 서버의 상태를 2초단위로 heartbeat 확인

: secondary 서버가 중단되도 primary는 그대로 작동

: 이후 secondary서버가 복구되면 oplog를 전달하여 동기화

: primary 서버가 중단되면 secondary 서버가 primary서버로 됨

* 동작원리

: 한개의 primary와 두개의 secondary로 구성

: 자신을 제외한 다른 노드가 죽었는지 주기적으로 heartbeat 검사

* 복제 시스템 한계

: 한 복제 집합을 구성할 수 있는 노드 최대 개수는 12개

: 투표할 수 있는 노드 최대 개수는 7개

: 마스터와의 통신지연 만큼의 슬레이브의 데이터 동기화 차이

: 동기화를 미처 못하고 죽었을 시 데이터 손실

: 저널링 파일에 데이터를 저장하는 경우에도 주기 사이의 데이터 손실

2. 리플리카셋 시스템 구성

: 서버 만들기

> mongod --replSet 리플리카셋이름 -dbpath 경로 -port 포트번호    //    리플리카 셋 이름은 모두 동일해야함.

> mongod --replSet 리플리카셋이름 -dbpath 경로 -port 포트번호

> mongod --replSet 리플리카셋이름 -dbpath 경로 -port 포트번호

* 셋으로 만들기

> mongo localhost:10000     //    프라이머리 셋에 접속

> var config = {_id:'리플리카셋명', members:[{_id:0, host: 'localhost:10000'},{_id:1, host: 'localhost:10001'},{_id:2, host: 'localhost:10002'}]}

> rs.initiate(config);    //    동기화 시작



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

MongoDB 집계 명령 & 리모트 명령  (0) 2017.04.04
MapReduce  (0) 2017.04.04
MongoDB를 이용한 복제 방법 살펴보기  (0) 2017.04.04
MongoDB 샤딩  (1) 2017.04.03
MongoDB Index기능  (0) 2017.04.03

1. 복제의 개념과 동작 원리

* 복제

: 고성능 DB에서 가장 핵심이 되는 기능

: 같은 데이터를 가지는 여러개의 MongoDB서버를 설계하는 과정

: Master/Slave Replication

: 자동 장애 조치 불가능(수동으로 대체 가능)

: 13개 노드까지 구성 가능

: 후에 배울 Replica Set은 자동으로 복구 가능

* 복제의 용도

: 데이터의 일관성, 읽기 분산, 운영중 백업, 오프라인 일괄 작업용 데이터 소스

* MongoDB 복제 동작 원리

: Master는 쓰기 연산을 담당

: 쓰기 연산이 실행되면 데이터 저장소와 Oplog 영역에 저장

- 데이터 저장소 : B+ 트리로 구성되어 쓰기 연산을 수행한 결과 저장

- Oplog : 연산수행과 관련된 명령 자체를 타임스탬프와 함께 저장

: Slave는 주기적으로 Master에게 Oplog를 요청한다.

: 데이터를 복사하는 것이 아니라, 동일한 명령어를 복사하는 것.

2. 복제 시스템 구성

* 저장공간 생성

: 슬레이브 저장공간 생성

> mkdir var2

> mkdir var3

* 서버 실행

: 마스터 서버 실행

> mongod -dbpath 경로 -port 포트번호 -master

: 슬레이브 서버 실행

> mongod -dbpath 경로 -port 포트번호 -slave -source 마스터URL

> mongod -dbpath 경로 -port 포트번호 -slave -source localhost:10000

* 데이터 저장

> mongo localhost:10000    //    마스터에 접속

데이터 입력 후

* 데이터 확인

> mongo localhost:10001    //    슬레이브 접속

저장 데이터 확인하기


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

MapReduce  (0) 2017.04.04
mongoDB 리플리카 셋으로 장애 대응방법 배우기  (0) 2017.04.04
MongoDB 샤딩  (1) 2017.04.03
MongoDB Index기능  (0) 2017.04.03
MongoDB 명령어  (0) 2017.04.03

+ Recent posts