티스토리 뷰
_NoSQL이란
-
Not Only SQL의 약자
-
기존 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 DB
-
고정된 스키마가 없고, 조인이 힘듦
-
빅데이터, 분산 환경에서 대용량의 데이터를 처리하기 위해 개발
-
Horizontal Scalability(수평 확장), High Availability(고가용성)
RDBMS의 한계
-
대용량의 데이터가 계속 들어온다면, 스키마에 맞춰 변경해서 넣기 위해 긴 시간의 down time이 발생
_NoSQL 특징
-
거대한 Map으로서 key-value 형식을 지원
-
RDBMS는 Foreign Key, Join 등으로 관계를 정의하지만, NoSQL은 관계를 정의하지않음
-
대용량 데이터를 저장할 수 있음
-
읽기/쓰기의 성능이 RDBMS보다 빠름
_CAP 이론
분산형 구조는 일관성(Consistency), 가용성(Availability), 분산 허용(Partitioning Tolerance)의 3가지 특징을 가지고 있다.
CAP이론은 이 중 2가지만 만족할 수 있다는 이론인데, NoSQL은 대부분 이 CAP이론을 따른다.
-
일관성(Consistency) : 분산된 노드 중 어느 노드로 접근하더라도 데이터 값이 같아야한다.
-
가용성(Availability) : 클러스터링된 노드 중 하나 이상의 노드가 실패라도 정상적으로 요청을 처리할 수 있는 기능을 제공한다.
-
분산 허용(Partitioning Tolerance) : 클러스터링 노드간에 통신하는 네트워크 장애가 나더라도 정상적으로 서비스를 수행한다. 노드 간 물리적으로 전혀 다른 네트워크 공간에 위치도 가능하다.
일반적으로 RDBMS는 일관성, 가용성을 만족한다.
NoSQL은 가용성, 분산허용을 만족하는 제품군과 일관성, 분산허용을 만족하는 제품군으로 나눌 수 있다.
_데이터 모델 분류
1) Key/Value Database : Redis, Oracle Coherence
-
단순한 저장구조를 가지며, 복잡한 조회 연산을 지원하지 않음
-
고속 읽기와 쓰기에 최적화된 경우가 많음
-
메모리를 저장소로 쓰는 경우, 아주 빠른 get과 put을 지원
-
Value는 문자열이나 정수와 같은 원시 타입이 들어갈 수 있고, 또 다른 key/value가 들어갈 수도 있음. ( Column Family )
2) Big Table Database (Ordered Key/Value) : Hbase, Cassandra
-
key/value store와 데이터 저장 방식은 동일
-
보통의 NoSQL은 order by같은 정렬기능을 제공하지 않지만, 이 모델은 내부적으로 key를 정렬
-
날짜나 선착순으로 정렬해서 보여줄 때 유용
3) Document Database : MongoDB, CouchDB, Riak
-
key/value store의 확장된 형태로, value에 Document라는 타입을 저장 (Document : XML, JSON, YAML 등)
-
복잡한 데이터 구조 표현 가능
-
Document id 또는 속성값 기준으로 인덱스를 생성
-
key값의 range에 대한 효율적인 연산이 가능해지므로 이에 대한 쿼리를 제공
-
Sorting, Join, Grouping등이 가능
-
쿼리 처리에 있어서 데이터를 파싱해서 연산해야 하므로 overhead가 key-value 모델보다 큼
-
B트리 인덱스를 사용하여 2차 인덱스를 생성 > B트리는 크기가 커질 수록 insert, delete의 성능이 떨어짐 (읽기/쓰기 비율이 7:3일 때 더 좋은 성능을 보임)
-
B트리 특성 때문에 자주 변하지 않는 정보를 저장하고 조회하는데 적합 (로그, 타임라인, 채팅로그 등)
4) Graph Database : Sones, AllegroGraph, neo4j
-
node들과 relationship들로 구성된 개념
-
key/value store방식이며 모든 노드는 끊기지 않고 연결되어 있어야함
-
relationship은 direction, type, start node, end node에 대한 속성등을 가짐
_No SQL 데이터 모델링 패턴
1) Denormalization(비정규화)
-
같은 데이터를 중복해서 저장하는 방식
-
비정규화를 하면 테이블간의 Join을 없앨 수 있다.
-
NoSQL에서 두 테이블을 Join하여 데이터를 가져오는 로직을 구현하려면, 각각의 테이블에서 데이터를 가져와 합쳐야하기 때문에 2번의 IO가 발생한다. 이 때, 비정규화를 적용하여 하나의 테이블에 Join될 데이터를 중복 저장하게 되면 1번의 IO로도 데이터를 가져올 수 있다.
장점
-
쿼리 당 IO횟수 감소
-
쿼리 데이터 사이즈 감소
-
쿼리 수행 복잡도 감소
단점
-
전체 데이터 사이즈 증가
-
데이터 일관성 문제 발생 가능
2) Aggregation
-
NoSQL의 특성 중의 하나인 Scheme-less / Soft Scheme라는 특성을 이용하여 1:N같은 복잡한 entity들의 관계를 손쉽게 하나의 테이블로 바꿀 수 있음
-
join 연산을 줄임 > 수행시간 단축, 저렴한 비용의 대용량 데이터 지원 가능
- RDBMS는 데이터를 넣을 때, 테이블의 구조에 맞도록 넣어야하기 때문에 컬럼수와 이름도 지켜야하고 데이터 타입도 준수해야한다. 하지만 NoSQL의 경우 Key만 똑같으면 각 Row는 제멋대로라도 상관없기 때문에 아래와 같이 하나의 테이블로 합칠 수 있다.
3) Application Side Join
-
어쩔 수 없이 Join기능을 구현해야 하는 경우, NoSQL을 사용하는 client application단에서 Join로직을 처리해야함
-
Join이 필요한 테이블의 수 만큼 NoSQL로의 Request/Response IO가 발생하긴 하지만, Denormalization등에 비해서 스토리지 사용량은 감소
참고
NoSQL 특징 : https://sjh836.tistory.com/97
NoSQL 데이터 모델링 패턴 : https://bcho.tistory.com/666?category=431293
'etc' 카테고리의 다른 글
[메시지 큐] Kafka, RabbitMQ 개념 및 비교 (1) | 2020.06.22 |
---|---|
[DB] 트랜잭션 특징, 격리 수준, 관련 문제점 (0) | 2020.02.19 |
[디자인패턴] 싱글톤 패턴/Singleton Pattern (1) | 2020.02.14 |
[디자인패턴] 옵저버 패턴/Observer Pattern (0) | 2019.12.24 |
- Total
- Today
- Yesterday
- listview
- adapter
- ConstraintLayout
- 이진탐색트리
- C
- Android
- HTTP
- handshake
- DATABASE
- 퀵정렬
- 정렬 알고리즘
- C++
- 안드로이드
- RelativeLayout
- LinearLayout
- 스프링
- BOJ
- 알고리즘
- 백준알고리즘
- windows
- layout
- frameLayout
- 윈도우
- 운영체제
- 백준
- 네트워크
- debug
- 스프링부트
- WinDbg
- OS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |