티스토리 뷰

  카산드라는 테이블에 데이터를 저장한다. 각 테이블은 Row 와 Column 으로 구성되어있다. CQL 은 테이블에 저장된 데이터를 찾기위한 Query 로 사용된다. 카산드라 데이터 모델은 Query 에 최적화 되어있다. 카산드라는 관계형 데이터베이스에서 사용하는 관계형 데이터 모델링을 지원하지 않는다.

 

What is Data Modeling?

 데이터 모델링은 엔티티와 엔티티간의 관계를 식별하는 과정이다. 관계형 데이터베이스에서는 다른테이블의 데이터와 연관짓기 위하여 FK 를 테이블에 지정하였다. Application 에서 데이터베이스로 만드는 쿼리는 테이블의 구조에 기인하고 테이블 조인에 의해서 데이터가 조회된다. 

 

 카산드라에서는 데이터 모델링은 Query-Driven 이다. 데이터 접근 패턴과 Application 의 쿼리는 데이터 구조와 조직을 결정한다.

 

  데이터는 특정한 쿼리에 의해 모델링된다. 쿼리는 단일 테이블에 접근하는 것이 최고의 설계이다. 쿼리에 포함된 모든 엔티티는 하나의 테이블에 포함되어있어야 가장 빠른 접근이 가능하다. 데이터는 쿼리에 적합하도록 설계된다. 테이블은 하나 이상의 엔티티를 쿼리에 적합하도록 가질 수 있다. 전형적으로 엔티티는 엔티티끼리 관계를 갖기 때문에 단일 엔티티는 여러개의 테이블에 포함될 수 있다.

 

Query-driven modeling

 관계형 데이터베이스에서 여러개의 테이블에서 데이터를 불러오기위하여 조인이 사용되었던 것과는 다르게 카산드라는 조인을 지원하지 않는다. 따라서 필요한 모든 필드는 하나의 테이블에 모여있어야 한다. 각 쿼리는 테이블에 의해 Back 되기 때문에, 데이터가 여러개의 테이블에 중복되어 저장될 수 있다. 데이터 중복과 높은 Write 처리량은 높은 Read 성능을 얻기 위함이다.

 

Goals

 Primiary Key 와 Parition Key 의 선택은 클러스터에 데이터를 분배하기 위하여 중요하다. 하나의 Read 쿼리에서 접근하는 Parition 숫자를 최소로 유지하는것은 중요하다. 왜냐하면 다른 Parititon 들은 다른 노드에 위치할 수 있고 Coordinator 는 요청을 각 노드로 전달하여 추가적인 Overhead 와 Latency 가 증가한다. 비록 하나의 Read 쿼리에 다른 Parititon 이 같은 노드에 포함되어있다고 하더라도 적은 Partition 은 쿼리를 더 효과적으로 만든다.

 

Partitions

 카산드라는 클러스터의 노드에 분산해서 데이터를 저장하는 분산 시스템이다. Parititon Key 가 노드에 데이터를 분산하는데 사용된다. 카산드라는 데이터 분배를 위해 일관된 해싱을 사용하여 데이터를 분배한다. Hashing 은 Hash Table 에 저장되는 Hash 값을 Key 를 Hashing 함으로서 얻는다. Parition Key 는 Prmiary Key 의 첫번째 필드로 결정된다. 적은 Partition 은 Query 에 대한 응답을 빠르게 한다. 

 

 Parititon 의 예제로, 테이블 t 은 하나의 Primary Key 인 id 를 가지고 있다.

CREATE TABLE t (
   id int,
   k int,
   v text,
   PRIMARY KEY (id)
);

 클러스터에 데이터 분배를 위한 Parition Key 는 첫번째 Primary Key 인 id 로 생성된다.

 

테이블 t 가 Primary Key 로 복합키인 2개 이상의 Key 를 갖는다고 생각해보자

CREATE TABLE t (
   id int,
   c text,
   k int,
   v text,
   PRIMARY KEY (id,c)
);

 클러스터에 데이터 분배를 위한 Parition Key 는 첫번째 Primary Key 인 id 로 생성되고 두번째 필드인 c 는 Clustering Key 가 되어 Parititon 안에서 Sorting 을 위해 사용된다. Clustering Key 를 사용하여 데이터를 정렬하게 되면 데이터 검색에 더 효과적이다.

 

 일반적으로 Primary Key 의 첫번째 필드는 Partition Key 를 생성하기 위하여 Hshing 되고 남은 필드는 Parititon 안에서 정렬을 하기 위한 Clustering Key 로 사용된다. Partition 된 데이터는 Read 와 Write 의 효율성을 향상시킨다. Primary Key 외에 다른 필드들은 개별적으로 Indexing 되어 쿼리 성능 향상에 사용될 수 있다.

 

 Parititon Key 는 그룹핑된다면 여러개의 필드로 사용될 수 있다. t 테이블의 다른 버전을 보면 첫번째 Primary Key 가 그룹핑되어 2개의 id 를 갖는걸 볼 수 있다.

CREATE TABLE t (
   id1 int,
   id2 int,
   c1 text,
   c2 text
   k int,
   v text,
   PRIMARY KEY ((id1,id2),c1,c2)
);

id1, id2 가 Parition Key 를 생성하는데 사용되고 나머지 필드인 c1, c2 가 Clustering Key 로서 사용된다.

 

Comparing with Relational Data Model

 관계형 데이터베이스는 다른 테이블과 연관이 있는 데이터를 FK 를 사용하여 저장한다. 관계형 데이터베이스는 데이터모델링에 테이블 기반으로 접근한다. Query 는 여러 테이블의 데이터에 접근하기 위해서 Join 을 사용한다. 카산드라는 FK 의 개념과 Relation 이 존재하지 않는다. 카산드라 데이터 모델은 쿼리를 효과적으로 사용하는데 중점을 둔다. 쿼리는 여러개의 테이블을 포함할 수 없다. 관계형 데이터베이스는 데이터 중복을 피하기위해 Normailze 한다. 카산드라는 대조적으로 쿼리기반으로 데이터 모델링하기 때문에 중복된 데이터가 여러 테이블에 저장될 수 있다. 만약 카산드라 데이터 모델이 복잡한 관계를 완전히 아우를 수 없다면 Client 단에서의 Join 이 사용될 수 있다.

 

출처 - https://cassandra.apache.org/doc/latest/cassandra/data_modeling/intro.html
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함