[ CS / DataBase ] NoSQL

xx0hn·2022년 1월 26일
0

CS

목록 보기
17/47

NoSQL


NoSQL은 관계형 데이터베이스(RDBS)보다 덜 제한적인 일관성 모델(비관계형)을 이용하는 데이터 저장 및 검색을 위한 매커니즘을 제공한다. NoSQL은 단순 검색, 추가 작업을 위한 최적화된 키 값 저장 공간으로 시간과 처리율에서 성능 이익을 내는 것이 목적이다. 스키마 없이 사용 가능하거나 느슨한 스키마를 제공하는 저장소를 의미한다.

종류마다 쓰기/읽기 성능 특화, 2차 인덱스 지원, 오토 샤딩 지원 같은 고유의 특징을 가지게 된다. 대량의 데이터를 빠르게 처리하기 위해 메모리에 임시 저장하고 응답하는 등의 방법을 사용한다. 동적인 스케일 아웃을 지원하기도 하며, 가용성을 위해 데이터 복제 등의 방법으로 관계형 데이터베이스가 제공하지 못하는 기능과 성능을 제공한다.

CAP 이론

일관성 (Consistency)

일관성은 동시성 혹은 동일성이라고도 한다. 이는 다중 클라이언트가 같은 시간에 조회할 경우에 항상 동일한 데이터를 보여주는 것을 보장하는 것을 말한다. 이는 관계형 데이터베이스가 지원하는 가장 기본적인 기능이다.

NoSQL의 경우 데이터의 일관성이 느슨하게 처리되어 동일한 데이터가 조회되지 않을 수도 있다. 여기서 느슨하게 처리된다는 것은 데이터의 변경을 시간의 흐름에 따라 여러 노드에 전파하는 방식을 의미한다. 이와 같은 방식을 이용하기 때문에 그때 그때의 일관성은 지원되지 않을 수도 있지만 최종적으로는 일관성을 유지하게 된다. 그래서 이를 최종 일관성, 궁극적 일관성을 지원한다고 한다.

NoSQL은 분산 노드 간의 데이터 동기화를 2가지 방법으로 진행한다.

  • 데이터의 저장 결과를 클라이언트에게 응답하기 전에 모든 노드에 데이터를 저장하는 동기식 방법.
    -> 응답시간은 느리지만 데이터의 정합성을 보장
  • 메모리나 임시 파일에 기록하고 클라이언트에 먼저 응답한 후에 특정 이벤트나 프로세스를 사용하여 노드로 데이터를 동기화하는 비동기식 방법.
    -> 응답시간은 빠르지만 쓰기 노드에 장애가 발생할 경우 데이터 손실 발생 가능

가용성 (Availability)

가용성은 모든 클라이언트의 읽기, 쓰기 요청에 대해 항상 응답이 가능한 특성을 의미한다. 이를 내고장성이라고도 한다. NoSQL은 클러스터 내의 몇몇 노드가 동작하지 않아도 내고장성을 유지한다.

몇몇 NoSQL은 가용성을 보장하기 위해 데이터 복제를 사용한다. 동일한 데이터를 다중 노드에 중복 저장하고 그 중 몇몇 노드가 고장나더라도 데이터가 유실되지 않도록 하는 방법이다. 데이터 중복 저장 방법은 2가지가 있다.

  • Master-Slave 복제 방법
    -> 동일한 데이터를 가진 저장소를 하나 더 생성
  • Peer-to-Peer 복제 방법
    -> 데이터 단위로 중복 저장

네트워크 분할 허용성 (Partition tolerance)

분할 허용성이란 지역적으로 분할된 네트워크 환경에서 동작하는 시스템에서 두 지역 간의 네트워크가 단절되거나 네트워크 데이터의 유실이 발생하여도 각 지역 내의 시스템이 정상적으로 동작하는 특성을 의미한다.

저장 방식에 따른 NoSQL 분류

Key-Value Model, Document Model, Column Model, Graph Model로 분류 가능하다.

Key-Value Model

가장 기본적인 형태의 NoSQL로 Key 하나와 Value 하나로 저장하고 조회할 수 있는 단일 키-값 구조를 가진다. 단순한 저장구조로 인해 복잡한 조회 연산은 지원하지 않고, 고속 읽기와 고속 쓰기에 최적화된 경우가 많다. 하나의 서비스 요청에 다수의 데이터 조회, 수정 연산이 발생할 경우 트랜잭션 처리를 할 수 없기 때문에 정형성을 보장하지 못한다. 보통 사용자의 프로필 정보, 웹 서버 클러스터를 위한 세션 정보, 장바구니 정보, URL 단축 정보 저장에 사용된다.

Document Model

Key-Value Model의 확장된 형태로 하나의 키에 하나의 구조화된 문서를 저장하고 조회한다. 논리적인 데이터 저장과 조회 방법이 관계형 데이터베이스와 유사하다. 키는 문서의 ID로 표현되고 저장된 문서를 컬렉션으로 관리한다. 문서 자장과 동시에 문서 ID에 대한 인덱스가 생성된다. 문서 ID에 대한 인덱스를 사용하여 O(1)에 문서를 조회할 수 있다.

대부분의 Document Model은 B-Tree 인덱스를 사용하여 2차 인덱스를 생성한다. B-Tree는 크기가 커질 수록 새로운 데이터를 입력하거나 삭제하는 성능이 안좋아지기 때문에 읽기와 쓰기를 7:3의 비율로 유지할 때 성능이 가장 좋다. 보통 중앙 집중식 로그 저장, 타임라인 저장, 통계 정보 저장 등에 사용된다. (Mongo DB)

Column Model

하나의 키에 여러 개의 컬럼 이름과 컬럼 값의 쌍으로 이루어진 데이터를 저장하고 조회한다. 모든 컬럼은 항상 타임 스탬프(TimeStamp) 값과 함께 저장된다.

Column Model은 구글의 빅테이블의 영향을 받았다. 이로 인해 Row Key, Column Key, Column Family 같은 빅테이블의 개념이 공통적으로 사용된다. 저장의 기본 단위는 컬럼으로 컬럼 이름, 컬럼 값, 타임스탬프로 구성된다. 이러한 컬럼의 집합을 Row라고 하고, Row Key는 각 Row를 식별하는 값이다. Row들의 집합은 Key Space라고 한다.

보통 Column Model은 읽기보다 쓰기에 더 특화되어 있다. 데이터를 먼저 커밋로그와 메모리에 저장한 후에 응답하기 때문에 응답속도가 빠르다. 그렇기 때문에 읽기 연산보다 쓰기 연산이 많은 서비스나 빠른 시간 안에 대량의 데이터를 입력하고 조회하는 서비스를 구현하기에 가장 알맞다. 보통 채팅 내용 저장, 실시간 분석을 위한 데이터 저장소 등의 서비스 구현에 사용된다.

NoSQL 장단점

장점

  • 관계형 데이터베이스에 비해 저렴한 비용으로 분산 처리, 병렬 처리 가능
  • 비정형 데이터 구조로 설계 비용 감소
  • 관계형 데이터베이스의 join, relation을 linking, embedded로 구현하여 좋은 성능
  • Big Data 효과적 처리 가능
  • 가변적인 구조로 데이터 저장 가능
  • Scale out 구조를 채택하여 서버 확장에 용이하고 더 많은 데이터 저장 가능
  • Document based 구조로 데이터 모델의 유연한 변화 가능
  • json 구조로 관계형 데이터베이스 테이블 구조에 비해 데이터를 직관적으로 파악 가능
  • Auto Sharding 지원
    (Sharding: 단일의 논리적 데이터 set을 여러개의 데이터베이스에 쪼개고 나누는 방법. 이를 통해 데이터베이스 시스템의 클러스터에서 큰 데이터 set을 저장하고 추가적인 요청을 할 수 있음. 데이터 set이 단일 데이터베이스에서 저장하기에 너무 클 경우 필수적으로 사용됨.)

단점

  • 데이터 업데이트 중 장애가 발생할 경우 데이터 손실 위험
  • 많은 인덱스를 사용하기 위해서는 충분한 메모리가 필요 (인덱스 구조가 메모리에 저장)
  • 복잡한 join 처리 곤란 (Document based이기 때문)
  • NoSQL의 경우 Sharding 방식을 통해 큰 테이블을 여러 서버에 나눠 저장하는데 fault tolerancy를 위해 데이터가 두개 이상의 서버에 저장됨. 이때 어떤 데이터가 update되었을 때 중복 저장된 서버들에 해당 update가 적용되는데 시간이 걸림.
  • 관계형 데이터베이스는 일관성을 위해 모든 서버를 update하기 전에 lock을 걸어두는데 NoSQL에서도 lock을 걸게 되면 성능이 떨어지기 때문에 lock을 걸지 않음. -> 데이터 일관성이 항상 보장되지 않음
profile
개발 일기

0개의 댓글