[CassandraDB] ์๊ฐ
์นด์ฐ๋๋ผDB๋ ๋ถ์ฐ์์คํ
์ ์ต์ ํ๋ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค ํ๋๋ค.
์ ์ํ ์ค์ผ์ผ์์-ํ์ฅ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ผ๋ก ๋ด์ธ์ด๋ค. ๋ค์ดํ์ ์์ด ๋ ธ๋๋ฅผ ์์ญ์๋ฐฑ๊ฐ์ฉ ์์ ๋กญ๊ฒ ๋๋ฆฌ๊ฑฐ๋ ์ค์ผ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ write๊ฐ read๋ณด๋ค ๋ ๋น ๋ฅด๋ค. ๋ถ์ฐ ํ๊ฒฝ์์์ ๋น ๋ฅด๊ณ ์์ ํ write ์์ ์ ์ํด read ์ฑ๋ฅ์ ํฌ์ํ ํํ์ธ ๊ฒ ๊ฐ๋ค.
2008๋ ์ ํ์ด์ค๋ถ์ ์ํด์ ์ฒ์ ๋ง๋ค์ด์ก๊ณ , ํ์ฌ๋ ์ํ์น ์ฌ๋จ์์ ๊ด๋ฆฌํ๊ณ ์๋ค.
NoSQL์ด๋ผ๊ณ ๋ ํ์ง๋ง, SQL ๊ตฌ๋ฌธ์ ์ฝ๊ฐ ์ ๊ณตํ๊ณ ACID๋ฅผ ๋ณด์ฅํด์ RDB์ฒ๋ผ ์ฌ์ฉํ ์๋ ์๋ค.
๋ค๋ง JOIN ๊ฐ์๊ฑด ์๋ค.
๋๊ท๋ชจ๋ก ์ฐ๊ธฐ์๋ ๊ฝค ์ ์ ํ ๊ฒ ๊ฐ๋ค. ๋ทํ๋ฆญ์ค๋ ์ ํ ๊ฐ์๋ฐ์๋ ์์ฒ๊ฐ ๋จ์์ ๋ ธ๋๋ฅผ ํด๋ฌ์คํฐ๋งํด์ ์ฐ๊ณ ์๋ค๊ณ ํ๋ค.
๋ค๋ง ์๋ฐ๋ก ๋ง๋ค์ด์ง๊ฑฐ๋ผ์ GC๋ก ์ธํ ๋ฌธ์ ๊ฐ ์กฐ๊ธ์ ์๋ ๊ฒ ๊ฐ๋ค.
๋์ค์ฝ๋๋ ์นด์ฐ๋๋ผ๋ก ์์ญ์ต๊ฐ ๋จ์์ ๋ฉ์ธ์ง ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์๋ค๊ฐ GC๋ก ์ธํ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ScyllaDB๋ก ๋ง์ด๊ทธ๋ ์ด์
์ ํ๋ค๊ณ ํ๋ค.
๊ตฌ์กฐ
์นด์ฐ๋๋ผ๋ multi master ๋ ํ๋ฆฌ์ผ์ด์ ์ ํตํด ๋ถ์ฐ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ค.
๊ฐ ๋
ธ๋๊ฐ ์ ๋ถ ์ฝ๊ธฐ/์ฐ๊ธฐ๋ฅผ ํ ์ ์์ผ๋ฉฐ, ํ ๋
ธ๋์ ์ฐ๊ธฐ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋
ธ๋์๋ ๋ณ๊ฒฝ์ฌํญ์ ์ ํํ๋ ๊ฒ์ด๋ค.
gossip ํ๋กํ ์ฝ
์นด์ฐ๋๋ผ๋ ๋
ธ๋ ๊ฐ ๋ฐ์ดํฐ ๋ณต์ ์ gossip์ด๋ผ๋ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค.
๋ธ๋ก์ฒด์ธ์ด๋ ๊ธฐํ P2P์์๋ ์์ฃผ ์ฌ์ฉ๋๋๋ฐ, ๊ฝค๋ ๋
ํนํ ํธ์ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค.
๊ฐ์ญ ํ๋กํ ์ฝ (Gossip Protocol) ์ด๋? :: Jins' Dev Inside (tistory.com)
4๊ฐ์ ๋
ธ๋๊ฐ ์๋๋ผ๋ ์๋ก๋ฅผ ๋ค ๋ฐ๋ผ๋ณด๊ณ ๋ค ์๋๊ฒ ์๋๋ผ, ๋ฌด์์์ ๋
ธ๋์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฐ์์ ์ผ๋ก ๋ ๋ฆฌ๋ฉด์ ์ฃผ๊ณ ๋ฐ์ ๋ฟ์ด๋ค.
์ํฌ๊ฐ ์ฒ ์์๊ฒ, ์ฒ ์๊ฐ ์ค๋ฏธ์ค์๊ฒ, ์๋ฌธ(Gossip)์ ํผํธ๋ฆฌ๋ฏ์ด ์ ๋ณด๊ฐ ์ ๋ฌ๋๋ค๊ณ ํด์ ๊ฐ์ญ ํ๋กํ ์ฝ์ด๋ผ ํ๋ค. ๊ฒฐ๊ตญ์๋ ์๋ฌธ์ด ๋ชจ๋ ์ฌ๋์ ๊ฑฐ์ณ๊ฐ๋ฏ๋ก ๋ฐ์ดํฐ ๋๊ธฐํ๋ ๋๊ฐ์ด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ก์ ์์ ์์ ์๊ฐ ๋ช ํํ๊ฒ ๊ฒฐํฉ๋์ด์์ง ์์ ์ด๋ฌํ ํต์ ๊ตฌ์กฐ ๋์ ๋ ธ๋์ ์ถ๊ฐ๋ ์ญ์ ๊ฐ ๋งค์ฐ ์ ์ฐํ ํธ์ด๋ค.
์ฌ์ฉํด๋ณด๊ธฐ
docker๋ฅผ ํตํด์ ํ ์คํธํ๊ฒฝ์ ํ๋ฒ ๋ง๋ค์ด๋ณด๊ฒ ๋ค.
์ด๋ฏธ์ง๋ฅผ ๋ฐ๊ณ , ๋คํธ์ํฌ ์ธํ ํ๊ณ , ๋ฐ๋ก ์คํํ๋ฉด ๋๋ค.
docker pull cassandra:latest
docker network create cassandra
docker run --rm -d --name cassandra --hostname cassandra --network cassandra cassandra

๊ทธ๋ฆฌ๊ณ ์ ์ปจํ ์ด๋์ ์ ์ํด์ cqlsh๋ฅผ ์คํํ๋ฉด, ๋ฐ๋ก ๋ํํ ์์ด ์ด๋ฆฐ๋ค.
docker exec -it ์ปจํ
์ด๋ํด์ bash
cqlsh
์ฌ๊ธฐ์ ์ฟผ๋ฆฌ ์ณ๋ณด๋ฉด์ ํ
์คํธ๋ฅผ ํ๋ฉด ๋๋ค.
ํค์คํ์ด์ค (keyspace)
ํค์คํ์ด์ค๋ ๋ค๋ฅธ RDB์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์คํค๋ง์ ๋น์ทํ ๋จ์๋ค.
ํ๋์ ํค์คํ์ด์ค์๋ ์ฌ๋ฌ๊ฐ์ ํ
์ด๋ธ์ด ๋ค์ด๊ฐ ์ ์๋ค.
๋ง๋๋ ๋ฒ์ ์ด๋ ต์ง ์๋ค.
์๋๋ ํค์คํ์ด์ค test_space๋ฅผ ๋ง๋๋ ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ค.
CREATE KEYSPACE IF NOT EXISTS test_space WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : '1' };

ํ ์ด๋ธ
ํ
์ด๋ธ์ ์ฌ๋ฌ๋ถ์ด ์๋ ๊ทธ ํ
์ด๋ธ ๋จ์๊ฐ ๋ง๋ค.
์๋์ ๊ฐ์ ํํ๋ก ๋ง๋ค ์ ์๋ค.
-- Create a table
CREATE TABLE IF NOT EXISTS test_space.item(
uuid text PRIMARY KEY,
item_name text,
item_price double,
last_update_timestamp timestamp
);


๊ทธ๋ฆฌ๊ณ ์ต์ํ SQL ๊ตฌ๋ฌธ์ ํตํด CRUD ์์
์ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ์ ํ 4๊ฐ๋ง ๋ฃ๊ณ ์กฐํํด๋ณด์.
insert into test_space.item(uuid, item_name, item_price, last_update_timestamp)
values
('c714d095-0a63-4c1f-921d-42abd954e2c1', 'buldak', 100.5, toTimeStamp(now()));
insert into test_space.item(uuid, item_name, item_price, last_update_timestamp)
values
('02773666-f483-4749-a3dd-c526e62daca2', 'eojuk', 4000, toTimeStamp(now()));
insert into test_space.item(uuid, item_name, item_price, last_update_timestamp)
values
('1f81911a-9a90-451c-8104-d6c9ff742588', 'gejang', 100.5, toTimeStamp(now()));
insert into test_space.item(uuid, item_name, item_price, last_update_timestamp)
values
('4c2fff64-a727-48a6-aa87-5af6079f2ead', 'john doe', 100.5, toTimeStamp(now()));
select * from test_space.item;
์ ๋๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ ๋ค.
์ฐธ์กฐ
๊ฐ์ญ ํ๋กํ ์ฝ (Gossip Protocol) ์ด๋? :: Jins' Dev Inside (tistory.com)
https://discord.com/blog/how-discord-stores-trillions-of-messages