kok202
[2019.03.14] 카산드라 CQL

2019. 3. 14. 14:35[정리] 데이터베이스/[NoSQL] Cassandra

Mac에서 카산드라 설치

brew install cassandra

 카산드라 설치

 brew services start cassandra

 카산드라 실행

 cqlsh

 카산드라를 조작하는 cql 실행

 cassandra-cli 는 deprecated 됨








CQL 테이블 생성, 수정 간단 예시

cqlsh> CREATE KEYSPACE test WITH REPLICATION = {

'class':'SimpleStrategy', 

'replication_factor':2

}; 

cqlsh> USE test; 

cqlsh:test>CREATE TABLE member( 

id int, 

name text, 

age int, 

PRIMARY KEY (id)

);

cqlsh:test> ALTER TABLE member ADD money int;

cqlsh:test> desc schema

cqlsh:test> INSERT INTO member(id, name, age, money) VALUES (0, 'kok202', 99, 3000);

cqlsh:test> SELECT * FROM member;


 id | age | money | name

---+----+-------+--------

  0 |  99 |  3000 | kok202


 Describe Schema 결과

CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '2'}  AND durable_writes = true;


CREATE TABLE test.member (

id int PRIMARY KEY,

age int,

money int,

name text

) WITH bloom_filter_fp_chance = 0.01

AND caching = {

'keys': 'ALL', 

'rows_per_partition': 'NONE'}

AND comment = ''

AND compaction = {

'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 

'max_threshold': '32', 

'min_threshold': '4'}

AND compression = {

'chunk_length_in_kb': '64', 

'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}

AND crc_check_chance = 1.0

AND dclocal_read_repair_chance = 0.1

AND default_time_to_live = 0

AND gc_grace_seconds = 864000

AND max_index_interval = 2048

AND memtable_flush_period_in_ms = 0

AND min_index_interval = 128

AND read_repair_chance = 0.0

AND speculative_retry = '99PERCENTILE';








카산드라의 INSERT 와 UPDATE 

Cassandra는 Insert와 Update가 내부동작이 같기 때문에 같은 Primary key 를 가지는 데이터를 INSERT INTO 로 수정할 수 있다.

cqlsh:test> INSERT INTO member(id, name, age, money) VALUES (0, 'kok202', 100, 3000);

cqlsh:test> SELECT * FROM member ;


 id | age | money | name

---+----+-------+--------

  0 | 100 |  3000 | kok202


이 과정에서 주의해야한다. 함부로 손대면 기존 데이터가 손실되기 때문

cqlsh:test> INSERT INTO member(id, name, age, money) VALUES (0, 'kok202', 101, 3000) IF NOT EXISTS;

NoHostAvailable:

cqlsh:test> SELECT * FROM member ;


 id | age | money | name

---+----+-------+--------

  0 | 100 |  3000 | kok202








의문 : NoSQL 이라면서 CQL은 SQL이랑 똑같은데 왜 쓰는거야?

Foregin key 가 없고 Join 이 없다.

RDB 는 제약 조건이 많으므로 자유롭게 확장하지 못한다.

RDB 에서 분산 데이터 저장을 하려면 Sharding 이라는 복잡한 기법을 사용해야한다.

카산드라는 태생이 Consistent hashing 이기 때문에 분산 데이터 저장에 유리하다.

카산드라는 로그나 Time serial 데이터 같은 것을 저장하기에 적합하다.


cqlsh:test> CREATE TABLE ts ( 

serverID int, 

timestamp int, 

data text, 

PRIMARY KEY(serverID, timestamp)

);

cqlsh:test> INSERT INTO ts(serverID, timestamp, data ) values (1, 1552515482, '{"userId":100}, "serverStatus":"STABLE"');

cqlsh:test> INSERT INTO ts(serverID, timestamp, data ) values (1, 1552515485, '{"userId":100}, "serverStatus":"STABLE"');

cqlsh:test> INSERT INTO ts(serverID, timestamp, data ) values (1, 1552515490, '{"userId":105}, "serverStatus":"STABLE"');

cqlsh:test> INSERT INTO ts(serverID, timestamp, data ) values (2, 1552515495, '{"userId":105}, "serverStatus":"STABLE"');

cqlsh:test> INSERT INTO ts(serverID, timestamp, data ) values (2, 1552515493, '{"userId":105}, "serverStatus":"STABLE"');

cqlsh:test> SELECT * FROM ts;

 serverid | timestamp  | data

---------+-----------+-----------------------------------------

            1 | 1552515482 | {"userId":100}, "serverStatus":"STABLE"

            1 | 1552515485 | {"userId":100}, "serverStatus":"STABLE"

            1 | 1552515490 | {"userId":105}, "serverStatus":"STABLE"

            2 | 1552515493 | {"userId":105}, "serverStatus":"STABLE"

            2 | 1552515495 | {"userId":105}, "serverStatus":"STABLE"

(5 rows)


쿼리는 맨마지막에 날렸지만 Row key에 따라 자동 정렬해서 데이터가 들어간 모습








CQL Key 정리

 Partition key

 data 분산 저장을 위한 Unique key

 partition key 가 한개 일 경우 : CQL column의 value가  Row key로 저장

 partition key 가 N개 일 경우 : CQL column들의 value가  ":"으로 연접되서 Row key로 저장

 Cluster key

 카산드라가 Column 데이터를 정렬할 때 사용하는 키

 Primary key

 카산드라에서 Row 데이터를 구분하는 unique key

 1개 이상의 Partition key + 0 개 이상의 Cluster key 조합이다.

 Composite key

 Primary key 가 

 1개 이상의 Partition key + 1 개 이상의 Cluster key 조합일 경우

 composite partition key

 Primarty key 가

 1개 이상의 Partition key + 2 개 이상의 Cluster key 조합일 경우



'[정리] 데이터베이스 > [NoSQL] Cassandra' 카테고리의 다른 글

[2019.03.14] 카산드라 Intro  (0) 2019.03.14