- 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 기능 미제공...)
- Datastax. Java Driver (추천)
- 활용 예시
- 이베이의 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 이런식으로 쿼리.
- case1 : (sensorId, timestamp), data
- 예) 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 |