AEROSPIKE : 로켓의 속도와 안정성을 증가시키기 위해 장착하는 "엔진 노즐"
오랜만에 쓰는 기술 리서치.
이번에는 nosql 류의 aerospike에 대해서 알아보고자 합니다. 일단 aerospike를 알아보기 앞서서, nosql이 뭔지에 대해 이해를 하고 보시면 훨씬 더 이해가 쉬울 것이라고 사료됨.
aerospike는 key-value 저장소 중 하나로, 최근 각광받는 고성능 데이터베이스로 알려져 있다.
다만, 한국에서는 이 솔루션을 적용해서 서비스를 하는 곳이 그리 많지 않은 것으로 알고 있고, 같은 개념의 nosql인 redis에 비해서 아직까지는 인지도가 떨어지는 편이다.
아무래도 커뮤니티가 활성화 되지 않은 상태에서는 자료가 별로 없는 데이터베이스를 서비스에 적용하긴 어려울 것임은 분명하다.
Strong Consistency with High Performance for Systems of Record and Systems of Engagement
aerospike 의 공식 홈페이지에 들어가면 위와 같은 큰 슬로건으로 반겨준다.
일단 특징 부터 알아보고 가자.
#1. Hybrid Memory Architecture
- 메모리 & SSD(HDD) 의 조합으로 하이브리드 아키텍쳐를 제공
- 메모리 : Primary Index, Secondary Index
- SSD(HDD) : Records
#2. Real-Time Engine
- 낮은 latency 를 보장하며 실시간의 데이터 IO에 적합
- 멀티코어를 적극 활용함으로써 높은 throughput 보장
#3. Dynamic Cluster Management
- aerospike는 클러스터 기능을 제공하는데, 그 클러스터를 동적으로 관리할 수 있도록 해준다
- record의 primary key는 RipeMD160 알고리즘을 사용해서 해싱을 한다(극도로 낮은 확률의 collision을 가짐)
- 이 해싱된 값은 1~4096의 파티션으로 쪼개지는데, 이 각각의 파티션을 클러스터의 각 노드들에게 분배를 해서 저장한다
- 그리고 클러스터에 노드가 추가/삭제 될 때 마다 저장된 데이터들은 자동적으로 rebalancing 된다.
- 여러 플랫폼에 제공되는 client(connector)가 있다. 매우 다양한 플랫폼의 클라이언트를 제공해준다
- C / C++
- Java
- Go
- C# / .NET
- Node.js
- C libevent
- PHP
- Python
- Ruby
- Perl
- Rust
- 데이터 정합성과 빠른 데이터 I/O를 위해서 클라이언트에서 클러스터에 연결할 때, automatic load balancing 를 지원한다.
- 그리고 각종 CRUD 메서드와 DDL 쿼리를 지원한다(index 생성, 삭제 등)
#5. Flexible Data Model
- 데이터 모델이 Flexible 하다는 얘기인데, 크로스-플랫폼을 완전히 지원한다는 소리.
- aerospike의 데이터 모델은 RDBMS와 비슷한 구조로 매칭될 수 있다
- Data Schema
- Namespace = DATABASE
- Set = TABLE
- Record = ROW
- Bin = COLUMN
- 중요한 개념인데, 아래 데이터 컨셉을 보고 꼭 이해를 하고 사용해야 한다. RDBMS의 어떤 개념과 매팽되는 용어인지 알아야 한다.
데이터 모델 컨셉(from GCP)
데이터 컨셉(from aerospike)
- Record Type(각 ROW가 가질 수 있는 타입)
- String(UTF-8)
- Integer
- Blob
- Map
- List
- geoJSON
#6. Geographic Replication
- 클러스터에서 각 record는 해싱이 되어 저장이 되며, 이 record는 Replication Factor 를 가질 수 있다
Replication Factor default 값은 : 1
2 이상 지정 시 클러스터의 노드들의 파티션으로 replication 되어 저장된다.
그림이 좀 작은데, 각 파티션에 데이터(record)가 replication되서 저장되는 구조를 볼 수 있다.
이 replication factor는 namespace(database) 단위로 지정을 할 수 있다(aerospike.conf)
#7. Enterprise Readiness
- 사실 aerospike는 opensource 이면서 commercial solution이다.
- opensource이면서 community를 enterprise처럼 사용할 수 있는 대단하게 쓸고퀄인 database인데, enterprise를 구매하게 되면 장점이 아래와 같다
- Cross Datacenter Replication
- Fast Restart
- Rapid Rebalance
- TLS Transport Encryption
- Security
사실 community edition을 써도 전혀 불편함이 없을 정도로 잘 만들어져 있어서 무리는 없지만, enterprise를 사게되면 그에 걸맞는 지원과 기능을 사용할 수 있으니 참고하도록 하자.
aerospike를 사용해보기 위해서는 서버와 client를 받아서 테스트를 해보면 된다.
SERVER : https://www.aerospike.com/download/server/4.0.0.1/
CLIENT : https://www.aerospike.com/download/client/
서버의 경우는 docker image도 있으므로 docker를 받아서 이미지로 설치해보면 쉽고 빠르게 aerospike를 사용해볼 수 있다.
서버를 설치하게 되면 Aerospike AMC AQL 이 같이 설치가 되는데
Aerospike : aerospike-server의 dbms로, 실제 구동되는 데이터베이스의 데몬이다.
AMC : Aerospike Management Console로, UI 웹 화면(기본 포트 8081)이 제공되며 클러스터의 R/W 현황, 노드 상태, 디스크/램 사용량 등을 확인할 수 있다.
AQL : Aerospike Query Language, 서버에서 쿼리를 실행해서 여러가지의 동작을(DDL, DML) 실행할 수 있다. 꽤 많은 명령어를 지원하니 링크를 참고하도록 하자
aerospike 서버는 3000 포트를 사용하며(default) 3001, 3002,300x 번대 포트를 클러스터 구성용으로 사용한다.
클라이언트에서 접속할때는 3000번 포트를 사용하도록 하자.
port 정리
3000 : aerospike-server
3001~300x : cluster data I/O용 port
8081 : AMC(Aerospike Management Console)
가장 중요한 관점 중 하나가 성능이 얼마나 잘 나오는지에 대하여인데, 범용적으로 주로 쓰이는 NoSQL 과의 비교 자료이다(aerospike 제공)
https://www.aerospike.com/benchmarks 에만 가봐도 여러 솔루션들과의 비교를 해놓은 공간이다.
couchbase vs aerospike : https://www.aerospike.com/benchmarks/database-benchmark-aerospike-vs-couchbase/
redis vs aerospike : https://www.aerospike.com/when-to-use-aerospike-vs-redis/
cassandra vs aerospike : https://www.aerospike.com/blog/comparing-nosql-databases-aerospike-and-cassandra/
아티클들을 보면 알겠지만, aerospike의 성능이 대부분의 주로 사용하는 nosql보다 2~3배 정도 빠르다는걸 알 수 있다.
물론 aerospike 개발사에서 내놓은 자료라 뭔가 신빙성이 부족해보이는 듯한(?) 느낌을 지울 수 없지만, 거짓이 아님은 실제 벤치마크 자료로 알 수 있다.
(무서운건 redis 공식 홈페이지에서는 redis가 aerospike보다 빠르다고 주장한다..)
현재 실 서비스에 적용해서 사용하고 있는데(약 3년 정도) 서비스에 장애가 나거나, 처리량이 부족해서 문제가 되었던 적은 한번도 없었다.
다만, 국내 커뮤니티와 자료가 너무 부족해서 리서치 해보고 사용해야 하는 수고로움은 존재한다.
정리 겸 한번 써놓는게 좋을 듯 해서 포스팅으로 정리를 하는데 "높은 처리속도를 위한 NoSQL 저장소" 를 찾는다면 aerospike를 한번 고려해보도록 하자.
사실 쓸 거리가 많은데(client 메서드 및 사용법, 클러스터 구성, 설정값 설명 등)
포스팅을 나눠서 작성할 예정이다.
'Development > Database' 카테고리의 다른 글
Spring R2DBC + MySQL (13) | 2020.11.30 |
---|