MongoDB 출현 배경 알아보기
클라우드, 빅데이터 출현함으로써 이를 효율적으로 처리할 빅데이터 솔루션이 필요해짐 -> NoSQL(Not Only SQL) 의 등장 -> 대량의 데이터를 빠른 속도로 처리가능 (SQL의 부족한 점을 돕는 기능, 완벽하게 대체는 X) -> NoSQL의 종류 중 하나인 document key/value Store 의 대표 케이스가 MongoDB이다.
클라우드
- 클라우드 컴퓨팅 : 인터넷 기반 컴퓨팅 기술, 개인 단말기는 주로 입/출력만 이루어지고 정보 분석 및 처리, 저장, 관리, 유통 등은 클라우드 공간에서 이루어지는 컴퓨팅 시스템
- 인터넷 상의 유틸리티 데이터 서버에 프로그램을 두고 그때 그때 컴퓨터, 휴대폰 등에 불러와서 사용하는 웹 기반 소프트웨어 서비스
클라우드 장점
- 초기 구입 비용과 비용이 적으며 휴대성이 높다.
- 컴퓨터 가용율이 높다.
(그린 IT 개념, * 그린it : 지구 환경을 보호하는 차원에서 친환경적인 성격을 갖는 IT 기기나 IT 기술)
- 다양한 기기를 단말기로 사용하는 것이 가능
- 서비스를 통한 일관성 있는 사용자 환경 구현 가능
- 사용자 데이터를 신뢰성 높은 서버에 안전하게 보관 가능
- 전문적인 하드웨어 지식 없이 쉽게 사용 가능
클라우드 단점
- 서버가 공격 당하면 개인정보 유출 가능
- 재해에 의해 데이터가 손상되면 백업하지 않은 정보 복구 불가
- 애플리케이션 설치 제약, 새로운 애플리케이션 미지원
- 열악한 통신환경에서의 서비스 이용 어려움
- 개별 정보 물리적인 위치 파악 불가
빅데이터
그 전에는 분석이 불가능했지만 IT가 발전하면서 다룰 수 있게 된 방대한 양의 데이터
ex) 휴대폰 통화내역, 기상 정보, 실시간 교통량, 인터넷 검색 내역, 소셜네트워크서비스 메세지 등등
빅데이터 특징
- 데이터의 양 (Volume)
- 데이터 생성 속도 (Velocity)
- 형태의 다양성 (Variety)
- 빅데이터에서 이름, 나이, 주민번호, 성별, 직업 등의 정형적인 특성보다 '당신이 어디에서 무엇을 하며, 어떤 행동 방식을 선호하는가' 가 의미있는 자료가 된다.
빅데이터 solutions 로 NoSQL 등장
https://blckchainetc.tistory.com/349
NoSQL 중 Doucment data model 의 대표적인 MongoDB
MongoDB 개요
- 10gen 사에서 개발한 솔루션 ( C++로 만듬)
- key-value 와 다르게 여러 용도로 사용이 가능 (범용적)
- 스키마를 고정하지 않는 형태
* 스키마 변경으로 오는 문제 없음
* 데이터를 구조화해서 json 형태로 저장 (데이터를 key-value화 저장)
- json 형태를 사용함 (아래 json에 대한 설명 有)
- join 이 불가능 -> 애초에 join 필요없도록 데이터 설계 필요
MongoDB 특징
- 메모리맵 형태의 파일엔진 DB이기 때문에 메모리에 의존적
* 메모리 크기가 성능을 좌우
* 메모리를 넘어서는 경우 성능이 급격히 저하됨
- 쌓아놓고 삭제가 없는 경우 적합
* 로그 데이터
* 이벤트 참여내역
* 세션
- 트랜젝션이 필요한 금융, 결제, 빌링, 회원정보 등에는 부적합 ( 요론 경우들은 RDBMS )
모든 것을 mongoDB로 하는 것이 아니라 적절하고 필요한 경우에 사용,
일관성을 유지해야하고 보완성이 필요한 중요정보 등의 경우에는 RDBMS를 사용
Document Data Model
가장 큰 { } 괄호가 하나의 document 이다. 하나의 document안에 key : value 형태로 다양한 형태의 데이터들이 담겨 있다.
Document Data Model : 데이터 설계를 "종이 문서" 설계하듯이 해야 한다.
- 속성의 이름과 값으로 이루어진 쌍의 집합 (key & value)
- 속성(value)은 문자열이나 숫자, 날짜 가능
- 배열 또는 다른 도큐먼트를 지정하는 것도 가능
- 하나의 document에 필요한 정보를 모두 담아야 함
- one query로 모두 해결이 되게끔 collection model 설계를 해야 함
- join이 불가능하므로 필요한 데이터를 미리 embedding 시켜야 함
* json *
- json : JavaScript Object Notation * notation : 표기법
- lightweight data 교환 형식
- 사람이 읽고 쓰기 쉽고, 기계가 parsing하고 생성하기 쉬움
- JavaScript의 Array 문법으로 데이터 구조를 기술하는 방법으로 XML이 가지는 유연성과 구조적 데이터 표현기능을 확보하면서, XML이 가진 오버헤드를 줄이는 방법으로 사용됨
- 클라이언트에서 처리 포포몬쓰 높음
- XML이 표현하는 구조적인 정보 모두 표현 가능
- 송수신 데이터로 XML를 사용하는 것보다 훨씬 빠르고, 간편
Mongo DB 장점 단점
MongoDB 장점
- Schema-less 구조 :
* 다양한 형태의 데이터 저장 가능
* 데이터 모델의 유연한 변화 가능 (데이터 모델 변경, 필드 확장 용이)
- Read/Write 성능 뛰어남
- Sacale Out 구조
* 많은 데이터 저장 가능
* 장비 확장이 간단함
- JSON 구조 : 데이터 직관적 이해 가능
- 사용 방법 쉽고, 개발이 편리함
- MongoDB와 MySQL 에서 동일한 데이터로 CRUD를 수행할 때 대부분 MongoDB가 빠르다.
- Single Node, Multi Node 간에 성능 차이는 거의 없다.
MongoDB 단점
- 데이터 업데이트 중 장애 발생 시, 데이터 손실 가능 (분산 처리 시스템 - 데이터의 부분 결함 가능성이 있다._)
=> 감안하고 사용해야함
- 많은 인덱스 사용 시, 충분한 메모리 확보 필요
- 데이터 공간 소모가 RDBMS에 비해 많음 (비효율적인 key 중복 입력)
- 복잡한 join 사용시 성능 제약이 따름
* join 예시 : embedded document로 collection 안에 하나의 field에 조인될 만한 로우를 입력하는 방식을 사용
ex) $lookup 이라는 함수로 join과 동일한 효과로 collection을 합칠 수 있다.
- transactions 지원이 RDBMS 대비 미약
- 제공되는 map reduce 작업이 hadoop에 비해 성능이 떨어짐
- MongoDB의 불안전성 : 데이터의 유실 가능성 (큰 데이터 모두가 아닌 중간중간 일부 데이터)
* 데이터 양이 많을 경우
- 일부 데이터 손실 가능성 존재
- 샤딩(데이터 분산 저장)의 비정상적인 동작 가능성
- 레플리카 프로세스(복제하는 기능) 의 비정상 동작 가능성
- MongoDB Multi Node의 Insert 연산 중에 연산 실패가 일어나는 경우 발생
=> 장점이 극명하여 단점을 감안하고도 많이 사용됨 (NoSQL 사용 비율 1위)
분산을 목적으로 한 DBMS선택할 경우, RDBMS에 비해 낮은 비용과 빠른 성능을 제공하는 MongoDB가 유리하다.
MongoDB 주요 기능
MongoDB 인덱스
- 다수 인덱스 설정 가능
- 복합 인덱스 지원
- 빠른 검색 지원
- 도큐먼트에 저장된 데이터와 중복 저장되는 문제 있음
- 메모리가 부족한 시스템에서는 검색 속도 저하 문제 있음
MongoDB 복제
- Master-Slave 구조 구성
- 데이터 복사본을 Slave에 배치
- Master 장애에 따른 데이터 손실 없이 Slave 데이터 사용 가능
- Master 장애가 발생했을 때, Slave에서 Master 선출 가능 (중단없는 서비스 가능)
* 여러대의 서버로 데이터를 분산 저장하고 손실 방지하기 위해 복제 수행 -> 단순히 수동적인 복제가 아님
Master 문제가 발생했다는 것을 능동적으로 감지하고 그것에 대한 대응을 스스로 함
(운영자 or 개발자 개입 없이)
- 데이터 손실을 최소화하기 위해 저널링 지원 (MongoDB의 데이터 변화에 따른 모든 연산에 대한 로그 적재)
* 이 로그를 가지고 손실된 데이터를 복구
BigData with MongoDB
- Memory Mapped 사용 (데이터 쓰기 시에 OS의 가상 메모리에 데이터를 넣은 후 비동기로 디스크에 기록하는 방식)
- 방대한 데이터를 빠르게 처리 가능
- OS의 메모리를 활용하기 때문에 메모리가 차면 하드디스크로 데이터 처리하여 속도가 급격히 느려짐
- 하드웨어적인 측면에서 투자가 필요
MongoDB 샤딩 (Sharding)
- 대용량의 데이터를 저장하기 위한 방법
* 소프트웨어적으로 데이터베이스를 분산시켜 처리하는 구조
- 샤딩 방식
* 데이터베이스가 저장하고 있는 테이블을 테이블 단위로 분리하는 방법
* 데이터베이스가 저장하고 있는 테이블 자체를 분할하는 방법
- 분산 데이터베이스의 전통적인 분할 3계층 구조 지원
* 응용 계층, 중개자 계층, 데이터 계층
* 응용 계층은 데이터에 접근하기 위해 중개자를 통해 모든 데이터의 입출력을 처리
* 추상화된 한개의 데이터베이스가 존재하는 것처럼 운용
* 샤딩 : 샤딩은 "조각내다"라는 뜻으로 데이터베이스 저장기법 중 하나이며, 전체 네트워크를 분할한 뒤 트랜잭션을 영역별로 저장하고 이를 병렬적으로 처리하는 방법
(블록체인에 확장성을 부여하는 온체인 솔루션으로 데이터를 샤드라는 단위로 나눠서 저장 및 처리한다.)
MongoDB 맵리듀스 (map reduce)
- 대용량의 데이터를 안전하고 빠르게 처리하기 위한 방법
* 데이터를 분산하여 연산하고 다시 합치는 기술
* 맵과 리듀스 단계로 나누어 처리하며, 사용자가 임의 코딩 가능
* 입/출력 데이터는 key-value형태로 구성
- 한대 이상의 하드웨어를 활용하는 분산 프로그래밍 모델
* 분산을 통해 분할된 조각으로 처리한 다음, 다시 모아서 훨씬 짧은 시간에 계산을 완료
- 대용량 파일에 대한 로그 분석, 색인 구축 검색 등에 활용
- 일괄처리 방식으로 전체 데이터 셋을 분석할 필요가 있는 문제에 적합
MongoDB CRUD Query
1. Create (C)
db.person.save( {'name':'emily'} );
2. Read (R)
db.person.find();
3. Update (U)
db.users.update( {name:'emily'}, {name: 'Cash', languages: ['english']} );
4. Delete (D)
db.users.remove( {name: 'emily'} );
mongoDB 설치 & 설정
MongoDB
1) 수평적 확장이라는 특성을 가짐
2) 한 대 이상의 서버로 구성하는 것이 일반적
3) 메모리 사용 가능량에 대비하여 성능이 좌우되기 때문에 독립된 서버에서 실행 권장
4) 기본적으로 MongoDB는 mongod 라는 실행파일을 단위로 실행
5) 데이터를 한 곳에만 저장하면 데이터 손상 시 복구가 불가능하기 때문에 보통 3개의 Replica 단위로 구성하여 데이터를 복제
6) mongos 서버를 통해 마치 한대의 데이터베이스 서버처럼 사용 가능
실습에서는 서버 1개로 ㄱㄱ!
샤드로 구성된 mongod 서버들을 mogos 라우터를 통해 연결, mongos 조차도 여러대로 분산하여 저장할 수 있고 최상위에는 Load Balancer 를 둠
필요하다면 다른 장소에 있는 Data center B 에도 복제set를 구성해줄 수 있다.
mongoDB 설치
https://www.mongodb.com/try/download/community
mongoDB 환경변수 설정 & mongoDB path 설정 및 shell 실행
mongoDB 안전 종료 (clean exit)
use admin;
db.shutdownServer();
mongoDB와 node.js=잘 맞음
node.js 기본 개념
1) Event-driven
- 사용자 또는 외부 환경이 만들어낸 사건(event)를 기반으로 어떤 처리를 할지 지정해주는 개발 방식
ex) 사용자가 마우스를 움직였다거나 키보드를 입력했다거나 새로운 데이터가 들어왔다거나 이 모든 것을 사 건(event)로 처리
- 일부 웹서버는 데이터가 들어올때까지 무한정 기다리는 문제 있음
2) Non-blocking I/O (비동기식 I/O)
- 쓰기/읽기 이벤트가 시작되어도 모듈을 반환
- 다른 작업이 가능한 준비상태로 전환
- 동기식보다 빠르고 메모리도 적게 차지
Non-blocking 의 반대 -> blocking (동기식 I/O)
- 쓰기/읽기 이벤트가 발생할 경우 해당 이벤트가 끝날때까지 해당 모듈을 계속 점유
- 다른 일을 할 수 없는 상태가 됨
- 메모리를 계속 차지하고 있기 때문에 자원의 낭비가 심함
References : https://www.youtube.com/watch?v=Dvi_TsBMFJo
'mongoDB' 카테고리의 다른 글
[MongoDB] Mongoose Query 총 정리 (0) | 2021.11.15 |
---|---|
[MongoDB] options - lean, new, upsert (0) | 2021.11.15 |
[DB] MongoDB Index 개념과 설계 전략 (0) | 2021.11.12 |
[MongoDB] DAS, NAS, SAN, HDD, SSD, 인덱스란? (0) | 2021.11.11 |
[MongoDB] Node.js express CRUD with mongoDB (2) | 2021.09.28 |