티스토리 뷰

최근 NoSQL에서 많이 사용하는 카산드라(Cassandra)의 데이터 모델과 칼럼 패밀리 등 개념에 대해서 정리해 보려고 한다. 


카산드라 개요

카산드라는 구글 BigData의 컬럼 기반 모델과 아마존 Dynamo의 분산 모델을 기반으로 페이스북에서 만든 데이터베이스이다. 

JVM 기반으로 동작하며 분산 환경으로  고가용성과 확장성을 가지고 있다. 

또한 칼럼 패밀리 기반으로 대용량 트랜잭션을 처리하는데도 용이하여 페이스북, 트위터 등 SNS에서 주로 사용한다. 


카산드라 데이터 모델

카산드라는 Key-Value 형태의 NoSQL로서 칼럼 패밀리 형태의 데이터 모델을 활용한다. 

참고로 카산드라와 함께 많이 사용하는 몽고디비는 도큐먼트 데이터 모델을 사용하고 있다.


칼럼 패밀리 (Column Family)


칼럼 패밀리는 말 그대로 칼럼들의 집합이며, 정확하게 Column과 Row로 구성되어 있다. 

그래서 기존 RDBMS의 테이블(Table)과 비슷한 것이라 생각할 수 있지만 내부적으로는 차이점이 존재한다. 

관계형 데이터베이스에서는 테이블을 설계할 때 미리 칼럼의 이름과 데이터 타입 등을 정의한다. 

어플리케이션에서는 해당 스키마에 맞춰 테이블에 있는 정보들을 가져와서 사용할 뿐이다. 


하지만 카산드라의 칼럼 패밀리는 클라이언트 어플리케이션에 의해서 만들어진다. 

즉, 칼럼 패밀리는 메타 데이터만 가지고 있다고 보면 된다. 

그렇기 때문에 각 행(Row)마다 서로 다른 칼럼을 가질 수 있다. 


이러한 칼럼패밀리는 정적(static) 칼럼 패밀리와 동적(dynamic) 칼럼 패밀리로 나눌 수 있다. 

정적 칼럼 패밀리는 관계형 데이터베이스와 같이 미리 칼럼들이 정의되어 있는 것이다. 

하지만 반드시 모든 칼럼을 다 사용하지 않아도 되는 점이  RDBMS와 차이점이기도 하다. 



동적 칼럼 패밀리는 어플리케이션에서 칼럼을 생성하는 방식이다. 

개별적인 칼럼의 메타데이터를 정의하지 않고 칼럼의 이름과 값에 대한 타입만 정의하는 것이다. 

실제 칼럼의 이름과 값은 어플리케이션에서 저장할 때 넣는 방식이다. 



모든 칼럼 패밀리에 각 행(Row)별로 유일한 값인 Row Key가 있는데, 이것은 관계형 데이터베이스의 Primary Key와 유사하다. 

칼럼 패밀리는 이 Row Key를 기준으로 파티션되고, Row Key는 항상 기본적으로 인덱스되어 있다. 


칼럼 (Column)


칼럼은 기본적으로 이름과 값으로 구성되어 있으며, 

칼럼 이름은 미리 정의되어 있을 수도 있고 어플리케이션에서 동적으로 생성할 수도 있다. 

칼럼 값은 반드시 있어야 하는 것은 아니다. 경우에 따라 비어 있는 칼럼 값이 있을 수 있다. 

그리고 칼럼에는 TimeStamp가 존재하는 가장 최근 업데이트된 시간을 기록한다. 

여러개의 세션이 동시에 같은 칼럼에 접근해 업데이트할 때 이런 TimeStamp를 활용하게 된다. 


 

또한 칼럼마다 선택적으로 소멸 시점을 알려주는 TTL(Time to Live) 정보를 가질 수 있다. 

그리고 Counter Column이라는 카운트를 위한 칼럼도 있다는 것을 기억하면 좋을 것 같다. 


슈퍼 칼럼(Super Column)이란 것도 있는데 이것은 칼럼을 그룹핑한 것으로 이해하면 된다. 

위에서 설명한 칼럼 패밀리를 사용해도 되지만 비정규화를 통해 검색의 효율성을 높이기 위해 슈퍼 칼럼을 사용한다고 한다. 



키스페이스 (Keyspace)


카산드라의 키스페이스는 RDB의 스키마 개념이라고 보면 된다. 

일반적으로 칼럼패밀리의 집합으로 이루어져 있으며 어플리케이션당 하나의 키스페이스를 사용한다. 


이제 다음 그림과 같은 카산드라의 데이터 모델을 이해할 수 있을 것이다. 

Keyspace > Column Family > Row > Column으로 구성되어 있다. 



만약 슈퍼 칼럼을 활용한다면 다음과 같은 구조로 나올 것이다. 

Keyspace > Column Family > Row > Super Column > Column



댓글
댓글쓰기 폼