NoSQL Concepts
① 개념
- Not Only SQL
- Cassandra, DynamoDB 는 SQL 을 지원한다. No SQL 이라는 말보다 Not Only SQL 이 더 어울리는 것 같다.
- 특정 데이터 모델과 특정 목적에 맞추어 구축하는 DB
- 보통 서비스의 모든 데이터를 NoSQL 에 저장하지 않고, 대용량 처리등 특정 목적을 위해 특정 데이터를 저장한다. 분산환경에서 대용량 처리가 주 목적이기 때문에 고가용성(HA)과 수평 확장성을 지원해야 한다.
- NoSQL 종류마다 조금씩 다른 특징을 가진다. CAP 라는 이론으로 NoSQL 종류가 구분되고, 서비스에서 원하는 목적이 무엇인지 파악하고 그에 따라 NoSQL 을 선정해야 한다.
② RDBMS 의 단점 및 한계
- RDBMS 는 정규화되어 엔티티간 relation 을 가지고 트랜잭션을 지키거나 다양한 제약 조건 때문에 성능을 향상시키는데 제한이 있다.
- RDBMS 는 처음부터 scale out 에 초점을 두고 설계하지 않았기 때문에, replica db 또는 sharding 을 구성해야 한다. replica db 는 아무리 추가해도 결국 insert 하는 master db 하나가 될 수 밖에 없고, sharding 은 오버헤드가 크다. (sharding 은 잘 모르겠다.)
③ 특징
- no-relation
- 테이블간 관계가 없다. 그래서 join 을 할 수 없다.
- DynamoDB 에서는 하나의 테이블에서 약간의 꼼수?를 통해 join 을 흉내내는 방법을 사용한다.
- schemaless
- 스키마 없이 동작 가능
- DynamoDB 의 경우 partition key (, sort key) 만 정하여 테이블을 생성하면, 나머지 attribute 는 미리 정의하지 않아도 유연하게 추가할 수 있다.
- 하지만 이미 데이터가 정해지고 추가된 attribute 에 다른 타입의 데이터를 넣는다면, 타입 불일치로 문제가 발생할 수 있다. 안정적인 사용을 위해서는 Application 단에서 타입에 대한 구분이 명확히 되어야 할 것 같다.
- transaction 미지원
- DynamoDB, MongoDB 등 지원하는 경우도 있지만, 성능이 급감하기 때문에 사실상 사용할 수 없다. (DynamoDB 는 성능도 감소하고 비용도 2배로 증가한다.)
- 데이터 일관성을 어느정도 타협함으로써 빠른 성능을 가질 수 있다.
- Horizontal Scalability (수평 확장성)
- 위 경우 처럼 데이터 일관성을 어느정도 포기하고 여러 대의 서버에 데이터를 분산 저장한다.
- 하나의 노드가 고장나도 잘 작동하는 다른 노드를 사용하여 서비스를 유지할 수 있다.
- DynamoDB 의 경우 partition key 를 가지고 데이터를 분산하여 저장한다. 하나의 파티션이 10GB 를 넘으면 안된다는 특징이 있지만, 고르게 분배되도록 key 를 설계한다면 사실상 10GB 를 넘기 힘들다.
- 위 경우 처럼 데이터 일관성을 어느정도 포기하고 여러 대의 서버에 데이터를 분산 저장한다.
④ 데이터 모델에 따른 NoSQL 분류
key/value database
- Redis, DynamoDB
- 가장 단순한 저장 구조
- value 는 또 다른 key/value 구조를 가질 수 있다.
- DynamoDB 는 32 Depth 까지 지원한다.
Document database
- MongoDB, DynamoDB
- DynamoDB 는 key-value 와 document 두 가지 모델을 모두 지원
- key/value 에서 value 가 Document 타입을 저장할 수 있다.
- Document : 구조화된 문서 데이터 (JSON, YAML, XML)
Big table database (= Ordered key/value)
- Cassandra, HBase
- ordered key/value 라고도 하여, 내부적으로 key 에 대한 정렬을 해주기 때문에 정렬이 필요한 경우 유용하다.