본문으로 건너뛰기

DocumentDatabase

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 사용하지 말아야 할 때

  • 여러 연산에 걸친 복잡한 트랜잭션
    • 여러 문서에 걸친 연산을 원자적으로 처리해야하는 경우 문서 데이터베이스는 적합하지 않습니다.
    • 그러나 최근 몽고 디비는 다중 문서 트랜잭션을 지원합니다.
  • 변화하는 집합 구조에 대한 쿼리