본문 바로가기
DataBase

[NoSQL] 기본 개념 정리

by ojava 2018. 11. 28.
반응형
분산 데이터베이스가 가지는 속성

 

NoSQL은 일반적으로 서버를 여러대로 운영하는 분산시스템을 도입하므로 분산 데이터베이스에 속한다.

물론 단일 서버로 운영할 수도 있지만, NoSQL이 가지는 장점을 활용하기 위해서는 여러 대로 운영하는 것이 좋다고 한다.

가용성과 확장성 측면에서도 분산시스템 구성이 바람직하다.

 

NoSQL에서는 응답시간, 일관성, 지속성의 균형을 위해 결과적 일관성(Eventual consistency)을 구현한다.

* 지속성 (Durability) : 긴 시간 동안 올바른 데이터 복사본을 유지하는 속성

 

결과적 일관성이란, 서버가 여러 대인 분산시스템에서 데이터를 조회했을 때

특정 서버는 변경 된 데이터가 조회되고 일부는 변경되지 않은 상태로 조회될 수 있다.

그 때 데이터의 일관성을 위해서 모든 서버에 결과값을 질의하고 N개 이상이 같은 값을 반환할 때 사용자에게 해당 값을 보여주는 형태의 일관성이다.

 

이 때 사용되는 개념이 쿼럼 (Quorum) 과 구성임계값 (Configurable Threshold) 이다.

* 쿼럼 : 완료되었다고 여겨지는 읽기나 쓰기 작업에 반드시 응답해야 하는 서버의 수

* 구성임계값 : 응답여부를 결정짓는 기준.

 

응답시간 - 일관성 사이의 균형을 맞추기 위해 구성임계값을 조정한다.

임계값이 높을 수록 일관성이 높고 정확해지며, 낮을 수록 속도는 빨라지나 일관성이 깨진다.

 

또한, 응답시간 - 지속성 사이의 균형을 맞추는 경우에도 사용할 수 있다.

임계값 수가 적으면 서버 N 대중 일부에만 데이터를 저장하고 완료했다고 결과값을 내보내므로

지속성 측면에서는 임계값 = 서버 전체 대수와 일치해야만 지속성을 유지할 수 있다.

 

 

분산 데이터 데이터는 CAP 속성을 동시에 가질 수 없다고 한다. (에릭 브루어 Eric Brewer의 이론이라고 함)

C 일관성 (Consistency) : 서버 간에 일관된 데이터 유지

A 가용성 (Availability) : 질의에 대한 응답 제공

P 파티션 허용 (Partition protection) : 둘 이상의 데이터 베이스 서버가 연결된 네트워크에 문제가 생겨도 각 서버는 일관된 데이터를 가진다.

 

각각 보면 다 갖춰야 하는 조건같아 보이는데, 모든 조건을 한 번에 갖출 수는 없다고 한다.

아, 그 중 파티션 허용의 경우는 요즘 네트워크가 좋기 때문에 큰 문제가 없다고 한다.

 

ex) 일관성을 위해서 모든 서버에 대해 트랜잭션이 일어나는 동안, 데이터 조회가 불가능. [가용성 문제 발생]

각각의 서버에 저장된 장바구니 정보가 다른 문제 [일관성 문제 발생]

 

 

 

ACID와 BASE - NoSQL 데이터베이스의 속성

 

 

A 원자성 (Atomicity) : 트랜잭션은 한 묶음으로 분할되지 않는 하나의 단위다.

C 일관성 (Consistency) : 데이터는 항상 일관성 있어야 한다. 무결성을 위반한 트랜잭션은 없다.

I 고립성 (Isolation) : 완료되기 전까지는 보여지지 않는다.

D 지속성 (Durability) : 완료된 이후에는 항상 유지되어야 한다. (영구 보존된다. 디스크 등에 쓰여진다는 의미)

 

BA 기본적인 가용성 (Basically Available) : 부분적인 고장은 있을 수 있으나, 나머지는 사용이 가능하다.

* 주서버가 안되더라도 백업서버는 동작한다.

 

S 소프트 상태 (Soft State) : 최신 상태의 데이터로 덮어써진다.

E 결과적 일관성 (Eventually Consistent) : 일시적으로 일관성이 지켜지지 않을 수 있다.

* 시스템 부하, 네트워크 속도 등의 외부 요인으로 인해 일관성이 일시적으로 깨질 수 있다.

 

 

결과적 일관성은 NoSQL에서 가장 중요한 특성이다.

다양한 형태가 있고 읽다보면 당연한 소리같은 말이 있으므로 차근차근 보자.

 

1. 인과적 일관성 : 데이터베이스가 작업이 갱신된 순서를 반영하는 것을 보장한다.

=> A가 B의 급여를 100으로 입력하고, B의 급여를 10% 인상한 110으로 수정한다면 이 작업들은 순차적으로 반영된다.

 

2. 최신 데이터 읽기 일관성 : 일단 레코드 하나를 갱신했다면 이에 대한 모든 읽기는 갱신된 값으로 반환된다.

=> A가 B의 급여를 200으로 수정했다. 서버 N대 중 일부만 갱신되었다고 하더라도 결과값은 200으로 반환된다.

 

3. 세션 일관성 : 세션이 살아있는 동안 최신 데이터 읽기 일관성을 보장한다.

=> 세션이 끊겼을 때, 이전 세션에서 불러왔던 데이터를 가져올 수 없으며 사용이 한동안 없으면 세션을 종료시킨다.

 

4. 단조 읽기 일관성 : 질의를 통한 결과값 조회 시, 이 값의 이전 버전은 볼 수 없다.

=> 최신 데이터 읽기 일관성과 비슷한 듯 하나, 과거 데이터를 보여주지 않는 다는 의미로 해석하자.

 

5. 단조 쓰기 일관성☆ : 데이터 갱신 명령어를 실행했을 때, 명령어들이 실행된 순서대로 처리됨을 의미한다.

=> 해당 사항은 중요하다. 인과적 일관성과도 일치하는 부분이 있으나 변경에 있어서 순서가 중요한 경우 이 조건이 지켜져야 한다.

A가 B의 기존 급여를 200에서 20% 인상하기로 하고 그 후 추가적으로 40을 부여했을 때는 280인데, 만약 순서가 바뀌어서 적용되는 경우에는 288로 결과값이 다르게 나오므로 단조 쓰기 일관성은 중요한 요소라 할 수 있다.

 

 

 

NoSQL 데이터베이스의 네 가지 유형

 

 

키-값 데이터베이스

 

프로그램을 하다보면 자주 만나게 되는 key-value 형태를 가지는 데이터베이스다.

데이터를 식별하기 위해서 key값을 알면 연결된 데이터를 확인할 수 있는 구조로 비교적 간단한 형태의 데이터베이스에 적합하다.

 

- key는 해당 데이터베이스 내에서 반드시 고유한 값이어야 한다.

- 또는 데이터베이스에 여러개의 namespace가 나뉘어져있다면 namespace 내에서 고유한 값이어야 한다.

- value로 들어가는 데이터의 형태는 모든 타입을 허용한다.

=> 개발자 입장에서는 개발할 때 타입 체크 로직을 걸어주는 등의 조치가 필요함

- 저장/조회만을 기준으로 설계된 단순한 형태이나 관계형데이터 베이스의 특성을 일부 가진다.

- 질의어를 통한 검색, 조인을 통한 연계 등은 불가하다.

 

ex) employee113.name => employee 테이블 / 사원번호 113 / name 컬럼

 

 

문서 데이터베이스

 

데이터 저장방식은 키-값 데이터베이스와 비슷하나, 값을 문서로 저장한다는 차이점이 있다.

여기서 말하는 문서란 반정형화된 엔티티로 XML, JSON 같은 형식이 이에 속한다. 워드나 엑셀 등의 문서 파일이 아니라는 점.

예를 들자면 다음과 같다.

 

{ name : "ojava",

  job : "programmer",

  detail : "java"

}

 

- 값에 하나의 형태만 들어갈 수 있는 키-값 데이터베이스와 달리, 문서는 여러 속성을 저장할 수 있다.

- 고정된 스키마로 저장할 필요가 없으므로 높은 유연성을 지닌다.

=> 개발자 입장에서는 필수적으로 입력되어야 하는 정보에 대해서 지정해주거나 체크하는 로직 필요

- 문서에 하나의 값이 아닌 여러개의 속성을 지닐 뿐 아니라, 또 다른 문서를 중첩해서 입력할 수 있다.

- 질의어를 통해 데이터를 찾을 수 있다.

=> db.employee.find({ detail: "java" }) 와 같이 쓰거나, AND, OR, = 등의 연산 검색이 가능하다.

 

 

컬럼 패밀리 데이터베이스

 

NoSQL 중 가장 복잡한 유형이다.

컬럼, 로우 등의 명칭이 나와서 관계형 데이터베이스와 비슷해보이나 차이점을 가지므로 유의해서 보자.

 

- 컬럼 Column 은 이름과 값을 가질 수 있다.

- 하나의 로우 row 는 여러 개의 컬럼이 모여서 이루어지며, 각각의 로우는 다른 컬럼을 가질 수 있다.

- 연관된 컬럼이 여러개가 있다면 묶어서 '컬럼 패밀리'로 만들어서 사용한다.

- 문서 데이터베이스와 비슷하게 고정된 스키마를 사용하지 않는다.

- 로우 별로 다른 데이터 형태를 가지므로 관계형 데이터에비으와 달리 조인이 불가능하다.

=> 조인할 필요 없이 원하는 컬럼을 모아서 하나의 로우에 담는다고 한다.

- 질의방법은 일반적인 SQL과 비슷하고, CREATE, COLUMNFAMILY 등 이에 특화된 기능도 존재한다.

 

 

그래프 데이터베이스

 

많은 객체와 각 연결 관계를 표현하는데 용이한 방법.

SNS, 교통망, 전력망 등 연결 관계가 복잡한 형태의 데이터를 다루는데 사용되어진다.

노드 Node 와 관계 Relationship 또는 정점 vertext과 엣지 edge 라는 형태로 데이터를 표현하며, 노드는 구별할 수 있는 식별자와 여러 가지 속성을 가지고 관계는 두 노드 간의 연결을 말하며 연결에 대한 속성을 포함한다.

 

ex) SNS : 노드가 되는 것은 '사람', 관계는 '사람 간의 연결, 관계'

교통망 : 노드가 되는 것은 '지역', 관계는 '지역 간을 잇는 도로 등'

 

- 노드와 관계 모두 각각의 속성을 가지고 있다.

- 가까운 관계에 있는 노드들을 잇기 위한 목적으로 설계되었다.

- 관계형 데이터베이스로는 연산이 복잡한 작업을 그래프 데이터베이스로 대체할 수 있다.

 

 

 

* 참고자료 : NoSQL 철저 입문 - 도서출판 길벗

 

기본적인 특성에 대해서 정리하였고 이제 향후에는 하나씩 NoSQL 유형별로 정리할 예정이다.

과연 어디까지 정리할 수 있을 것인가... ^_ㅠ

이론적인 부분에 대해서 공부하고 실제 DB를 연결해서 적용해보고자 하는데 계획되로 되기를 바란다ㅏㅏㅏ

반응형

'DataBase' 카테고리의 다른 글

[NoSQL] 키-값 데이터베이스  (0) 2019.04.16
JDBC와 ODBC의 차이점에 대해서  (2) 2011.03.30