NoSQL/Cassandra DB

카산드라(cassandra), 데이터 저장 구조 - 클러스터링 키(Clustering Key)

어휘 창고 지기 2020. 11. 2. 12:41
반응형

카산드라 테이블 생성 시 아래의 PRIMARY KEY 구문을 유심히 보시기 바랍니다. PRIMARY KEY의 선두에 위치한 (month, day)는 파티션 키(Partition Key)이며, 파티션 키 뒤에 위치한 컬럼이 클러스터링 키(Clustering Key)입니다.

그림 1. 테이블 생성 CQL 구조

파티션 키로 데이터가 저장될 노드의 위치를 알 수 있다면 클러스터링 키의 역할은 무엇일까요?

아래의 테이블을 예로 들어 설명하겠습니다.

그림 2. weather_date_by_date 데이터 예시

위의 표는 그림 1의 weather_data_by_date 테이블에 데이터를 넣은 모습을 표현한 것입니다. 데이터는 모두 5건이 존재하며 Partition Key인 monthday가 모두 1월, 1일 이므로 동일한 노드에 저장됩니다. 그러나 동일한 노드에 데이터가 저장되더라도 무작위로 입력되는 것이 아니라 station_id와 time 값에 따라 정렬된 상태로 저장합니다. 즉, station_id의 값은 큰 값부터 작은 값의 순서(station_id DESC)로, time의 값은 작은 값부터 큰 값의 순서(time ASC)로 정렬되어 저장합니다. 이처럼 클러스터링 키는 데이터가 저장되는 정렬 방식을 결정합니다. 적절하게도 카산드라는 테이블의 데이터를 넣는 저장소를 SSTable(Sorted String Table)이라 하며 맨 앞의 SSorted(정렬된)를 의미합니다. SSTable에 저장된 실제 데이터를 열어보면 아래와 같은 형태로 저장됩니다. 아래의 샘플에서 알 수 있듯이 파티션 키가 "key" : [ "1000" ]으로 동일하고 클러스터링 키가 각각 "clustering" : [ 10 ], "clustering" : [ 11 ]인 데이터는 클러스터링 키를 기준으로 정렬되어 있습니다.

 

{
   "partition" : {
     "key" : [ "1000" ],
     "position" : 420
   },
   "rows" : [
     {
       "type" : "row",
       "position" : 619,
       "clustering" : [ 10 ],
       "cells" : [
         { "name" : "b", "value" : 100 },
         { "name" : "address", "deletion_info"},
         { "name" : "address", "path", "value" : "서울" },
         { "name" : "address", "path", "value" : "부산" },
         { "name" : "address", "path", "value" : "광주" },
         { "name" : "books", "deletion_info"},
         { "name" : "books", "path" : [ "cassandra" ], "value" : "2020-02-01" },
         { "name" : "books", "path" : [ "mongodb" ], "value" : "2020-02-20" },
         { "name" : "contact", "deletion_info"},
         { "name" : "contact", "path" : [ "a123@hotmail.com" ], "value" : "" },
         { "name" : "contact", "path" : [ "b456@gmail.com" ], "value" : "" }
       ]
     },
     {
       "type" : "row",
       "position" : 619,
       "clustering" : [ 11 ],
       "cells" : [
         { "name" : "b", "value" : 300 },
         { "name" : "address", "deletion_info"},
         { "name" : "address", "path", "value" : "서울" },
         { "name" : "address", "path", "value" : "부산" },
         { "name" : "address", "path", "value" : "광주" },
         { "name" : "books", "deletion_info"},
         { "name" : "books", "path" : [ "cassandra201" ], "value" : "2020-02-01" },
         { "name" : "books", "path" : [ "mongodb201" ], "value" : "2020-02-20" },
         { "name" : "contact", "deletion_info"},
         { "name" : "contact", "path" : [ "a123@hotmail.com" ], "value" : "" },
         { "name" : "contact", "path" : [ "b456@gmail.com" ], "value" : "" }
       ]
     }
}

반응형