카산드라 데이터 모델은 query-driven design을 해야 한다. 자유로운 join/where 연산이 없기 때문이다. 카산드라는 읽기가 아닌 쓰기 성능을 최대화하기 위해 설계되었다. 그래서 데이터를 저장할 때 RDB와 같이 풍부한 인덱싱을 제공하는 B-Tree를 사용하지 않고 순차 쓰기 방식을 적용하는 LSM Tree 기반의 SSTable을 사용하기 때문에 읽기 성능이 떨어져 자유롭게 join/where 연산을 하지 못하도록 한다.

그렇기 때문에 데이터를 모델링할 때 RDB와 다른 방식을 적용해야 한다. 바로, query-driven design 이다. 데이터를 설계할 때 어떤 쿼리를 원하는 지 미리 결정을 하고 그 쿼리에 가장 효율적인 데이터 모델링을 해야 한다. 이를 위해서 고려할 점은 다음과 같다.

1. 각 쿼리가 오직 하나의 partition만 접근하도록 스키마를 설계한다. partition은 보통 100MB 이하의 사이즈로 작게 유지하는 게 좋다.
2. 만약 여러 partition을 접근해야 하는 쿼리가 필요하다면 비동기로 쿼리를 수행하고 클라이언트 단에서 merge를 해야 한다.
3. 한 번의 쿼리에 하나의 partition에 접근하기 위해 다양한 데이터 nesting techniques를 사용하면 좋다.(예를 들어 collection column이나 partition 내에서 정렬된 채로 저장되는 cluster column이 있다.)
4. 필요하다면 데이터를 복사해도 괜찮다.(Denormalization)

+ Recent posts