의견.png

카산드라

위키원
sccs98 (토론 | 기여)님의 2020년 8월 6일 (목) 17:51 판
이동: 둘러보기, 검색
카산드라(Cassandra)
카산드라(Cassandra)

카산드라(Cassandra)는 대용량 데이터 처리가 가능한 비관계형 분산 데이터베이스 관리 시스템(DBMS)이다. 빅데이터 처리를 위한 노에스큐엘(NoSQL)의 일종이다. 페이스북(Facebook)이 개발했고 오픈소스로 공개했다. 정식 명칭은 아파치 카산드라(Apache Cassandra)이고, 아파치재단에서 관리하고 있다.

개요

아파치 카산드라(Apache Cassandra)는 자유-오픈 소스 분산형 노에스큐엘(NoSQL) 데이터베이스 관리 시스템(DBMS)의 하나로, 단일 장애점 없이 고성능을 제공하면서 수많은 서버 간의 대용량의 데이터를 관리하기 위해 설계되었다. 카산드라는 여러 데이터센터에 걸쳐 클러스터를 지원하며 마스터리스(masterless) 비동기 레플리케이션을 통해 모든 클라이언트에 대한 낮은 레이턴시 운영을 허용한다. 카산드라는 또한 성능 면에서 높은 가치를 보인다. 2012년, NoSQL 시스템을 연구하는 토론토 대학교 연구원들은 "확장성 면에서 실험 가운데 분명한 승자가 있다. 카산드라는 모든 실험의 최대 노드 수에서 가장 높은 처리량을 성취한다."고 결론을 내렸으며 그럼에도 불구하고 "높은 쓰기 및 읽기 레이턴시의 대가가 있다"고 이야기하였다.[1]

등장배경

카산드라는 아마존의 다이나모DB(DynamoDB) 설계에 참여한 아비나쉬 락슈만(Avinash Lakshman)과 페이스북의 프라샨트 말릭(Prashant Malik)이 최초로 만들었다. 아마존 다이나모DB의 분산 디자인과 구글 빅테이블의 데이터 모델을 기반으로 설계되었다. 2008년 카산드라는 페이스북에서 떠나 아파치 인큐베이터 프로젝트로 출발했으며, 2010년에 이르러 탑 레벨 아파치 프로젝트로 인정받는다.[1]

특징

카산드라(Cassandra)는 확장성(scalability)과 고가용성(high availability)에 최적화된 대표적인 분산형 데이터 저장소(Data storage)이다. 일관된 해싱(Consistent hashing)을 이용한 링(Ring) 구조와 가십 프로토콜(Gossip protocol)을 구현하였으며, 때문에 각 노드 장비들의 추가, 제거 등이 자유롭고, 데이터센터까지 고려 할 수 있는 데이터 복제 정책을 사용하여 안정성 측면에서 많은 장점을 가지고 있다. Cassandra를 이용하면 쉐어링(Sharding)을 고려해야 할 필요도 없고 마스터 슬래이브(Master Slave) 와 같은 정책이 없이도 장애에 대응할 수 있으며, 필요에 따라 장비들을 늘리고 줄이는 데 큰 비용이 들지 않는다. 물론 그렇다고 해서 Cassandra가 완벽한 솔루션은 아니다. 당연한 이야기지만 모든 일에는 균형(trade off)이 있듯이 저러한 강력한 기능들이 구현됨으로써 반대로 수많은 단점들 역시 발생한다. Cassandra는 연결(Join)이나 거래(Transaction)를 지원하지 않고, 인덱스(Index) 등의 검색을 위한 기능도 매우 단출하다. 게다가 Cassandra의 구조상 관계 데이터베이스 관리 시스템(RDBMS)와 같은 Paging을 구현하는 것이 힘들고 키스페이스(Keyspace)(RDBMS의 DB와 같은)나 테이블(Table) 등을 과도하게 생성할 경우 메모리 오버플로어(Memory Overflow)가 발생할 수 있음을 고려하여야 한다. 따라서 Cassandra가 기존의 RDBMS들의 완벽한 대체품이라고 할 수는 없으므로, 개발하게 될 제품의 기능과 특징에 따라 Cassandra를 사용할 것인지 RDBMS를 사용할 것인지를 신중히 결정하여야 한다.[2]

데이터 구조

카산드라 데이터 구조
카산드라 링
카산드라 링에 저장되는 데이터
카산드라 데이터 테이블로 변경
파일:CQL(Cassandra Query Language)의 테이블 형태.png
CQL(Class Query Language)의 테이블 형태

카산드라(Cassandra)의 데이터 구조는 비교적 간단하다. 최상위에 논리적 데이터(Data) 저장소인 키스페이스(Keyspace)가 있고, Keyspace 아래에는 테이블(Table)이 존재한다. Table은 다수의 로우(Row)들로 구성되어있으며 각 Row는 키값(KeyValue)으로 이루어진 칼럼(Column)들로 구성된다. 관계 데이터베이스 관리 시스템(RDBMS)의 데이터베이스 테이블 로우 칼럼(DB-Table-Row-Column)의 형태와 유사한 구조를 하고 있다는 걸 알 수 있다. 더구나 Cassandra는 현재 CQL (Cassandra Query Language)을 지원하고 있다.[2]

카산드라(Cassandra)는 기본적으로 링(Ring) 구조를 띠고 있다. 그리고 Ring을 구성하는 각 노드에 데이터(Data)를 분산하여 저장한다. 파티션키(Partition Key)라고 불리는 데이터의 해쉬(hash)값을 기준으로 Data를 분산하게 된다. 처음 각 노드가 Ring에 참여하게 되면, Cassandra의 conf/cassandra.yaml에 정의된 각 설정을 통하여 각 노드마다 고유의 hash 값 범위를 부여 받는다. 그런 뒤에, 외부에서 data의 요청(request)이 오게 되면 해당 데이터의 partition key(Row key)의 hash 값을 계산하여 해당 데이터가 어느 노드에 저장되어 있는지 알고 접근할 수 있는 것이다. 그리고 Cassandra는 이렇게 계산된 hash의 값을 토큰(token)이라고 부른다.현재 Cassandra는 CQL(Cassandra Query Language)의 사용을 권장하고 있지만 CQL이 처음부터 제공되었던 것은 아니다.[2]


초기의 Cassandra는 절약 프로토콜(Thrift protocol)을 이용한 클라이언트 에이피아이(client API)를 제공하였고, 아예 Cassandra에 직접 접근해보고 싶다면 bin/cassandra-cli 유틸리티를 이용하여 데이터를 확인할 수 있다. 이러한 기존의 절약(Thrift) 기반의 에피아이(api)와 씨엘아이(cli) 유틸리티들은 카산드라 데이터 구조(Cassandra Data layer)를 있는 그대로 표현해주었지만, Thrift가 가지는 여러 가지 한계점을 같이 가지고 있다. 때문에 Cassandra 1.2버전 이후에는 기본 프로토콜(Native Protocol)을 기반으로 한 API와 CQL 문법이 추가되었고, 3.0 버전부터는 기존의 Thrift 기반의 bin/cassandra-cli 유틸리티는 아예 파괴(Deprecated) 되어 사라졌다. 더구나 이 시기에 Cassandra에는 다른 많은 변화가 같이 있었다. 슈퍼 칼럼(Super Column)이라고 하는 Column 안에 Column 형태를 가지는 자료구조가 아예 스펙에서 제외되어 수집(Collection)이라는 것으로 새롭게 대체되었으며, 기존의 칼럼 구성(Column Family)이라고 불리는 자료구조는 테이블(Table)로 명칭이 변경되었다. 이 과정에서 CQL은 이렇게 새롭게 구성된 Cassandra Data Layer를 추상적으로 표현하는 문법으로 구성되었고, 따라서 실제 데이터 구조(Data Layer)의 용어들과 CQL에서의 표현이 1:1로 매칭되지 않고 달라지게 되었던 것이다.[2]

초창기 카산드라 데이터 구조(Cassandra Data Structure)는 키스페이스(Keyspace) > 칼럼구성(Column Family) > Row > Column 형태로 구성되어 있다. Keyspace와 Column Family에 대한 정보는 모든 카산드라 절(Cassandra node)의 메모리(memory)에 저장되며, 실제 유저의 데이터들이 저장되는 Row는 각 Row key를 가지고 이것의 hash 값인 token을 기준으로 각 노드에 분산 저장된다. 그리고 Row에 속하는 Column들은 칼럼 이름(Column name)을 기준으로 정렬되어 저장된다. 이러한 형태는 Cassandra 1.2 에 들어서 Keyspace > Table > Row > Column 로 명칭이 바뀌게 된다. 하지만 이때 함께 등장한 CQL(Cassandra Query Language)은 이를 있는 그대로 표현하지 않고, 한 단계 추상화하여 표현한다.[2]

여전히 같은 의미로 사용되는 키스페이스(Keyspace)와 테이블(Table)과는 다르게, CQL(Cassandra Query Language)에서의 Row와 Column은 실제 데이터가 저장되는 지금까지 보았던 카산드라 데이터 구조(Cassandra Data Layer)에서의 Row, Column과 그 의미가 다르다. 그림에서 알 수 있듯, CQL에서 Row와 Column은 관계 데이터베이스 관리 시스템(RDBMS)의 뜻,속성(Tuple, Attribute)과 유사하다는 것을 알 수 있다. 하지만 이렇게 구성된 CQL Table은 최소 1개 이상의 Column을 주요키(primary key)라는 것으로 지정해야 하며, Cassandra는 이렇게 primary key로 지정된 column들 중에서 부분키(partition key)로 지정된 column의 가치(value)를 기준으로 데이터를 분산하게 된다.[2]

CQL(Cassandra Query Language) key

용어정리

각주

  1. 1.0 1.1 아파치 카산드라 위키백과 - https://ko.wikipedia.org/wiki/%EC%95%84%ED%8C%8C%EC%B9%98_%EC%B9%B4%EC%82%B0%EB%93%9C%EB%9D%BC
  2. 2.0 2.1 2.2 2.3 2.4 2.5 엄세진, 〈Apache Cassandra 톺아보기 1편〉, 《토스트 밋업》, 2016-01-18

참고자료

같이 보기


  의견.png 이 카산드라 문서는 데이터에 관한 토막글입니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 이 문서의 내용을 채워주세요.