MongoDB 소개
Key Value 와 다르게 여러 용도로 사용이 가능
스키마가 고정되지 않음
- 스키마 변경으로 이슈가 없음
- 데이터를 구조화해서 json 형태로 저장 ( key - value 화 )
조인이 불가능하기 때문에 조인이 필요없도록 설계 필요
MongoDB 특징
메모리맵 형태의 파일엔진 DB 이기 때문에 메모리에 의존적임
- 메모리 크기가 성능을 좌우
- 메모리를 넘어서는 경우 성능이 급격히 저하됨
쌓기만 하고 삭제가 업는 로직에 적합
- 로그 데이터
- 이벤트 참여 내역
- 세션
왜?
트랜잭션이 필요한 금융, 결제, 빌링, 회원정보등에는 부적합 RDBMS 가 적합
도큐먼트 데이터 모델을 사용
- 속성의 이름과 값으로 이루어진 쌍의 집합
- 속성은 문자열이나 숫자, 날짜 가능
- 배열 또는 다른 도큐먼트를 지정하는것도 가능
- 하나의 도큐먼트에 필요한 정보를 모두 담아야 함
- 원쿼리로 해결되게끔 컬렉션 모델을 설계해야 함
- 조인이 불가능하므로 미리 삽입시켜야 함
도큐먼트 형태의 구조
가장 밖 { } 안의 데이터가 하나의 도큐먼트
{
"_id" : ObjectId("xxx"),
"title" : "Mozi Blog",
"DB" : [ "MongoDB", "MySQL" ]
}
이 도큐먼트는 Json (JavaScript Object Notation) 형태로 만들어짐
- 경량 데이터 교환 방식
- 사람이 읽고 쓰기 쉽고, 기계가 파싱하고 생성하기 쉬움
- 클라이언트에서 처리 퍼포먼스 높음
- XML 이 표현하는 구조적인 정보 모두 표현 가능
MongoDB 장점
스키마리스 구조
- 다양한 형태의 데이터 저장 가능
- 데이터 모델의 유연한 변화 가능
Read/Write 성능이 좋음
Scale Out 구조
- 많은 데이터 저장 가능
- 장비 확장이 간단함
Json 구조
- 데이터 직관적 이해 가능
사용 방법 쉽고 개발 편리
빅데이터 처리에 특화됨
Memory Mapped 방식을 사용 (데이터 쓰기 시 OS 의 가상 메모리에 데이터를 넣은 후 비동기로 디스크에 기록한느 방식)
방대한 데이터를 빠르게 처리 가능
OS 메모리를 활용하기 떄문에 메모리가 차면 하드디스크로 데이터 처리하여 속도가 급격히 느림
하드웨어적인 측면에서 투자가 필요
MongoDB 단점
데이터 업데이트 중 장애 발생 시 데이터 손실 가능 - 분산처리가능 시스템의 부분결함
많은 인덱스 사용 시 충분한 메모리 확보 필요
데이터 공간 소모가 RDBMS 에 비해 많음 ( 비효율적인 Key 중복 입력 )
복잡한 JOIN 사용시 성능 제약이 따름 - 클라이언트 입장
Transactions 지원이 RDBMS 대비 미약함
제공되는 MapReduce 작업이 Hadoop 에 비해 성능이 떨어짐
MongoDB 불안정성 - 오픈소스의 한계
데이터의 양이 많을 경우 손실 가능성
샤딩의 비정상적인 동작 가능성
레플리카 프로세스의 비정상 동작 가능성
MongoDB 성능
MongoDB vs MySQL
MongoDB 에서 동일한 데이터를 가지고 CRUD 를 수행할 때 대부분 MongoDB 가 빠름
MongoDB 의 경우 싱글노드와 멀티노드 간에 성능 차이는 거의 없음
MongoDB 멀티노드의 Insert 연산 중 연산 실패가 일어나는 경우 발생
분산을 목적으로 한 DBMS 선택할 경우 RDBMS 에 비해 낮은 비용과 빠른 성능을 제공하는 MongoDB 가 유리
MongoDB vs MSSQL 2008
쓰기작업 성능 비교 : MongoDB 가 평균 100 배 이상 빠름
읽기작업 성능 비교 : MongoDB 가 평균 3배 이상 빠름
MongoDB 쿼리
Json 형태로 명령어를 전달
C (Create) - save
R (Read) - find
U (Update) - update
D (Delete) - remove
MongoDB 인덱스
다수 인덱스 설정 가능
복합 인덱스 지원
빠른 검색 지원
도큐먼트에 저장된 데이터와 중복 저장 문제
메모리가 부족한 시스템에서는 검색 속도 저하 문제
MongoDB 복제
기본적으로 분산시스템이기 때문에 복제가 상당히 중요
Master-Slave 구조 구성
데이터 복사본을 Slave 에 배치
Master 장애에 따른 데이터 손실 없이 Slave 데이터 사용 가능
Master 장애가 발생했을 때, Slave 에서 MAster 를 선출 가능
데이터 손실을 최소화하기 위해 저널링 지원 ( 데이터 변화에 따른 모든 연산에 대한 로그 적재 )
MongoDB 샤딩
대용량의 데이터를 저장하기 위한 방법
- 소프트웨어적으로 데이터베이스를 분산시켜 처리하는 구조
샤딩방식
- 데이터베이스가 저장하고 있는 테이블을 테이블 단위로 분리하는 방법
- 데이터베이스가 저장하고 있는 테이블 자체를 분할하는 방법
분산 데이터베이스의 전통적인 분할 3계층 구조 지원
- 응용 계층, 중개자 계층, 데이터 계층
- 응용 계층은 데이터에 접근하기 위해 중개자를 통해 모든 데이터의 입출력을 처리
- 추상화된 한개의 데이터베이스가 존재하는 것처럼 운용
client - 응용 계층 ( mongos 로 요청 )
mognos - 중계자 계층 ( client 요청 시 mongod 의 config 를 조회하여 데이터계층의 데이터를 조회 )
mongod - 데이터 계층 ( 샤딩 )
MongoDB 맵리듀스
대용량의 데이터를 안전하고 빠르게 처리하기 위한 방법
- 데이터를 분산하여 연산하고 다시 합치는 기술
- 맵과 리듀스 단계로 나누어 처리하며 사용자가 임의 코딩 가능
- 입출력 데이터는 key value 형태로 구성
한대 이상의 하드웨어를 활용하는 분산 프로그래밍 모델
- 분산을 통해 분할된 조각으로 처리한 다음, 다시 모아서 훨씬 짧은 시간에 계산을 완료
대용량 파일에 대한 로그 분석, 색인 구축 검색 등에 활용
일괄처리 방식으로 전체 데이터 셋을 분석할 필요가 있는 문제에 적합
MongoDB 구성
MongoDB 는 수평적 확장이라는 특징을 가짐
한 대 이상의 서버로 구성하는 것이 일반적
MongoDB 는 메모리 사용 가능량에 대비하여 성능이 좌우되기 때문에 독립된 서버에서 실행을 권장
MongoDB 는 mongod 란느 실행파일을 단위로 실행
데이터를 한곳에만 저장하면 데이터 손상 시 복구가 불가능하기 때문에 보통 Replica 단위를 구성하여 데이터를 복제
mongos 서버를 통해 마치 한대의 데이터베이스 서버처럼 사용 가능
'Database > MongoDB' 카테고리의 다른 글
[MongoDB] 스키마를 설계해보자 (1) | 2024.02.29 |
---|---|
[MongoDB] 몽고DB 의 데이터는 유실될 수 있나 (0) | 2024.02.29 |
[MongoDB] MongoDB 의 파일구조 (1) | 2024.02.22 |
[MongoDB] mongosh OpenSSL configuration error 해결 (0) | 2024.02.22 |
[MongoDB] Amazon Linux 2023 리눅스에 MongoDB 설치 (0) | 2024.02.22 |