본문 바로가기

수업정리/poject-study

Apache Cassandra 튜토리얼

Centos7에서 카산드라 시작하기

 

Apache Cassandra | Apache Cassandra Documentation

STEP 4: LOAD DATA WITH CQLSH The CQL shell, or cqlsh, is one tool to use in interacting with the database. We’ll use it to load some data into the database using the script you just saved. docker run --rm --network cassandra -v "$(pwd)/data.cql:/scripts/

cassandra.apache.org

카산드라 튜토리얼

 

The Apache Cassandra Beginner Tutorial

There are lots of data-storage options available today. You have to choose between managed or unmanaged, relational or NoSQL, write- or read-optimized, proprietary or open-source — and it doesn't end there. Once you begin your search, you will end up in

www.freecodecamp.org


DESCRIBE keyspaces;

  • 키스페이스를 모두 표시

키스페이스 생성

CREATE KEYSPACE learn_cassandra
  WITH REPLICATION = { 
   'class' : 'NetworkTopologyStrategy',
   'datacenter1' : 3 
  };

 

 

allow filtering

  • 비용이 많이 드는 쿼리를 실행하여 클러스터가 손해보는것을 방지시켜줌
  • SELECT * FROM learn_cassandra.users_by_email WHERE age=26 ALLOW FILTERING;

replication factor

  • 가용성을 위한 요인
  • 복제인수
  • 3개이상 써야 가용성 확보 용이
  • 2개는 로컬 클러스터

일관성

 

  • 카산드라는 일관성이 좋음
  • 일관성이 3으로 설정되어있어야 좋음
1 + [write-consistency-level] > 3
  • 일관성 all로 주면 오류남
  • CONSISTENCY ALL; SELECT * FROM learn_cassandra.users_by_country WHERE country='US';
  • 일관성 1로 주면 ㄱㅊ
  • CONSISTENCY ONE; SELECT * FROM learn_cassandra.users_by_country WHERE country='US';
  • 카산드라는 읽기보다 쓰기가 저렴함
  • 쓰기에 최적화된 db

압축

  • SizeTieredCompactionStrategy: 기본값이며 읽기보다 쓰기가 더 많은 경우 특히 성능이 좋습니다. (default)
  • LeveledCompactionStrategy: 쓰기에 대한 _읽기를 최적화_합니다. 이 최적화는 비용이 많이 들 수 있으므로 프로덕션 환경에서 주의 깊게 시험해 봐야 합니다.
  • TimeWindowCompactionStrategy: 시계열 데이터용입니다.
  • WITH compaction을 사용해 압축 전략을 테이블 생성 시 변경 할 수 있음.
CREATE TABLE learn_cassandra.users_by_country_with_leveled_compaction (
    country text,
    user_email text,
    first_name text,
    last_name text,
    age smallint,
    PRIMARY KEY ((country), user_email)
) WITH
  compaction = { 'class' :  'LeveledCompactionStrategy'  };

사전정렬

  • WITH CLUSTERING ORDER BY (컬럼 ASC); 로 테이블 생성시 정렬할 컬럼 지정 가능
CREATE TABLE learn_cassandra.users_by_country_sorted_by_age_asc (
    country text,
    user_email text,
    first_name text,
    last_name text,
    age smallint,
    PRIMARY KEY ((country), age, user_email)
) WITH CLUSTERING ORDER BY (age ASC);

할 일 목록 애플리케이션 설계 (실전 예제)

  • 선행되어야 하는 learn_cassandra keyspace
CREATE KEYSPACE learn_cassandra
  WITH REPLICATION = { 
   'class' : 'NetworkTopologyStrategy',
   'datacenter1' : 3 
  };
  • todo_by_user_email 테이블 생성
  • todos_shared_by_target_user_email, todos_shared_by_source_user_email 도 생성
CREATE TABLE learn_cassandra.todo_by_user_email ( user_email text, name text, creation_date timestamp, PRIMARY KEY ((user_email), creation_date) ) WITH CLUSTERING ORDER BY (creation_date DESC) AND compaction = { 'class' : 'LeveledCompactionStrategy' };
CREATE TABLE learn\_cassandra.todos\_shared\_by\_target\_user\_email (  
target\_user\_email text,  
source\_user\_email text,  
creation\_date timestamp,  
name text,  
PRIMARY KEY ((target\_user\_email), creation\_date)  
) WITH CLUSTERING ORDER BY (creation\_date DESC)  
AND compaction = { 'class' : 'LeveledCompactionStrategy' };

CREATE TABLE learn\_cassandra.todos\_shared\_by\_source\_user\_email (  
target\_user\_email text,  
source\_user\_email text,  
creation\_date timestamp,  
name text,  
PRIMARY KEY ((source\_user\_email), creation\_date)  
) WITH CLUSTERING ORDER BY (creation\_date DESC)  
AND compaction = { 'class' : 'LeveledCompactionStrategy' };
  • BATCH 생성
BEGIN BATCH INSERT INTO learn\_cassandra.todo\_by\_user\_email (user\_email,creation\_date,name) VALUES('alice@email.com', toTimestamp(now()), 'My first todo entry')

INSERT INTO learn\_cassandra.todos\_shared\_by\_target\_user\_email (target\_user\_email, source\_user\_email,creation\_date,name) VALUES('bob@email.com', 'alice@email.com',toTimestamp(now()), 'My first todo entry')

INSERT INTO learn\_cassandra.todos\_shared\_by\_source\_user\_email (target\_user\_email, source\_user\_email,creation\_date,name) VALUES('alice@email.com', 'bob@email.com', toTimestamp(now()), 'My first todo entry')

APPLY BATCH;

카산드라 특징

  • 외래키 사용 가능
  • 인덱스 사용 가능
  • 뷰 사용 가능
  • TTL 사용 가능
  • JVM 기반으로 만들어졌음

TTL 사용하기

  • USING TTL (초)로 사용하면 된다.
INSERT INTO learn\_cassandra.todo\_by\_user\_email (user\_email,creation\_date,name) VALUES('john@email.com', toTimestamp(now()), 'This entry should be removed soon') USING TTL 60;
  • TTL 조회하기
SELECT TTL(name) FROM learn\_cassandra.todo\_by\_user\_email WHERE user\_email='john@email.com';
  • null 값 넣을 때 주의해야한다.

UPDATE

  • = INSERT
  • 카산드라는 추가 전용이라, 컬럼 수정 시 INSERT와 동일한 동작을 수행하게 된다.
  • 경량 트랜잭션으로 IF EXISTS와 조합해서 사용하면 기존 RDBMS와 동일하게 동작하는 듯하다.

UPDATE-2 경량트랜잭션

  • 마지막에 IF NOT EXISTS 구문을 붙여 기존 수정 방식과 동일하게 진행 가능하다.
  • 이럼 읽기에 시간을 써야해서 성능상 손해를 볼 수 있음
INSERT INTO learn_cassandra.todo_by_user_email (user_email,creation_date,name) VALUES('john@email.com', toTimestamp(now()), 'Yet another entry') IF NOT EXISTS;