NoSQL 정의
No SQL? Not Only SQL?
NoSQL은 관계형 데이터베이스의 한계를 극복하기 위한 데이터 저장소의 새로운 형태로 수평적 확장성을 특징으로 한다.
관계형이 아니기 때문에 join이 없고 고정된 스키마를 갖지 않는다.
대표적인 NoSQL 제품은 Google의 BigTable, Amazon의 Dynamo이 있고, 이외에 비롯해 다양한 오픈소스 제품이 소개되어 있다.
Why NoSQL?
데이터 규모의 확대
- 저장할 데이터가 많아지면서 읽고/쓰기에 있어서 RDB가 제약 요소가 되었다.
- RDB의 수평적 확장성 한계로 새로운 해결책이 필요했다.
웹 서비스의 구조 변화
- 저장할 데이터의 형태가 계속 변화한다.
- 사용자의 데이터 요구가 일관적이지 않고 다양하다.
NoSQL 선택
BigTable, Dynamo, Cassandra, CouchDB, MongoDB, Hbase, Riak, Voldemort 등 20개 이상의 NoSQL 제품이 있고,
자신의 목적에 맞는 NoSQL 제품을 선택하기 위해서는 각각의 특징을 정확히 파악해야 한다.
CAP 이론
CAP이란?
- Consistency: 각각의 사용자가 항상 동일한 데이터를 조회한다.
- Availability: 모든 사용자가 항상 읽고 쓸 수 있다.
- Partition tolerance: 물리적 네트워크 분산 환경에서 시스템이 잘 동작한다.
Availability와 Partition tolerance가 추상적 정의만으로 이해가 힘들 수 있어서 설명을 추가합니다. (용어 때문에 오히려 이해가 어려울 수 있는데 둘 다 파티션에 대한 특성으로 접근해야 합니다.) Availability and Partition Tolerance 글과 댓글을 참고하면 A, P에 대한 정의 및 기능이 좀 더 이해가 쉬울 수 있습니다.
- 장애 때문에 특정 노드들이 기약 없이 대기해야 한다면 Availability가 희생된다.
- 특정 요청이 장애로 기약 없이 대기해야 한다면 Partition tolerance이 희생된다.
CAP 이론과 NoSQL
데이터 저장소는 CAP 중에서 2가지만 선택할 수 있다. 예를 들어 RDB는 CA에 특화되어 있기 때문에 분산 환경에 적용이 어렵다.
NoSQL 제품은 CAP 중에서 C 또는 A를 일부 포기함으로써 분산 확장이 가능하다. 일반적으로 NoSQL 시스템은 관계형을 포기하거나 트랜잭션 구조를 느슨하게 함으로써 수평 확장이 가능하도록 한다.
CAP과 데이터 모델에 따른 구분 (각각의 구분은 설정에 따라 변경될 수 있다.)
RDB 대안
RDB 대안에 NoSQL만 있는 것은 아니다.
RDB cluster
- Oracle RAC, MySQL cluster
- 분산 확장과 안정성을 강화한 RDB 솔루션
- 단점)
- 확장 비용이 비싸고 적용 및 관리에 고급 기술이 필요하다.
- 읽기 성능만 향상된다.
- 장점)
- 최소한의 개발 비용으로 도입이 가능하다.
- 비용 예측이 가능하다.
- 상용화된 지원이 가능하다.
Memory Cache
- memcached, Coherence, Santa
- RDB 앞단에 메모리 캐시를 두고 읽기 또는 읽기/쓰기를 캐싱한다.
- 단점)
- 메모리 비용이 비싸다.
- 메모리 크기에 제약이 있다.
- RDB를 저장소로 사용하지만 장애시 일부 데이터가 손실될 수 있다.
- 장점)
- 가격대비 효율성이 disk보다 훨씬 높다.
- 읽기/쓰기 성능을 크게 향상시킬 수 있다.
- 읽기/쓰기 수평 확장이 가능하다.
NoSQL
- 디스크 기반의 수평 확장이 뛰어난 데이터 저장소
- 단점)
- Persistence Layer를 새로 개발해야 한다.
- 사용화된 지원이 어려울 수 있다.
- 장점)
- 읽기/쓰기 성능 및 확장성이 뛰어나다.
- 일반 저가 장비를 사용할 수 있다.
NoSQL 교체 비용, 가치, 특징 비교
API, Data Model
- Interfaces- REST (HBase, CouchDB, Riak, etc.), MapReduce (HBase, CouchDB, MongoDB, Hypertable, etc.), Get/Put (Voldemort, Scalaris, etc.), Thrift (HBase, Hypertable, Cassandra, etc.), Language Specific APIs (MongoDB).
- Logical Data Models-Key-Value oriented (Voldemort, Dynomite etc.), Column Familiy oriented (BigTable, HBase, Hypertable etc.), Document oriented (Couch DB, MongoDB etc.), Graph oriented (Neo4j, Infogrid etc.)
- Data Distribution Model- Consistency and Availability(HBase, Hypertable, MongoDB etc), Availability and Partitionality (Cassandra etc.).
- DataPersistence-Memory Based (e.g. Redis, Scalaris, Terrastore), Disk Based (e.g., MongoDB, Riak etc.), Combination of both Memory and Disk(e.g., HBase, Hypertable, Cassandra).
NoSQL 제품 특징 비교
Features | MongoDB | Riak | HyperTable | HBase |
---|---|---|---|---|
Logical Data Model | Rich Document with support for Nested Document |
Rich Document | Column Family | Column Family |
Support for CAP | CA | AP | CA | CA |
Dynamic Addition /Removal of Node |
Supported | Supported | Supported | Supported |
Multi DC support | Supported | Not Supported | Supported | Supported |
Interface | Variety of APIs (Java, Python, Perl, C#) |
JSON over HTTP | REST, Thrift, Java | C++,Thrift |
Persistence Model | Disk | Disk | Memory + Desk (Tunable) |
Memory + Desk (Tunable) |
Comparative Performance |
Better (C++) |
Best (Erlang) |
Better (C++) |
Good (Java) |
Commercial Support |
10gen.com | Basho Technologies | Hypertable Inc | Cloudera |
사례
해외사례
- Google Bigtable
- 모든 URL 기반의 문서 정보 수집 (Key/Value 기반의 Bigtable에 저장)
- 수집한 정보를 Map/Reduce로 색인 (색인 데이터도 Bigtable에 저장)
- Document에서 사용하는 정보가 계속 추가될 수 있다. (URL, title, 본문, meta tag 등)
- Amazon’s Dynamo
- Digg.com Cassandra
- 내 친구가 추천한 정보를 보여주기 위해서 NoSQL이 필요해짐
- Twitter Cassandra
- 모든 사용자의 글을 하나의 DB에 저장할 수 없다면 내가 팔로우하는 timeline은 어떻게 보여줄 수 있을까?
NHN 인증 플랫폼
- 요구사항
- backend DB 점검 시에도 read가 가능한 시스템
- 로그인 사용자 세션 정보를 저장 및 조회
- 구현
- MySQL 클러스터링으로 세션 정보 저장 – MySQL을 메모리 DB로 사용
- in-house 메모리 DB로 사용자 정보 저장 – Oracle 로그 기반으로 메모리 리플리케이션
Daum view 추천 플랫폼 (예정)
- 사용자의 추천을 모두 수집한다.
- 소셜 네트워크를 저장한다.
- 추천 정보를 추천 히스토리와 소셜 네트워크 기반으로 Map/Reduce 분석
- 신뢰도 높은 추천 기반으로 문서 랭킹 부여
Daum Cafe
- ‘최근 방문 카페’ 기능에 Cassandra 적용