[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