NoSQL 데이터베이스 비교
NoSQL 데이터베이스를 비교한 글인 것으로...
The big NoSQL databases comparison
.main li { margin: 0px; } The big Cassandra vs Mongodb vs CouchDB vs Redis, vs Riak vs HBase vs Couchbase (ex-Membase) vs OrientDB vs Aerospike vs Neo4j vs Hypertable vs ElasticSearch vs Accumulo vs VoltDB vs Scalaris vs RethinkDB vs Kyoto Tycoon compariso
kkovacs.eu
(긴 제목입니다. 사람들이 나보고 비교 해달라고 했고 이름도 이렇게 해달라고 해서 이렇게 문서를 만들었습니다)
SQL 데이터베이스들은 정말 유용한 툴임에 틀림없지만, 이제 그 독과점에 끝을 고할 마지막 10년이 왔습니다. 그리고 이제 때가 된 것이지요: 지금까지 정말 셀 수도 없이 이것이 올바른 선택인가 고민도 하기 전에 오로지 수많은 관계 형 데이터베이스를 사용하도록 강제해 왔습니다.
(말하자면, 관계형 데이터베이스는 그 ‘관계’를 짓기 위한 항상 최고의 솔루션이었다는 것이죠. )
그렇지만, NoSQL 데이터베이스들과의 차이를 비교하는 것은 이전, 한 SQL 데이터베이스와 그와 비슷한 다른 데이터베이스들과의 차이를 비교 하는 일보다 훨씬 더 방대한 작업이 되었습니다. 다시 말해 프로젝트 시작 초기에 적절한 데이터베이스를 선택하기 위한 소프트웨어 아키텍트들의 몫은 더욱 더 커져 있다는 것입니다.
이 생각을 가지고 여기에
Cassandra,
Mongodb,
CouchDB,
Redis,
Riak,
RethinkDB,
Couchbase(ex-Membase),
Hypertable, ElasticSearch,
Accumulo,
VoltDB,
Kyoto Tycoon,
Scalaris,
OrientDB,
Aerospike,
Neo4j 그리고
HBase
에 대해서 비교한 결과를 내놓았습니다.
가장 유명한 것들
Redis (V3.0RC)
- 작성언어: C
- 주요 판단근거: 빛의 속도로 빠름
- 라이선스: BSD
- 프로토콜: Telnet-like, binary safe
- 디스크 기반 in-memory 데이터베이스
- 컴퓨터 램의 크기로 데이터셑 크기가 한정됨(하지만 클러스터링으로 여러 머신의 램을 사용 하도록 확장 가능)
- 마스터-슬레이브 복제, 자동 failover
- 키들에 의한 데이터 구조 혹은 간단한 값(Simple values, data structures)
- 하지만, ZREVRANGEBYSCORE 같은 복잡한 오퍼레이션들임(http://redis.io/commands)
- INCR & co (비율 한정 혹은 통계에 좋음 - good for rate limiting or statistics)
- 비트 오퍼레이션(예: bloom filter들의 구현)
- Has sets (also union/diff/inter)
- 해시 셑 종류(또한 union/diff/inter)
- 해시 리스트 종류(또한 큐; 블록킹 pop)
- 해시 테이블(다중 필드들의 오브젝트들)
- Sorted sets (high score table, 범위 쿼리에 좋음- good for range queries)
- 루아 스크립팅 가능(!)
- 해시 트랜잭션(!)
- 값들의 expire 설정 가능(캐시 상이므로)
- 메시징을 구현하도록 해주는 Pub/Sub
최적사용법:
예측 가능한 데이터베이스 크기로 데이터가 빠르게 변경되는 경우(거의 메모리 상에서 맞춤)
예:
실시간 주식시세 저장. 실시간 분석. Leaderboards.
실시간 커뮤니케이션 그리고 전에 memcached 사용했던 모든 곳.
MongoDB (2.6.7)
- 작성언어: C++
- 주요판단근거: 몇 친근한 SQL의 기능(쿼리, 인덱스)을 놓고 싶지 않을 때.
- 라이선스: AGPL (Drivers: Apache)
- Protocol: Custom, binary (BSON)
- 마스터-슬레이브 복제 (replica sets 을 통한 자동 failover)
- 빌트인 Sharding(Sharding 이란 다중 머신들 사이에 데이터를 저장하는 방법이다.)
- 자바스크립트 표현 식을 사용한 쿼리들
- 서버 측 임의의 자바스크립트 함수들 구동
- CouchDB 보다 나은 update-in-place 방식(내부적으로 나머지 다른 코드를 건드리지 않고 해당 데이터만 읽고/쓰고/프로세싱 할 수 있는 것)
- 데이터 저장소에 memory mapped 파일 사용
- Performance over features
- 저널링 기능 on(--journal 옵션)
- 32 비트 시스템에서, ~2.5Gb 로 제한
- 텍스트 검색 통합
- Big data + metadata 를 저장하는 GridFS (정확히 FS는 아님)
- 공간 인덱싱 기능
- Data center aware
최적사용법:
동적 쿼리들이 필요 할 때. map/reduce 기능들 말고 인덱스를 정의하는 것을 선호 할 때. 빅 데이터베이스 상에서 최적화된 성능이 필요할 때. CouchDB를 사용해야 하지만 디스크를 채우는 데이터의 변동이 너무 잦을 때.
사용예:
대부분의 경우 MySQL 이나 PostgreSQL을 사용할 것이지만, 미리 정의된 컬럼이 당신의 발목을 잡을 때.
Cassandra (2.0)
- 작성언어: Java
- Main point: "거의" SQL 같은 곳에 거대한 데이터 셑을 저장하고 싶을 때.
- 라이선스: Apache
- 프로토콜: CQL3 & Thrift
- CQL3는 SQL과 매우 비슷하지만, 확장성에서 오는 약간의 제약들이 있다.(제일 많이 지목되는 것: JOIN들이 없고, aggregate 함수들이 없음)
- CQL3는 이제 공식 인터페이스가 되었다. 레거시 애플리케이션으로 작업하지 않는 한, Thrift를 쳐다보지 않아도 된다. 이렇게, ColumnFamilies, SuperColumns, 등등의 이해 없이도 잘 살 수 있다.
- 키 값, 혹은 키 범위 쿼리 (secondary 인덱스들을 사용 가능함)
- 분산과 복제를 위한 튜닝 가능한 trade-off들(N,R,W)
- expiration 을 가진 데이터 생성(INSERT 에서 설정)
- 읽기 보다 더 빠른 쓰기(읽기가 disk-bound 일때)
- 아파치 하둡을 통한 Map/reduce 가능
- Hadoop/HBase와 반대로 모든 노드들이 비슷함
- 안정적이고 상당히 좋은 cross-datacenter 복제
- 분산 카운터 데이터 타입
- 자바로 트리거들을 만들 수 있음.
최적사용법:
정말 큰 데이터를 저장 할 필요가 있을 때, 서버에 저장하는 것이 올바른 방법이 아니지만, 여전히 저장하기 위한 친근한 인터페이스가 필요하다.
사용예:
시간당, 브라우저 당, IP 당 등등의 웹 분석. 트랜잭션 로깅. 거대한 센서 배열들로부터 데이터 수집.
ElasticSearch (0.20.1)
- 작성언어: Java
- Main point: Advanced Search
- 라이선스: Apache
- 프로토콜: JSON over HTTP (Plugins: Thrift, memcached)
- JSON 문서로 저장.
- 버전 관리.
- 부모 자식 도큐먼트.
- 도큐먼트들은 타임아웃 가능.
- 매우 다양하고 복잡한 쿼리에 사용하며 스크립팅 가능.
- Write consistency: one, quorum or all
- 스코어 별 소팅(!)
- Geo distance 소팅
- 인공지능 검색들(근접 날짜, 등등 - approximate date) (!)
- 비동기식 복제
- Atomic, scripted updates (good for counters, etc)
- 자동 "stats groups" 가능(디버깅에 좋음)
- 여전히 한명의 개발자에게 매우 의존적임(kimchy).
최적사용법:
(유동적인)필드들을 가진 오브젝트를 가지고 있으며, "advanced search" 기능이 필요할 때.
사용예:
나이 차이, 지리적인 위치, 음식취향 그리고 싫어하는 것들 등을 핸들링 해야 하는 데이트 서비스. 혹은 여러가지 변수에 종속적인 leaderboard system.
클래식 도큐먼트와 빅테이블 저장소들
CouchDB (V1.2)
- 작성언어: Erlang
- Main point: 사용하기 쉽고, DB consistency를 원할 때.
- 라이선스: Apache
- 프로토콜: HTTP/REST
- 양방향(!) 복제, 충돌 감지 연속적이거나 ad-hoc 인 마스터 마스터 복제(!)
- MVCC – 쓰기 동작들은 읽기 동작을 블록킹 하지 않음.
- Previous versions of documents are available
- 도큐먼트들의 이전 버전 찾기 가능.
- Crash-only (reliable) design
- 때때로 컴팩트 작업이 필요.
- Views: 임베디드 map/reduce
- Formatting views: lists & shows
- 정형화된 views: lists & shows
- 서버 측 도규먼트 검증 가능
- 인증 적용 가능
- '_changes' 를 통한 실시간 업데이트(!)
- Attachment handling
- thus, CouchApps (standalone js apps)
최적사용법:
미리정의된(pre-defined) 쿼리를 실행하는 저장되거나 때때로 변하는 데이터.
버전닝이 중요한 곳
사용예:
Versioning 이 중요 한 곳, 데이터를 쌓거나 때때로 변경하기 위해
미리 정의 된 쿼리가 구동하는 곳.
Accumulo (1.4)
- 작성언어: Java and C++
- Main point: 셀 단위 보안이 적용 되는 BigTable 한 종류.
- 라이선스: Apache
- 프로토콜: Thrift
- 다른 빅테이블 클론, 하둡 상에서 또한 구동 가능.
- NSA로부터 시작.
- 셀 단위 보안.
- 메모리보다 더 큰 row 허용.
- 자바 바깥에서 C++ STL로 메모리 맵 유지.
- 하둡 기능(툴)을 이용한 Map/reduce(ZooKeeper & co)
- 몇몇 서버 측 프로그래밍
최적사용법:
셀 단위로 접근 제한이 필요 할 때.
사용예:
HBase 같이, 기본적으로 다음의 대체 데이터베이스이다: 검색 엔진들. 로그 데이터 분석.
거대하고, 2차원이며 join이 없는 테이블들을 스캔 하는 것이 요구 사항이 어떤 곳.
HBase (V0.92.0)
- 작성언어: Java
- Main point: 수백만개의 컬럼을 가진 수십억 개의 row들을 가지고 싶을 때.
- 라이선스: Apache
- 프로토콜: HTTP/REST (also Thrift)
- Google's BigTable 후 모델됨
- 하둡의 HDFS를 저장소로 사용
- 하둡을 이용한 map/reduce
- 서버측 스캔을 통한 push down을 기본이며 필터들을 가짐.
- 실시간 쿼리들의 최적화.
- 고성능 Thrift 게이트웨이
- XML, Protobuf, 와 binary를 지원하는 HTTP
- Jruby-based (JIRB) shell
- 마이너 업그레이드들이나 환경설정이 바꼈을 때, 재 시작(Rolling restart)
- MySQL과 같은 Random access performance
- 클러스터는 여러 다른 타입의 노드들로 구성된다.
최적사용법:
하둡은 아마 여전히 거대한 데이터 셑들 위에서 Map/Reduce job들을 구동하는 최고의 방법이다. 만약 Hadoop/HDFS스택을 사용하고 있다면 완전 최고다.
사용 예:
검색 엔진들, 로그 데이터 분석. 거대하고, 2차원이며 join이 없는 테이블들을 스캔 하는 것이 요구 사항이 어떤 곳.
Hypertable (0.9.6.5)
- 작성 언어: C++
- 주요판단근거: HBase 보다 더 빠르고, 더 작은 데이터베이스.
- 라이선스: GPL 2.0
- 프로토콜: Thrift, C++ library, or HQL shell
- 구글의 BigTable 디자인을 구현.
- 하둡의 HDFS 상에서 구동.
- 자신만의 "SQL-비슷한" 언어인, HQL 사용.
- 키로 검색 셀로 검색, 혹은 컬럼 패밀리 내의 값으로 검색 가능.
- 키/컬럼 범위로 한정하여 검색 가능.
- Baidu 스폰서
- 마지막 N 이력 값들을 유지.
- 테이블들은 네임스페이스 상에 존재.
- Map/reduce with Hadoop
- 하둡을 이용한 map/reduce
최적사용법:
좀 더 향상 된 HBase를 사용하고 싶다면.
사용예:
HBase 같이, 기본적으로 다음의 대체 데이터베이스이다: 검색 엔진들. 로그 데이터 분석.
거대하고, 2차원이며 join이 없는 테이블들을 스캔 하는 것이 요구 사항이 어떤 곳.
Graph 데이터베이스
- 작성언어: Java
- 주요판단근거: 도큐먼트 기반의 그래프 데이터베이스
- 라이선스: Apache 2.0
- 프로토콜: binary, HTTP REST/JSON, or Java API for embedding
- 트랜잭션들과 완벽 ACID 적용.
- 도큐먼트로서 그래프 데이터베이스로서 양쪽 다 사용 가능(프로퍼티를 가진 vertex들)
- 노드들과 relationship 들을 둘다 메타데이터로 가질 수 있음.
- 다중 마스터 아키텍처.
- persistent pointers (LINK, LINKSET, LINKMAP, LINKLIST field types)를 통한 도큐먼트들간의 relationship들을 지원.
- SQL류의 쿼리 언어(주의: JOIN이 없고 포인터들이 존재함)
- 웹 기반의 GUI ( UI가 괜찮음, 독립적)
- 클래스들 사이의 상속. 노드들과 relationship들의 인덱스화
- SQL 혹은 자바스크립트 내에서 사용자 함수를 사용.
- Sharding
- 다중 알고리즘을 사용 한 Advanced path-finding과 Gremlin traversal language
- 온라인 백업과 Advanced monitoring은 상용 라이선스 사용.
최적사용법:
그래프 형식에 풍부하고 복잡하며 서로 연결된 데이터를 사용 할 때.
사용예:
사회적인 관계, 공공 교통 정보 연계, 거리 지도, 혹은 네트워크 토폴로지를 구성 할 때 사용.
Neo4j (V1.5M02)
- 작성언어: Java
- 주요판단근거: Graph database - connected data
- 라이선스: GPL, some features AGPL/commercial
- 프로토콜: HTTP/REST (or embedding in Java)
- 자바 애플리케이션내에 임베디드 혹은 단독으로 존재.
- Full ACID conformity (including durable data)
- 노드들과 관계들 둘 다를 메타데이터화 할 수 있음
- 통합 패턴 매칭 기반 쿼리 언어("Cypher")
- 또한 "Gremlin" graph traversal language를 사용 가능.
- 노드들과 관계들을 인덱스화
- 멋진 독립 된 웹 관리 화면을 가짐
- 다중 알고리즘을 통한 발전된 path-finding.
- 키들과 관계들을 인덱스화
- 읽기들의 최적화
- 트랜잭션을 가짐(자바 API)
- 그루비를 사용해서 스크립팅.
- 클러스터링, 복제, 캐싱, 온라인 백업, 특수 모니터링과 HA는 상용 라이선스 적용.
최적사용법:
그래프 형식에 풍부하고 복잡하며 서로 연결된 데이터를 사용 할 때.
사용 예:
사회적인 관계, 공공 교통 정보 연계, 거리 지도, 혹은 네트워크 토폴로지를 구성 할 때 사용.
"long tail"
(널리 알려지진 않았지만, 정말 유용한 것들)
Couchbase (ex-Membase)(2.0)
- 작성언어: Erlang & C
- 주요판단근거: 영속성(persistence)과 클러스터링이 가능하면서 Memcache와 호환성을 가지고 싶을 때.
- 라이선스: Apache
- 프로토콜: memcached + extensions
- 키에 의한 데이터 접근이 매우 빠름(200k+/sec)
- 디스크 persistence.
- 모든 노드들이 동일함(마스터-마스터 복제)
- Memcached 형식의 in-memory caching buckets 역시 제공.
- IO를 줄이기 위한 de-duplication 쓰기
- 친근한 클러스터-매니지먼트 웹 GUI
- 연결 풀링과 멀티플랙싱(Moxi)을 위한 커넥션 프록시
- Incremental map/reduce
- Cross-datacenter replication
최적사용법:
low-latency 데이터 접근, 고성능 concurrency 지원과 고 가용성이 요구 되는 애플리케이션.
사용 예:
온라인 게이밍 같은(젠가) 고 동시성 웹 앱들 혹은 광고 목적 같은 Low-latency use-cases
Scalaris (0.5)
- 작성언어: Erlang
- 주요판단근거: 분산 P2P 키-값 저장소
- 라이선스: Apache
- 프로토콜: Proprietary & JSON-RPC
- In-memory ( 백엔드로 Tokyo Cabinet 을 디스크로 사용)
- YAWS 웹서버로 사용.
- 트랜잭션들(adapted Paxos commit)
- 일관된 분산 쓰기 조작.
- 가용성 기반의 CAP, values Consistency(네트워크 파티셔닝, 좀 더 큰 파티셔닝 작업에 한함)
최적사용법:
Erlang이 기호에 맞고, Mnesia 혹은 DETS 혹은 ETS를 사용하기 원한 다면..
사용 예:
당신이 파이썬, 루비 혹은 자바 프로그래머에게 데이터베이스에 접근권한을 주고 싶을 때를 위한 Erlang 기반 시스템.
Aerospike (3.4.1)
- 작성언어: C
- 주요판단근거: 속도, SSD-최적화 저장소.
- 라이선스: License: AGPL (Client: Apache)
- 프로토콜: Proprietary
- Cross-datacenter replication 은 상용 라이선스
- 키 값으로 데이터 접근이 매우 빠름
- 데이터 저장을 위해서 블록 디바이스로 SSD 디바이스들을 사용(RAM + persistence 가능)
- 클러스터에서 데이터의 노드 화 추가 삭제 시 자동 failover와 자동 rebalancing
- LUA를 통한 사용자 정의 함수들 사용 가능
- 웹 GUI로 클러스터 조작 가능
- 기본 타입(integer, string, blob) 이외의 복잡한 데이터 타입(리스트와 맵 들) 사용 가능
- Secondary 인덱스
- Aggregation query model
- TTL(time-to-live)를 데이터에 붙여서 expire 가능
- 거대 데이터 타입 기능 지원
최적사용법:
low-latency 데이터 접근, 고 기능 동시성 지원 및 고 가용성이 주요 요구기능이 되는 애플리케이션
사용예:
온라인 광고나 유통을 위한 웹사이트들의 거대한 프로파일 데이터를 저장 할 때.
RethinkDB (2.1)
- 작성언어: C++
- 주요판단근거: 스트림 데이터 업데이트를 위한 JSON 저장소
- 라이선스: License: AGPL (Client: Apache)
- 프로토콜: Proprietary
- JSON 도큐먼트 저장소
- "ReQL" 이라는 자바스크립트 기반의 쿼리 언어 사용.
- Underscore.js 를 사용해 봤다면 친근하게 생각 될 "ReQL"은 실용적인 언어 임
- Sharded clustering, replication built-in
- 레퍼런스들을 이용하여 데이터는 JOIN 가능함
- BLOB의 조작 가능.
- 공간 자료 지원
- Multi-datacenter support
최적사용법:
계속적인 실시간 업데이트가 필요한 애플리케이션
사용예:
온라인 혹은 여러 디스플레이들에 스포츠 스코어를 표출 할 때. 모니터링 시스템들. 빠른 워크플로우 애플리케이션.
Riak (V1.2)
- 작성언어: Erlang & C, some JavaScript
- 주요판단근거: Fault tolerance
- 라이선스: Apache
- 프로토콜: HTTP/REST or custom binary
- Blob 저장 기능
- 분산과 복제를 위한 튜닝 가능한 trade-off들
- 검증과 보안을 위해서 JavaScript 혹은 Erlang 통해 Pre-와 post-commit을 잡아 낼 수 있다.
- JavaScript 혹은 Erlang을 이용한 map/reduce
- 그래프데이터베이스로서 사용: Links & link walking
- Secondary indices: but only one at once
- 세컨더리 인덱스 사용 가능: 하지만 오직 한번에 하나씩.
- 큰 오브젝트 지원(Luwak)
- “오픈소스”와 “엔터프라이즈” 에디션 두개가 존재.
- Riak Search를 사용한 Full-text 검색, 인덱싱, 쿼리.
- 저장 백엔드 시스템인 "Bitcask" 부터 Google의 "LevelDB" 까지 마이그레션 가능.
- 마스터 필요 없는 multi-site 복제와 SNMP 모니터링은 상용 라이선스 적용.
최적사용법:
Dynamo 같은 데이터 저장소를 원하지만, bloat과 복잡도 등을 취급 할 방법이 없는 경우. 인 사이트 확장성, 가용성 및 fault-tolerance를 원하지만, multi-site 복제를 위해서 돈을 낼 준비가 되어 있을 때.
사용예:
Point-of-sales data collection. Factory control systems. 일초도 down time이 생기면 안 되는 곳. well-update-able 웹 서버로 사용 가능.
★ Software bloat: 프로그램 새 버전이 나올 때마다 사용자에게 필요 없는 기능이 추가되거나 점점 더 많은 시스템 자원을 사용하는 경향을 이르는 용어.
VoltDB (2.8.4.1)
- 작성언어: Java
- 주요판단근거: 빠른 트랜잭션과 신속한 데이터 변경.
- 라이선스: AGPL v3 and proprietary
- 프로토콜: Proprietary
- In-memory 관계형 데이터베이스.
- 하둡으로 데이터를 export 가능.
- ANSI SQL 지원.
- Stored procedures in Java
- 자바 Stored procedure 작성 가능.
- Cross-datacenter 복제.
최적사용법:
입력되는 데이터의 거대한 양을 빠르게 처리해야 할 때.
사용예:
Point-of-sales 데이터 분석. 공장 컨트롤 시스템.
POS[포스]란 판매와 관련된 데이터를 물품이 판매되는 그 시간과 장소에서 즉시 취득하는 것이다.
Kyoto Tycoon (0.9.56)
- 작성언어: C++
- 주요판단근거: 경량 네트웍 DBM
- 라이선스: GPL
- 프로토콜: HTTP (TSV-RPC or REST)
- Kyoto Cabinet 기반, Kyoto Cabinet의 嫡子(본처아들).
- 스토리지 백엔드 군: 해시, 트리, Dir, 등등(Kyoto Cabinet에서 상속됨)
- Kyoto Cabinet은 초당 1M+의 insert/select 조작들이 가능함(그러나 Tycoon은 오버헤드로 인해 기능이 좀 떨어짐)
- 서버 측에서 루아를 사용할 수 있음.
- C, Java, Python, Ruby, Perl, Lua, 등의 언어로 바인딩 가능.
- "visitor" 패턴 사용.
- 핫 백업, 비동기 복제.
- in-memory 데이터베이스의 백그라운드 스냅샷
- 자동 expiration(캐시 서버로 사용가능)
최적사용법:
가장 정확하게 백엔트 저장 알고리즘 엔진을 선택하고 싶을 때. 속도가 기본이 되어야 할 때.
사용 예:
캐시 서버. 증권. 분석. 실시간 데이터 수집. 실시간 커뮤니케이션.
Memcached를 전에 사용 했던 곳.
물론. 이 모든 시스템들은 여기서 기록된 내용보다 더 많은 기능을 가지고 있습니다. 나는 그냥 그 위에 나의 결정을 입혀서 중요한 기능을 기록하기를 원했던 것 뿐입니다. 그리고 이들 시스템들은 빠른 개발 단계에 있기 때문에, 항상 자주 바뀔수 있다는 것을 알아야 할 것입니다.
Hacker News의 토론 내용2
다음 사이트를 3참고 하였슴.
이상.