1. Document Database
- 문서는 문서 데이터베이스의 주요 개념입니다.
- 문서 데이터베이스는 문서를 저장하고 조회합니다.
- 문서는 XML, JSON, BSON 등의 형식으로 저장됩니다.
- 문서는 맵, 컬렉션, 스칼라 값을 가질 수 있습니다.
- 저장된 문서는 서로 비슷하지만 구조가 완전히 같지 않아도 됩니다.
- 문서 데이터베이스는 키-값 저장소의 값 부분에서 문서를 저장한다고 볼 수 있습니다.
- 즉 문서 데이터베이스는 값을 검사할 수 있는 키-값 저장소라고 볼 수 있습니다.
2. RDB와 비교
- RDB의 대표로 Oracle을, Document Database의 대표로 MongoDB를 들어 비교해보겠습니다.
| Oracle (RDB) | MongoDB (Document DB) |
|---|
| 데이터베이스 인스턴스 | MongoDB 인스턴스 |
| 스키마 | 데이터베이스 |
| 테이블 | 컬렉션 |
| 로우(행) | 문서 |
| rowid | _id |
| 조인 | DBRef |
- 각 MongoDB 인스턴스는 여러 개의 데이터베이스를 가지며, 각 데이터베이스는 여러 개의 컬렉션을 가질 수 있습니다.
- 문서를 저장할 때 어느 데이터베이스의 어느 컬렉션에 속할지 지정해야 합니다.
3. 문서
- 문서 데이터베이스에서는 컬렉션에 구조가 다른 문서를 저장할 수 있습니다.
- 테이블의 모든 행이 같은 스키마를 따라야하는 관계형 데이터베이스와는 다릅니다.
4. 일관성
- 몽고 디비는 데이터베이스에서 복제본 집합을 사용해 일관성 수준을 설정합니다.
- 쓰기가 모든 슬레이브에 복제될 때까지 기다릴지 아니면 주어신 수의 슬레이브에 복제되면 바로 응답할지 설정할 수 있습니다.
- 각 쓰기 명령마다 성공을 반환하기 전에 쓰기를 전파해야 하는 서버 수를 설정할 수 있습니다.
db.runCommand({ getlasterror: 1, w: "majority"}) 같은 명령어로 일관성이 어느 정도로 강해야 하는지 설정할 수 있습니다.
- 예를 들면, 서버가 한 대 있고 w를 majority로 설정하면, 노드가 하나뿐이므로 쓰기는 즉시 리턴됩니다.
- 만약 복제본 집합에 노드가 세 개 있고 w를 majority로 설정하면, 최소 두 개 노드에서 쓰기가 완료되어야 성공으로 보고됩니다.
- 일관성을 강화하기 위해 w를 높일 수 있습니다.
- 그 러나 쓰기가 더 많은 노드에서 완료되어야 하므로 쓰기 성능이 저하됩니다.
5 트랜잭션
- 전통적인 관계형 데이터베이스에서 트랜잭션이란 insert, update, delete 같은 명령으로 여러 테이블에 걸쳐 데이터베이스를 변경한 다음 commit 또는 rollback으로 변경을 확정하거나 취소하는 것을 말합니다.
- 일반적으로 NoSQL 솔루션에서는 유효하지 않습니다.
- 쓰기는 성공하거나 실패한다. 단일 문서 수준에서 트랜잭션을 원자적 트랜잭션이라 합니다.
6 가용성
- 몽고 디비는 복제를 수행하고 복제본 집합을 사용해 고가용성을 확보한다.
6.1 복제본 집합
- 복제본 집합은 비동기 마스터-슬레이브 복제의 한 형태로 둘 이상의 노드로 구성됩니다.
- 복제본 집합에 속한 노드는 노드 중에서 주(마스터)노드를 선정합니다.
- 모든 노드는 동일한 투표권을 가지며, 일부 노드는 다른 서버에 가깝거나 더 많은 메모리가 있는 이유 등으로 선호될 수 있습니다.
- 모든 요청은 마스터로 가고 데이터는 슬레이브로 복제됩니다.
- 마스터 노드가 다운되면 복제본 집합에서 남은 노드 가 투표를 통해 새로운 마스터를 선정한다.
- 다운된 마스터 노드가 복구되면 슬레이브로 복제본 집합에 다시 참여한다. 모든 데이터를 끌어와 다른 노드의 상태를 따라잡는다.
6.2 클라이언트
- 애플리케이션에서 연결할 때 복제본 집한의 한 노드에만 연결하면 됩니다.
- 해당 노드가 마스터인지 아닌지는 중요하지 않습니다.
- 주 노드가 다운되면 드라이버는 복제본 집합이 새로 선정한 주 노드와 통신합니다.
- 애플리케이션에서는 통신 실패나 노드 선택 조건 등에 대해 아무것도 관리하지 않습니다.
7 조회 기능
8 확장성
- 여기서 확장성은 노드를 추가하거나 데이터 스토리지를 변경하는 것을 의미합니다.
- 읽기 부하에 대한 확장성은 읽기 슬레이브를 추가해 읽기 요청을 슬레이브에서 처리하게 하면 달성할 수 있습니다.
- 쓰기 확장성이 필요한 경우 샤딩을 사용할 수 있습니다.
9 사용처
9.1 적절한 사용처
- 이벤트 로깅
- 콘텐츠 관리 시스템, 블로깅 플랫폼
- 웹 분석 또는 실시간 분석
- 전자상거래 애플리케이션
9.2 사용하지 말아야 할 때
- 여러 연산에 걸친 복잡한 트랜잭션
- 여러 문서에 걸친 연산을 원자적으로 처리해야하는 경우 문서 데이터베이스는 적합하지 않습니다.
- 그러나 최근 몽고 디비는 다중 문서 트랜잭션을 지원합니다.
- 변화하는 집합 구조에 대한 쿼리