Centos7에서 카산드라 시작하기
- 다음 코드를 실행
- https://cassandra.apache.org/_/quickstart.html
- 순서대로 실행하면 cqlsh> 환경으로 접속하게 된다
카산드라 튜토리얼
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;
'수업정리 > poject-study' 카테고리의 다른 글
화면설계도 (2) | 2023.10.27 |
---|---|
추천시스템 데이터프로세싱 개요 - Recommender SystemsHandbook (요약) (1) | 2023.10.25 |