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 |
---|