: 카산드라는 key-value 저장소로 primary key에 해당하는 칼럼들이 key, primary key를 제외한 칼럼들이 value이다. 카산드라의 테이블은 primary key들의 collection이라 할 수 있고 각 key는 일반적인 데이터베이스의 row에 해당한다. 당연히 key-value 구조이기 때문에 모든 데이터가 연속적으로 저장되어 있지 않는다. 같은 테이블 안에 있는 데이터라도 각 row에 접근할 때 카산드라는 저장소의 다른 장소를 탐색할 수 있다.

 

: CQL을 사용해 table을 생성할 때 다음처럼 키를 생성할 수 있다.

CREATE TABLE test_keyspace.test_table_ex1 ( 
    code text, 
    location text, 
    sequence text, 
    description text, 
    PRIMARY KEY (code, location, name)
);

CREATE TABLE test_keyspace.test_table_ex2 ( 
    code text, 
    location text, 
    sequence text, 
    description text, 
    PRIMARY KEY ((code, id), location, name)
);

 

: 카산드라의 primary key는 크게 partition key와 cluster key로 구분할 수 있다. partition key는 primary key의 첫 번째 부분이다. test_table_ex1에서 code, test_table_ex2에서 (code, id)가 해당 테이블의 primary key다. cluster key는 primary key에서 partition key를 제외한 나머지 key를 의미한다. test_table_ex1에서 location과 name, test_table_ex2에서 location과 name이 cluster key가 되겠다. 

 

: 카산드라는 데이터를 클러스터 내에 분배한다. 분배할 때 partition key를 이용한다. partition key를 해시 알고리즘으로 변환에 토큰을 만든다. 토큰을 기준으로 클러스터 내 특정 노드에 데이터를 위치시킨다. 따라서, 같은 partition key를 가지는 모든 row들은 같은 디스크에 저장된다. 같은 partition key를 가진 데이터들을 파티션이라고 부른다. 하나의 파티션은 cluster key에 의해 정렬된 상태로 연속적으로 저장되고 하나의 디스크에 저장되기 때문에 partition에 약 2billion 정도의 칼럼을 저장할 수 있다. 만약 한 테이블에 10개의 칼럼이 있다면 파티션당 약 200 million row를 저장할 수 있다. 보통 한 partition당 100,000 row를 넘어가면 read 성능이 감소한다. 그렇기 때문에 하나의 partition에 너무 많은 row를 저장하지 않도록 데이터를 여러 partition으로 분배하는 게 중요하다.

 

: 데이터를 여러 partition으로 분배하기 위해서 partition key를 튜플처럼 묶어서 여러 칼럼으로 구성할 수 있다. 단, CQL을 사용해 where 조건절을 사용할 때 partition key의 모든 칼럼에 대한 조건을 붙여야 하기 때문에 번거롭거나 제약사항이 생긴다. cluster key도 여러 칼럼으로 구성할 수 있다. 여러 칼럼으로 구성하면 partition내 row들이 cluster key의 첫 번째 칼럼을 기준으로 일차 정렬되고, 두 번째 칼럼... 다음 칼럼들로 순차적으로 정렬된다. 그렇기 때문에 cluster key를 이용해 where 조건문으로 select한다면 where에 사용하는 cluster key 중 가장 마지막 칼럼에만 부등호 연산을 수행할 수 있다. 나머지 모든 조건은 등호만 허용된다.

 

   

 

 

+ Recent posts