Cassandra는 최상위에 논리적 데이터 저장소인 Keysapce가 있고, 그 아래에 테이블이 존재한다. Table은 다수의 Row들로 구성되어 있으며, 각 Row는 Key-Value로 이루어진 column들로 구성된다.
apache_2.png
Cassandra는 기본적으로 Ring 구조를 띠고 있다. 그리고, Ring을 구성하는 각 노드에 Data를 분산하여 저장한다. 데이터는 Partition Key 라고 부리는 데이터의 hash값을 기준으로 분산하게 된다.
처음 각 노드가 Ring에 참여하게되면, conf/cassandra.yaml 에 정의된 각 설정을 통해 각 노드마다 고유의 hash 값 범위를 부여 받는다. 그 후에, 외부에서 데이터 요청이 오면 해당 데이터의 partition key(row key)의 hash값을 계산하여 해당 데이터가 어느 노드에 저장되어 있는지 알고 접근할 수 있다. 이렇게 계산된 hash 값을 token이라 부른다.
CQL(Cassandra Query Language)에서의 Row와 Column은 실제 데이터가 저장되는 Cassandra Data Layer에서의 Row와 Column과 의미가 다르다.
apache_5.png
위의 그림에서 보듯이 CQL에서 Row와 Column은 RDMBS의 Tuple, Attribute와 유사하다는 것을 알 수 있다. 이렇게 구성된 CQL Table은 최소 1개 이상의 column을 primary key로 지정해야하며, primary key로 지정된 column들 중에서 partition key로 지정된 값으로 데이터를 분산하게 된다. 즉, 아래와 같은 결론을 내릴 수 있다.
Cassandra는 Row Key의 Hash 값을 이용하여 데이터를 분산한다.
이때, Cassandra Data Layer에서의 Row key = CQL partition key의 value이다. (복수의 partition key라면 해당 Column value들과 :문자의 조합이다.)
그리고, Cassandra Data Layer에서의 Column Name = CQL cluster key의 Column value와 primary key에 속하지 않은 Column Name들 및 : 문자의 조합이다.