NoSQL 데이터베이스를 비교한 글인 것으로...
(긴 제목입니다. 사람들이 나보고 비교 해달라고 했고 이름도 이렇게 해달라고 해서 이렇게 문서를 만들었습니다)
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참고 하였슴.
이상.
'이것저것' 카테고리의 다른 글
해상도 및 DPI 문제 안내 (0) | 2023.03.25 |
---|---|
MariaDB 설치 - CentOS 7 (0) | 2023.03.17 |
2017년 8월 안드로이드 상위 5개 라이브러리 (0) | 2023.03.08 |
내가 생각하는 IoT 기술의 구현이란 (1) | 2023.03.01 |
IoT를 위한 고 가용성 MQTT 클러스터 구축하기 (0) | 2023.02.28 |