MONGODB

RDB와 NoSQL 비교하기

RDB와 NoSQL 비교하기

database

RDB(Relational Database)

관계형 데이터베이스(Relational Database)란 데이터가 중복되지 않도록 하여 테이블의 역할이 명확하게 구분하고 테이블 간에는 외래키(FK)를 사용하여 데이터를 공유하는 것으로 서로 관계를 맺도록 설계한 데이터 모델이다. 데이터의 중복이 허락되지 않기 때문에 Object 안에 Object를 넣을 수 없어 두 개의 테이블의 데이터를 조인해서 사용한다.

NoSQL(Not Only SQL)

비관계형 데이터베스(NoSQL)는 데이터 중복이 가능하여 Object안에 Object를 넣을 수 있다. 그렇기 때문에 컬렉션과 컬렉션 간에 관계가 존재하지 않는다. 이는 데이터를 Select할 때 매우 빠른 속도를 자랑한다. 하지만 데이터의 중복으로 인해 각각의 컬렉션의 데이터를 동기화하는데 시간이 걸린다. 이를 커버하는 기술이 바로 샤딩으로 MongoDB에서 이 기술을 제공하고 있다.

데이터 요청시 문제점

CPU가 RAM 메모리에 데이터를 요청할 때 RAM에 적재되어 있는 데이터를 가져올 경우 I/O가 발생하지 않지만 하드디스크에서 데이터를 가져와야할 경우 I/O가 발생한다. 이를 페이지 교체가 일어난다고 하는데 속도가 현저히 떨어진다.

Blocking I/O

I/O 작업이 진행되는 동안 유저 프로세스는 자신의 작업을 중단한 채 대기하는 방식이다.

문제 해결 방법

이 문제를 해결하기 위한 방법으로 수직적 확장(Scale up)과 수평적 확장(Scale out)이 있다. 수직적 확장(Scale up)은 컴퓨터의 성능을 업그레이드 하는 방법이고 수평적 확장은 컴퓨터를 여러대 사용하여 분산시키는 방법이다.

수직적 확장(Scale up)

수직적 확장을 하게 되면 하나의 컴퓨터에서 데이터를 관리하기 때문에 데이터 쓰기(추가, 수정, 삭제)를 할 때 한번에 할 수 있으며 컴퓨터가 분산되어 있지 않아 동기화가 필요없어 데이터의 일관성이 유지된다. 하지만 하나의 컴퓨터에서 데이터를 관리하게 되면 RAM의 공간에 한계가 있으므로 결국에는 하드웨어에서 데이터를 가져오게 되는데 이 과정에서 I/O가 일어나기 때문에 데이터 읽기에서 성능이 떨어질 수 밖에 없다.

이 방법은 데이터 테이블이 서로 연계되어 있어 데이터 쓰기를 할 때 한번에 할 수 있는 RDB 방식의 데이터 모델에 적합하다. 주로 데이터 쓰기가 자주 일어나고 데이터의 정확성이 요구되는 정형화된 프로그램에서 도입된다.

수평적 확장(Scale out=RAID)

수평적 확장은 컴퓨터를 분산해서 데이터를 관리하는데 여기서 분산이란 데이터를 나누어 가지는 것이 아닌 같은 데이터를 복제(=레플리카)하는 것을 의미한다. 라우터에서는 각각의 레플리카의 가동 상태를 확인하여 최소한의 시간으로 데이터를 요청받을 수 있는 곳으로 보낸다. 같은 데이터를 공유하고 있는 레플리카에서 데이터 쓰기가 일어날 경우 레플리카 간의 동기화로 데이터를 업데이트하는데 이는 동기화하는 과정에서 여러번 쓰기를 해야하고 동기화되는 시점에 따라 딜레이가 생겨 일관성이 유지되기 어려워진다. 하지만 동일한 데이터를 각각의 레플리카가 가지고 있기 때문에 읽기 속도는 매우 빨라진다.

이 방법은 데이터 테이블이 서로 연계되어 있는 RDB에서는 적합하지 않지만 컬렉션 사이의 관계가 없고 중복된 데이터를 가질 수 있는 NoSQL 방식의 데이터 모델에 적합하다. 주로 데이터의 정확성 보다 읽기 속도가 요구되고 쓰기보다 읽기가 자주 읽어나는 소셜 네트워크 서비스(SNS) 등에 도입된다.

샤딩이란

NoSQL 데이터 모델의 느린 write 속도를 커버하기 위해서 MongoDB에서는 샤딩이라는 기술을 제공한다. 샤딩은 같은 데이터를 복제하여 레플리카를 만들어내는 수평적 확장과는 달리 데이터를 나누어 가지는 방식으로 라우터(mongos)에서는 메타 데이터(데이터의 저장된 위치(index:목차) : Config-Server) 정보를 가지고 있다. 이는 수평적 확장의 단점인 쓰기 속도를 빠르게 한다.

RDB vs NoSQL 특징 한눈에 보기

RDB의 특징

  • SQL 쿼리 언어를 사용한다.
  • 테이블마다 스키마(Schema)를 정의해야한다.
  • 데이터 타입과 제약으로 데이터의 정확성이 보장된다.
  • 속도보다 트렌젝션 시의 ACID가 중요하다.
  • 수직적 확장(Scale up)에 적합하다
  • 데이터 중복이 없어 쓰기 속도가 빠르다
  • 비용이 많이 들어 확장성이 좋지 않다.
  • Undo와 Redo를 제공한다.
  • MariaDB, MySQL, Oracle 등이 있다.
ACID

Atomicity(원자성) : 트렌젝션이 중간에 중단되지 않고 처음부터 끝까지 수행하는 것

Consistency(일관성) : 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것

Insolation(격리성) : 트렌젝션 처리 중에 간섭하지 못하도록 하는 것

Durability(지속성) : 하나의 트렉젝션이 발동하면 하드디스크에 영구히 저장되는 것

스키마 : 데이터베이스에서 자료의 구조, 자료의 표현 방법, 자료 간의 관계를 형식 언어로 정의한 구조

트렌젝션 : 일을 처리하는 가장 작은 단위

NoSQL의 특징

  • SQL 쿼리 언어를 사용하지 않는다.
  • 스키마를 반드시 정의하지 않아도 된다.(Schema-less)
  • 사용 목적에 따라 ACID가 중요하지 않을 수 있다.
  • RDB의 확장성 이슈를 해결하기 위해 나온 데이터베이스 모델이다.
  • key-value방식으로 데이터를 관리한다.
  • 수평적 확장(Scale out)에 적합하다.
  • 데이터 중복이 가능해 읽기 속도가 빠르다.
  • Undo와 Redo를 제공하지 않는다.
  • 트렌젝션 관리가 안된다.
  • MongoDB, redies 등이 있다.
최신글