• CQL 이란?
    • Cassandra 기반에 응용적인 CQL를 두어서, SQL 비슷한(?) 제공. (제약 많음)
    • 예) CREATE TABLE IF NOT EXISTS {Keyspace}.{Table}
      • column {이름,타입}  column {이름,타입} column {이름,타입} ...
      • WITH property AND property ...
    • Partition-Key
      • CQL측에서 Cassandra에 Row를 분산하기위한 Key.
      • 예) 단일 Column : {해당value} == Row-Key
      • 예) 복합 Column : {해당value:해당value:...} == Row-Key
    • Cluster-Key
      • CQL측에서 Cassandra의 Row에 Column을 정렬하기위한 Key.
      • 예) {해당value:타name} == Column-Name , {타value} = Column-Value
        • - (name="딸기:", value=, timestamp=12345678)
        • - (name="딸기:cost", value=4000, timestamp=12345678)
        • - (name="딸기:location", value=한국, timestamp=12345678)
        • - (name="키위:", value=, timestamp=12345678)
        • - (name="키위:cost", value=6000, timestamp=12345678)
        • - (name="키위:location", value=일본, timestamp=12345678)
    • Primary-Key
      • Partition-Key + Cluster-Key
      • 예) PK(a,b,c) 으로하면 = a가 Partition-Key , bc가 Cluster-Key
        • 특정 Row 내에서 bc가 빈값으로 쭉~ 저장이 되고, 그를 기준으로 range쿼리 및 sort쿼리
      • 예) PK((a,b),c) 으로하면 = a:b가 Partition-Key , c가 Cluster-Key
        • a,b 일부만 partial-scan 불가
    • Collection 자료형
      • Set : 중복을 허용하지 않는 타입. (name에 값을 넣고, value는 빈값... 비중복 및 정렬 효과)
      • List : 중복과 순서를 허용하는 타입.(key에 순서용32byteHex넣고, value에 값을 넣어 구현)
      • Map :  KV쌍의 타입. (name에 K를 넣고, value에 V를 넣어 구현)
      • (Cassandra 내부적으로 어떻게 Flat-Wide-Row 형태로 저장되는지? 잘 살펴봐)
    • Index, Counter
      • Index : Column-Value에 인덱스.
      • Counter : 증감을 저장하는 특별한 Column.
    • SELECT 제약사항
      • WHERE : Row-Key 나 Index를 명시한 쿼리만 가능 함.
      • = , > , < 만 제공...
      • GROUP BY 는 Partition-Key 중심으로만 수행가능.
      • ORDER BY 는 Row-Key에 조건을 부여하고, Column-Name 정렬가능. (Row-Key 정렬불가능)
      • Row-Key 는 EQ 및 IN 연산 모두 허용.
      • Column-Key 는 EQ 만 허용.
  • 라이브러리
    • Datastax. Java Driver (추천)
      • CQL 전용 드라이버. (Column-Family 굳이 지원안함)
      • connectoin-pooling, 노드자동발견, Auto Fail-Over 제공. (Multi-Master 에게 RR식으로 접근)
      • 부하분산, parameter기반 statement 객체, 자동 페이징 제공
    • Cassandra JDBC
      • JDBC와 동일한 식으로 설정.
      • CQL 지원.
      • MyBatis 등과 쉽게 통합. (Auto Fail-Over 기능 미제공...)
  • 활용 예시
    • 이베이의 Custom Index : 다대다 의 관계로 원하는 데이터 테이블을 중복적으로 더 만들어서... Read성능 업!
    • CQL을 통해, 복합PK 와 Collection을 잘 활용 해라.
      • Row-Key + Column-Name 에 대해서만, range쿼리 가능.
      • Secondary-Index는 rang쿼리 불가능.
      • equal 및 In 연산자는, 인덱싱만 되어있다면~ 와따!
      • Row-Key 및 Row-Key + Column-Key 는 잘됨.
      • Row-Key + Secondary-Index 는 안됨.
      • Column-Key만 쓰면... 일단 오류인데, "Allow Filtering" 하면~ 됨.
      • "복합 Row-Key"의 일부만으로 partial-scan 안됨.
      • "복합 Row-Key"에서 일부는 eq쿼리, 일부는 range쿼리... 안됨!!!
    • 예) Log Data
      • case1 : (uid), serverId, time, text = 단순 Log UUID 으로하면... range 쿼리 자체가 안되겟죠?
      • case2 : (serverId), time, text = 말도안되는... 그냥 서버당 하나의 Log만 upsert 되겠죠?
      • case3 : (serverId, time), text = 딱 서버갯수만큼 Row가 생성되고, 슈퍼 울트라 Wide Row가 될것...
      • case3 : (time, serverId), text = 한 Row 당, 딱 서버갯수만큼 column이 생성 되겠죠?
      • case4 : ((serverId,date), time), text = 이렇게 하면 되겟죠?
    • 예) Time Sequencial Data
      • case1 : (sensorId, timestamp), data
        • 시간이 지남에 따라... 한 Row-Key(sensorId) 에 데이터가 몰림.
        • HotSpot 발생. 한 Row가 무한정 길어지는 대표적인 Anti-Pattern.
      • case2 : ((sensorId, time-unit), timestamp), data
        • 시간이 지나도, Row-Key(sensorId+단위시간) 가 적절히 분산됨.
        • WHERE sensorId=? AND time-unit=1455192000 AND timestamp<1455195000 이런식으로 쿼리.
    • 예) Denormalize
      • CREATE TABLE keyspace.worker (name(PK) , job);
      • CREATE TABLE keyspace.worker (job(PK) , name);
      • 이런식의 비정규화로, 원하는 검색을 해결한다.
    • 예) Paging
      • ...

-끝-

'NoSQL' 카테고리의 다른 글

Weaviate vdb  (0) 2024.10.30
NoSQL 모델링 이란?  (0) 2020.02.29
NoSQL 이란?  (0) 2020.02.29
분산시스템 이란?  (0) 2020.02.29
DynamoDB  (0) 2019.05.18

+ Recent posts