NoSQL은 관계형 데이터베이스(RDBS)보다 덜 제한적인 일관성 모델(비관계형)을 이용하는 데이터 저장 및 검색을 위한 매커니즘을 제공한다. NoSQL은 단순 검색, 추가 작업을 위한 최적화된 키 값 저장 공간으로 시간과 처리율에서 성능 이익을 내는 것이 목적이다. 스키마 없이 사용 가능하거나 느슨한 스키마를 제공하는 저장소를 의미한다.
종류마다 쓰기/읽기 성능 특화, 2차 인덱스 지원, 오토 샤딩 지원 같은 고유의 특징을 가지게 된다. 대량의 데이터를 빠르게 처리하기 위해 메모리에 임시 저장하고 응답하는 등의 방법을 사용한다. 동적인 스케일 아웃을 지원하기도 하며, 가용성을 위해 데이터 복제 등의 방법으로 관계형 데이터베이스가 제공하지 못하는 기능과 성능을 제공한다.
일관성은 동시성 혹은 동일성이라고도 한다. 이는 다중 클라이언트가 같은 시간에 조회할 경우에 항상 동일한 데이터를 보여주는 것을 보장하는 것을 말한다. 이는 관계형 데이터베이스가 지원하는 가장 기본적인 기능이다.
NoSQL의 경우 데이터의 일관성이 느슨하게 처리되어 동일한 데이터가 조회되지 않을 수도 있다. 여기서 느슨하게 처리된다는 것은 데이터의 변경을 시간의 흐름에 따라 여러 노드에 전파하는 방식을 의미한다. 이와 같은 방식을 이용하기 때문에 그때 그때의 일관성은 지원되지 않을 수도 있지만 최종적으로는 일관성을 유지하게 된다. 그래서 이를 최종 일관성, 궁극적 일관성을 지원한다고 한다.
NoSQL은 분산 노드 간의 데이터 동기화를 2가지 방법으로 진행한다.
가용성은 모든 클라이언트의 읽기, 쓰기 요청에 대해 항상 응답이 가능한 특성을 의미한다. 이를 내고장성이라고도 한다. NoSQL은 클러스터 내의 몇몇 노드가 동작하지 않아도 내고장성을 유지한다.
몇몇 NoSQL은 가용성을 보장하기 위해 데이터 복제를 사용한다. 동일한 데이터를 다중 노드에 중복 저장하고 그 중 몇몇 노드가 고장나더라도 데이터가 유실되지 않도록 하는 방법이다. 데이터 중복 저장 방법은 2가지가 있다.
분할 허용성이란 지역적으로 분할된 네트워크 환경에서 동작하는 시스템에서 두 지역 간의 네트워크가 단절되거나 네트워크 데이터의 유실이 발생하여도 각 지역 내의 시스템이 정상적으로 동작하는 특성을 의미한다.
Key-Value Model
, Document Model
, Column Model
, Graph Model
로 분류 가능하다.
가장 기본적인 형태의 NoSQL로 Key 하나와 Value 하나로 저장하고 조회할 수 있는 단일 키-값 구조를 가진다. 단순한 저장구조로 인해 복잡한 조회 연산은 지원하지 않고, 고속 읽기와 고속 쓰기에 최적화된 경우가 많다. 하나의 서비스 요청에 다수의 데이터 조회, 수정 연산이 발생할 경우 트랜잭션 처리를 할 수 없기 때문에 정형성을 보장하지 못한다. 보통 사용자의 프로필 정보, 웹 서버 클러스터를 위한 세션 정보, 장바구니 정보, URL 단축 정보 저장에 사용된다.
Key-Value Model의 확장된 형태로 하나의 키에 하나의 구조화된 문서를 저장하고 조회한다. 논리적인 데이터 저장과 조회 방법이 관계형 데이터베이스와 유사하다. 키는 문서의 ID로 표현되고 저장된 문서를 컬렉션으로 관리한다. 문서 자장과 동시에 문서 ID에 대한 인덱스가 생성된다. 문서 ID에 대한 인덱스를 사용하여 O(1)에 문서를 조회할 수 있다.
대부분의 Document Model은 B-Tree 인덱스를 사용하여 2차 인덱스를 생성한다. B-Tree는 크기가 커질 수록 새로운 데이터를 입력하거나 삭제하는 성능이 안좋아지기 때문에 읽기와 쓰기를 7:3의 비율로 유지할 때 성능이 가장 좋다. 보통 중앙 집중식 로그 저장, 타임라인 저장, 통계 정보 저장 등에 사용된다. (Mongo DB)
하나의 키에 여러 개의 컬럼 이름과 컬럼 값의 쌍으로 이루어진 데이터를 저장하고 조회한다. 모든 컬럼은 항상 타임 스탬프(TimeStamp) 값과 함께 저장된다.
Column Model은 구글의 빅테이블의 영향을 받았다. 이로 인해 Row Key, Column Key, Column Family 같은 빅테이블의 개념이 공통적으로 사용된다. 저장의 기본 단위는 컬럼으로 컬럼 이름, 컬럼 값, 타임스탬프로 구성된다. 이러한 컬럼의 집합을 Row라고 하고, Row Key는 각 Row를 식별하는 값이다. Row들의 집합은 Key Space라고 한다.
보통 Column Model은 읽기보다 쓰기에 더 특화되어 있다. 데이터를 먼저 커밋로그와 메모리에 저장한 후에 응답하기 때문에 응답속도가 빠르다. 그렇기 때문에 읽기 연산보다 쓰기 연산이 많은 서비스나 빠른 시간 안에 대량의 데이터를 입력하고 조회하는 서비스를 구현하기에 가장 알맞다. 보통 채팅 내용 저장, 실시간 분석을 위한 데이터 저장소 등의 서비스 구현에 사용된다.