Skip to main content Link Menu Expand (external link) Document Search Copy Copied

created at 2022-08-02

์นด์‚ฐ๋“œ๋ผ๋Š” ๋Œ€ํ‘œ์ ์ธ AP ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ถ„์‚ฐ DB ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค

ํ•ด๋‹น ๊ด€๋ จ๊ธ€์„ ์ฐพ๋˜ ์™€์ค‘ ์ •๋ง ๋งŽ์€ ๋ฌธ์„œ๊ฐ€ ์กด์žฌํ–ˆ์ง€๋งŒ, ํ•œ๊ธ€ํ™”๋œ ๋ฌธ์„œ๋Š” ์ฐพ์•„๋ณด๊ธฐ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๊ธฐํšŒ๋ฅผ ๋นŒ์–ด ์นด์‚ฐ๋“œ๋ผ๋ฅผ ์ƒ์„ธํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค.

(์„œ๋ก ) ๋จผ์ € ์™œ ์šฐ๋ฆฌ๋Š” ์นด์‚ฐ๋“œ๋ผ๋ฅผ ์•Œ์•„์•ผํ• ๊นŒ์š”?

ํ‰์†Œ์— RDB๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜์‹  ๋ถ„๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ถ€๋ถ„๋“ค์—์„œ ์–ด๋ ค์›€์„ ๋Š๊ผˆ์„๊ฑฐ์—์š”.

  1. DB๋ฅผ ์ˆ˜ํ‰์ ์œผ๋กœ ํ™•์žฅํ•˜๊ธฐ ํž˜๋“  ๊ตฌ์กฐ
  2. ์ •ํ•ด์ง„ ์Šคํ‚ค๋งˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  3. READ/WRITE๊ฐ€ ๋Š๋ฆผ
  4. ๋ฐ์ดํ„ฐ ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜๊ธฐ ํž˜๋“ฌ
  5. ์žฅ์• ๋Œ€์‘

๊ทธ๋ž˜์„œ ์นด์‚ฐ๋“œ๋ผ๋Š” ์œ„์˜ ๋ถ€๋ถ„๋“ค์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ณ ๋ คํ•˜์—ฌ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. DB๋ฅผ ์ˆ˜ํ‰์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฌ์›€
  2. ์ •ํ•ด์ง„ ์Šคํ‚ค๋งˆ ์ด์™ธ์— ์ถ”๊ฐ€๊ฐ€๋Šฅ
  3. ๋น ๋ฅธ READ/WRITE
  4. ๋ฐ์ดํ„ฐ์˜ ์ง€์—ญ์ ์ธ ํŠน์„ฑ ๊ณ ๋ ค
  5. replica๋ฅผ ํ†ตํ•œ ์žฅ์• ๋Œ€์‘ ์šฉ์ด

์ถ”๊ฐ€์ ์œผ๋กœ ์•„๋ž˜๋˜ํ•œ ๊ณ ๋ คํ•œ๋‹ต๋‹ˆ๋‹ค.

  • AP ์‹œ์Šคํ…œ์ด์ง€๋งŒ, ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ Consistency ๋ ˆ๋ฒจ์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์„ค์ •๊ฐ€๋Šฅ

(์„œ๋ก ) ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ์„œ๋น„์Šค๊ฐ€ ์นด์‚ฐ๋“œ๋ผ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ์š”?

  • ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ/์ •ํ•ฉ์„ฑ์„ ๊ฒ€์ฆํ•  ํ•„์š”๊ฐ€ ์—†์„ ๊ฒฝ์šฐ( ex) ํŠธ์œ„ํ„ฐ ๊ฒŒ์‹œ๋ฌผ ์—…๋กœ๋“œ )
  • row ๋ณ„ ๋‹ค์–‘ํ•œ ์ปฌ๋Ÿผํ˜•ํƒœ๊ฐ€ ํ•„์š”ํ•  ๋•Œ( ์ฆ‰ ํ…Œ์ด๋ธ” ๋‚ด ์นผ๋Ÿผ๋“ค์ด ๋งŽ๊ณ , ๊ฐ row๋“ค์€ ์นผ๋Ÿผ๋“ค์„ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ฝ‘์•„์„œ ์‚ฌ์šฉํ•  ๋•Œ )

    NF

  • ์ˆ˜ํ‰์ ์œผ๋กœ ํ™•์žฅ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๊ฐ€ ํ•„์š”ํ•  ๋•Œ
  • ๋ณด์กฐ INDEX๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

์นด์‚ฐ๋“œ๋ผ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ์— ์•ž์„œ ๋จผ์ € RDB์™€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ๊ตญ๊ฐ€๋ณ„ ์œ ์ € ์ด๋ฆ„์„ ๊ด€๋ฆฌํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ์˜ˆ์‹œ๋กœ ๋ง์”€๋“œ๋ฆด๊ฒŒ์š”.

1. ๊ธฐ์กด Relational DB

countryid(Primary Key)name
USA1John
USA2Ann
KOR3Kim
KOR4HWANG

์œ„์˜ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์˜ ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ…Œ์ด๋ธ” ์ƒ์„ฑ
    CREATE TABLE user (country varchar, id int, name varchar, PRIMARY KEY (id));
    
  2. ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
    INSERT INTO user VALUES ('USA', 1, 'John');
    

1-1. Relational DB์˜ ๋ถ€์กฑํ•œ ์ 

RDB์˜ ๋ถ€์กฑํ•œ ์ ์€ ๋ฌด์—‡์ผ๊นŒ์š”? ์ด์ „์—๋„ ๋ง์”€๋“œ๋ ธ๋˜ ๋ถ€๋ถ„์„ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ •ํ•ด์ง„ ์Šคํ‚ค๋งˆ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ
    • user ํ…Œ์ด๋ธ”์— name์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ๋„ฃ๋Š”๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋„ฃ๊ฒŒ ๋˜๋”๋ผ๋„ null๋กœ ๋„ฃ์–ด์•ผ๊ฒ ์ฃ ?
  • ๋ฐ์ดํ„ฐ ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ํ™•์žฅ
    • USA ์— ๋งŽ์€ ์ด๋ฆ„์ด ๋ชฐ๋ฆด ๊ฒฝ์šฐ DB๋ฅผ ์ˆ˜์ง์ ์œผ๋กœ ๋Š˜๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ KOR์„ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„๋˜ํ•œ ๋Š˜์–ด๋‚˜๋Š”๋ฐ์š”. ์ด๋Š” ๋ถˆํ•„์š”ํ•œ ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ์ฆ‰ ์ €๋Š” country ๋ณ„๋กœ DB๋ฅผ ํ™•์žฅํ•˜๊ณ  ์‹ถ์ง€๋งŒ, ์œ„์˜ ์Šคํ‚ค๋งˆ๋ฅผ ๊ฐ€์ง€๋Š” RDB๋ผ๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ์˜ ์ง€์—ญ์„ฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์Œ
    • ์ €๋Š” USA ์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ฏธ๊ตญ์— ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๋ฅผ ๋”ฐ๋กœ ๋‘ ์œผ๋กœ์จ ์กฐ๊ธˆ ๋” ์ ‘๊ทผ์ด ๋น ๋ฅด๋„๋ก ์„ค์ •ํ•˜๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์€ RDB์˜ ๊ฒฝ์šฐ ํ•œ๊ณณ์—์„œ๋งŒ ๊ด€๋ฆฌํ•ด์•ผ๋˜๊ฒ ์ฃ ? ํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ํ…Œ์ด๋ธ”์„ ๋ถ„๋ฆฌํ•ด์•ผ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ๊ณณ์— DB๋ฅผ ๋”ฐ๋กœ ๋–ผ์„œ ์„ค์ •ํ•ด์•ผํ•˜๋Š” ๋งŒํผ, ์œ ์ง€๊ด€๋ฆฌ๊ฐ€ ํž˜๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

2. Cassandra

์นด์‚ฐ๋“œ๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ๋…ธ๋“œ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์ด ๋…ธ๋“œ๋“ค์€ ๋ง์˜ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ READ/WRITE ์‹œ, ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•Œ๋งž๋Š” ๋…ธ๋“œ์— ๋ถ„์‚ฐ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์…‹์—…๊ณผ ์นด์‚ฐ๋“œ๋ผ์˜ ๊ตฌ์กฐ๋ฅผ ์ด์ œ๋ถ€ํ„ฐ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

2-1. ์˜ˆ์ œ ์…‹์—…

2-1-1. Cassandra ์„ค์น˜์™€ ์‹คํ–‰

  1. ๋จผ์ € ๋ณต์žกํ•œ install ํ•„์š”์—†์ด docker pull cassandra:latest ์„ terminal์—์„œ ์‹คํ–‰ํ•ด์„œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋ฐ›์•„์ฃผ์„ธ์š”.
  2. docker run --name cass_cluster cassandra:latest ์œผ๋กœ cass_cluster ์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”.
  3. docker exec -it cass_cluster /bin/bash๋กœ ์‹คํ–‰๋œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด ํ„ฐ๋ฏธ๋„์„ ๋„์›Œ์ฃผ์„ธ์š”.
  4. ํ„ฐ๋ฏธ๋„ ๋‚ด, notetool status ๋กœ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณด์ผ๊ฑฐ์—์š”.
  root@b5dd67bd786f:/etc/cassandra# nodetool status
  Datacenter: datacenter1
  =======================
  Status=Up/Down
  |/ State=Normal/Leaving/Joining/Moving
  --  Address     Load       Tokens  Owns (effective)  Host ID                               Rack
  UN  172.17.0.2  117.4 KiB  16      100.0%            b1ce1dd2-5f53-41a0-a10b-2cd1227f1f8b  rack1

๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์™€ ํ•˜๋‚˜์˜ ๋ž™, ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ๋‹จ์ผ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. Tokens๋‚˜ Owns๋Š” ๋”ฐ๋กœ ๋‚˜์ค‘์— ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2-1-2. CQL ๋ฌธ ์ž‘์„ฑ

์นด์‚ฐ๋“œ๋ผ๋Š” CQL์ด๋ผ๋Š” ๋ฌธ๋ฒ•์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” SQL ๋ฌธ๋ฒ•๊ณผ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•ด์š”. ์•„๋ž˜์™€ ๊ฐ™์ด cqlsh์— ์ ‘์†ํ•ด์„œ ์ฐจ๊ทผ์ฐจ๊ทผ ์˜ˆ์ œ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ํ„ฐ๋ฏธ๋„์—์„œ cqlsh ๋ฅผ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”
root@b5dd67bd786f:/etc/cassandra# cqlsh
Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.1.0 | Cassandra 4.1.0 | CQL spec 3.4.6 | Native protocol v5]
...

2. cqlsh ๋‚ด๋ถ€์—์„œ KEY SPACE๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”
๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด, KEY SPACE๋Š” ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ์ง‘ํ•ฉ์ด๋ฉฐ ๋ณต์ œ์ „๋žต์„ ์ •์˜ํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
์ž์„ธํ•œ ์„ค๋ช…์€ ์ดํ›„์— ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.   
cqlsh> CREATE KEYSPACE my_keyspace WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1':1} AND durable_writes = 'true';
cqlsh> DESCRIBE KEYSPACES
my_keyspace  system_auth         system_schema  system_views         
system       system_distributed  system_traces  system_virtual_schema

3. USE๋กœ KEY SPACE๋ฅผ ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”
cqlsh> USE my_keyspace;

4. KEY SPACE์— ์ ‘์†ํ•œ ์ดํ›„, ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์„ธ์š”
cqlsh:my_keyspace> CREATE TABLE user ( country text, id int, name text, PRIMARY KEY(country, id));
5. DESCRIBE๋กœ ์ „์ฒด ํ…Œ์ด๋ธ”์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
cqlsh:my_keyspace> DESCRIBE TABLES;
user

6. SELECT๋กœ ํ…Œ์ด๋ธ”์„ ํ™•์ธํ•˜์„ธ์š”.
cqlsh:my_keyspace> SELECT * FROM user;
 country | id | name
---------+----+------
(0 rows)

7. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”
cqlsh:my_keyspace> INSERT INTO user (country, id, name) VALUES ('USA',1,'John');
cqlsh:my_keyspace> INSERT INTO user (country, id, name) VALUES ('USA',2,'Ann');
cqlsh:my_keyspace> INSERT INTO user (country, id, name) VALUES ('KOR', 3, 'Kim');
cqlsh:my_keyspace> INSERT INTO user (country, id, name) VALUES ('KOR', 4, 'Hwang');
cqlsh:my_keyspace> SELECT * FROM user;
 country | id | name
---------+----+-------
     KOR |  3 |   Kim
     KOR |  4 | Hwang
     USA |  1 |  John
     USA |  2 |   Ann
(4 rows)

2-2. ์นด์‚ฐ๋“œ๋ผ์˜ ๊ตฌ์กฐ

2-2-1. ์นด์‚ฐ๋“œ๋ผ ๋…ธ๋“œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฝ์ž…๋˜๋Š” ๊ณผ์ •

img

์ด์ „์— ์šฐ๋ฆฌ๋Š” ์˜ˆ์ œ์™€ ๋™์ผํ•œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ฐ์ดํ„ฐ์˜ READ/WRITE ๋ฐฉ์‹์„ ์ž์„ธํžˆ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด์ „ ์„ค๋ช…์—์„œ ์นด์‚ฐ๋“œ๋ผ๋Š” ๋…ธ๋“œ๋ฅผ ๋ง์˜ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ƒ์„ธํžˆ ๋งํ•˜๋ฉด ๋ง์€ TOKEN์ด๋ผ๋Š” ๋‹จ์œ„๋กœ ๋‚˜๋‰˜๋ฉฐ, ๊ฐ ๋…ธ๋“œ๋“ค์€ ์ผ์ • ๋ฒ”์œ„์˜ ํ† ํฐ๋“ค์„ ๋งก๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

2-2-2. ์นด์‚ฐ๋“œ๋ผ ํ† ํฐ ์ƒ์„ฑ ๋ฐฉ์‹

๋ฐ์ดํ„ฐ๋“ค์€ ์ž์‹ ๋งŒ์˜ ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ† ํฐ์€ Partition Key ๊ฐ€ Hash ํ™” ๋œ ๊ฒƒ์„ ๋ช…์นญํ•ฉ๋‹ˆ๋‹ค. TOKEN = HASH(Partition Key).

์˜ˆ์‹œ์™€ ํ•จ๊ณ„ ์„ค๋ช…ํ•ด๋ณผ๊นŒ์š”?

Partition Key๋Š” Hash Function์„ ์ง€๋‚˜ TOKEN์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š”๋ฐ์š”. ์œ„์˜ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ๋Š” โ€˜USAโ€™(Partition Key)๋Š” 65(TOKEN)๋กœ ๋ณ€ํ™˜๋˜์ฃ . ๊ทธ๋ฆฌ๊ณ  65(TOKEN)์€ ํ† ํฐ์˜ 60 ~ 69๋ฅผ ๋งก๊ณ ์žˆ๋Š” ๋…ธ๋“œ7์— ๋ฐฐ์ •๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Partition Key๋กœ ์ธํ•ด ๋…ธ๋“œ7์— READ/WRITE๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ .

์ฆ‰ ์ •๋ฆฌํ•˜๋ฉด, ์นด์‚ฐ๋“œ๋ผ๋Š” ๋ฐ์ดํ„ฐ๋งˆ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Partition Key๋ฅผ ํ†ตํ•ด ์–ด๋Š ๋…ธ๋“œ์— READ/WRITE ํ•  ์ง€ ์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ ์นด์‚ฐ๋“œ๋ผ๋Š” Partition Key ์— ์˜ํ•ด ๋ชจ๋“  ์ฟผ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. SELECT ๋ฌธ์œผ๋กœ John์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ์‚ฌ์šฉ์ž์˜ ๊ตญ๊ฐ€๋ฅผ ์ฟผ๋ฆฌํ•ด๋ณผ๊นŒ์š”?

cqlsh:my_keyspace> SELECT * FROM user WHERE name='John';
InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING"

์œ„์˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ, ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋Š”, ์• ์ดˆ์— ์œ„์˜ ์ฟผ๋ฆฌ๋ฅผ ์–ด๋””์˜ ๋…ธ๋“œ์—์„œ ์ˆ˜ํ–‰ํ•  ์ง€ ๋ชจ๋ฅด๊ธฐ ๋–„๋ฌธ์ž…๋‹ˆ๋‹ค

๋Œ€์‘๋ฐฉ๋ฒ•์œผ๋กœ๋Š” name ๊ธฐ๋ฐ˜ ์ธ๋ฑ์‹ฑ์„ ๋”ฐ๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฉฐ, ์นด์‚ฐ๋“œ๋ผ์—์„œ๋Š” 2-4. MATERIALIZED VIEW๋กœ ์ƒˆ๋กœ์šด ๋ทฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ™œ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

2-2-3. ํ‚ค์˜ ์ข…๋ฅ˜

์ด์ „ ์šฐ๋ฆฌ๋Š” Partition Key๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋…ธ๋“œ์˜ ์œ„์น˜๋ฅผ ํŠน์ •์ง€์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์นด์‚ฐ๋“œ๋ผ๋Š” Partition Key ์ด์™ธ, Composite Key ์™€ Clustering Key ์ด ๋‘๊ฐ€์ง€๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ์š”.

  • ๋จผ์ € Composite Key๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์นผ๋Ÿผ์„ Partition Key๋กœ ๋ฌถ์–ด์ฃผ๋Š” ํ‚ค ์ž…๋‹ˆ๋‹ค.

    CREATE TABLE user ( country text, id int, name text, 
        PRIMARY KEY( 
            (country, id),
            name 
        )
    );
    
  • Clustering Key๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๋‹น ํ‚ค๋กœ ์ •๋ ฌํ•ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    ๊ธฐ์กด ์˜ˆ์ œ์— DESCRIBE user์„ ํ†ตํ•ด ํ•œ๋ฒˆ ๊ด€์ฐฐํ•ด๋ณผ๊นŒ์š”?

    cqlsh:my_keyspace> DESCRIBE user;
      
    CREATE TABLE my_keyspace.user (
        country text,
        id int,
        name text,
        PRIMARY KEY (country, id)
    ) WITH CLUSTERING ORDER BY (id ASC) <-- ๋™์ผ ํŒŒํ‹ฐ์…˜ ๋‚ด id ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ
        ...
    

    ์•ž์„œ ์šฐ๋ฆฌ๋Š” CREATE TABLE ... PRIMARY KEY(country, id);๋กœ ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ PRIMARY KEY(first arg, args) ์˜ first arg์ธ country๋Š” Partition Key๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์ง€์ •ํ•˜๋Š” argument๋“ค์€ ์ „๋ถ€ Clustering Key๋กœ ์ง€์ •๋˜๋Š”๋ฐ์š”. ์—ฌ๊ธฐ์„œ๋Š” id๊ฐ€ Clustering Key๋กœ ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ๋ณด๋ฉด ORDER BY๊ฐ€ ๋ถ™์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ Partition Key ๋‚ด, id๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ . ๊ทธ๋ ‡๋‹ค๋ฉด ์ •๋ง ์ •๋ ฌ๋˜์–ด์žˆ๋Š”์ง€, SELECT ๋กœ ๊ด€์ฐฐํ•ด๋ณผ๊นŒ์š”?

    cqlsh:my_keyspace> SELECT * FROM user;
    country | id | name
    ---------+----+-------
    KOR |  3 |   Kim
    KOR |  4 | Hwang
    USA |  1 |  John
    USA |  2 |   Ann
    (4 rows)
    

    KOR ์ด๋ผ๋Š” ๋™์ผ ํŒŒํ‹ฐ์…˜ ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ๋‚ด๋ถ€์—์„œ๋Š” id์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ •๋ ฌ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” USA ํŒŒํ‹ฐ์…˜์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ฃ !

2-2-4. ์นด์‚ฐ๋“œ๋ผ ๋ณต์ œ๋ณธ ์ „๋žต

์ง€๊ธˆ๊นŒ์ง€ ๊ณผ์ •์„ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์นด์‚ฐ๋“œ๋ผ๋Š” ๋…ธ๋“œ๋ฅผ ๋ง์˜ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•˜๋ฉฐ, ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋Š” ์ž์‹ ์˜ Partition Key๋ฅผ ํ•ด์‹œํ™”ํ•˜์—ฌ ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ํ† ํฐ์€ ํ•ด๋‹น๋˜๋Š” ๋…ธ๋“œ์™€ ๋งค์นญ๋˜๋ฉฐ, ํ•ด๋‹น ๋…ธ๋“œ์— ๋ฐ์ดํ„ฐ๊ฐ€ READ/WRITE ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ํŠน์ • ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ๋‹น์—ฐํ•œ ๋ง์ด์ง€๋งŒ, ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๊ฒ ์ฃ .

์นด์‚ฐ๋“œ๋ผ๋Š” ํ•˜๋‚˜์˜ ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์„œ๋น„์Šค ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณต์ œ๋ณธ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์•ž์„œ ์šฐ๋ฆฌ๋Š” KEY SPACE ๋ฅผ ๋งŒ๋“ค์—ˆ์ฃ ? ์ด KEY SPACE ๋Š” ๋ณต์ œ๋ณธ์„ ๋ช‡ ๊ฐœ ์„ค์ •ํ•ด์ฃผ๋Š”์ง€ ์ •์˜ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค!

CREATE KEYSPACE my_keyspace WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1':1} AND durable_writes = 'true';

์—ฌ๊ธฐ์„œ ์ฒ˜์Œ ๋ณด๋Š” ๋‹จ์–ด๊ฐ€ ์žˆ์ฃ . 'class': 'NetworkTopologyStrategy' ์™€ 'datacenter1':1 ์ž…๋‹ˆ๋‹ค.

์นด์‚ฐ๋“œ๋ผ๋Š” ๋ณต์ œ ์ „๋žต์„ ๋‘ ๊ฐ€์ง€ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • SimpleStrategy: ์˜ค์ง ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์™€ ํ•˜๋‚˜์˜ ๋ž™, ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ™์€ ๋…ธ๋“œ ๋‚ด์—์„œ ๋ณต์ œ๋ณธ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด์ฃ . ์ด ์ „๋žต์„ ํ†ตํ•ด ๊ตฌ์„ฑํ•˜๋Š” ๋ณต์ œ๋ณธ์€ ์‚ฌ์‹ค์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ์žฅ์•  ์‹œ ๋ณต์ œ๋ณธ ๋˜ํ•œ ์“ธ๋ชจ์—†์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
  • NetworkTopologyStrategy: ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์™€ ๋ž™, ๋…ธ๋“œ๋ฅผ ์šด์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๊ฑธ์ณ ๋ณต์ œ๋ณธ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด์ฃ . Highly recommended!

๊ทธ๋ฆฌ๊ณ  NetworkTopologyStrategy ์ „๋žต์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ ์„ผํ„ฐ ๋ณ„ ๋ณต์ œ๊ณ„์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผํ•˜๋Š”๋ฐ์š”. ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

img

  • Data Center : Rack์˜ ์ง‘ํ•ฉ
  • Rack : ๋…ธ๋“œ์˜ ์ง‘ํ•ฉ

(์ž‘์„ฑ์ค‘)

2-3. MATERIALIZED VIEW

MATERIALIZED VIEW๋Š” ํ…Œ์ด๋ธ”์„ ์ƒˆ๋กญ๊ฒŒ ์ธ๋ฑ์‹ฑํ•œ ๋ทฐ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์›๋ณธ ํ…Œ์ด๋ธ”์— ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด, MATERIALIZED VIEW ๋˜ํ•œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์œผ๋กœ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค!

์ด ๋ทฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๋ง์”€๋“œ๋ฆด๊ฒŒ์š”.

2-3-1. MATERIALIZED VIEW ์„ค์ •

์ด๋ฅผ ์œ„ํ•ด์„  ๋จผ์ € cassandra.yaml ์„ค์ •ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์ปจํ…Œ์ด๋„ˆ์— vim์„ ์„ค์น˜ํ•ด์•ผ๊ฒŸ์ฃ  ใ…œใ…œโ€ฆ ๋˜ ์ด๋ฅผ ์œ„ํ•ด์„  ๋จผ์ € apt๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

apt-get update
apt-get install apt-file
apt-file update
apt-get install vim

vim์œผ๋กœ etc/cassandra/cassandra.yaml ์„ ์—ด์–ด์ฃผ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  vim ๋‚ด์—์„œ /materialized_views_enabled๋กœ materialized_views_enabled๋ฅผ ์ฐพ๊ณ  ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด์„ธ์š”.(์ดํ›„ ์•ž ๋’ค๋กœ ์ฐพ๋Š” ๊ฒƒ์€ n, N์œผ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค)

...
# Enables materialized view creation on this node.
# Materialized views are considered experimental and are not recommended for production use.
materialized_views_enabled: true <- ์ด ๋ถ€๋ถ„์„ true๋กœ ๋ฐ”๊ฟ”์ฃผ์„ธ์š”!
...

2-3-2. MATERIALIZED VIEW ์ƒ์„ฑ ๋ฐ ํ™•์ธ

1. ๊ฐ™์€ key_space ๋‚ด ์›ํ•˜๋Š” ๋ทฐ ์ด๋ฆ„์„ ์ ๊ณ , name์„ Partition Key๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
cqlsh:my_keyspace> CREATE MATERIALIZED VIEW my_keyspace.new_table AS SELECT * FROM my_keyspace.user WHERE name IS NOT NULL AND country IS NOT NULL AND id IS NOT NULL PRIMARY KEY(name, country, id);

cqlsh:my_keyspace> SELECT * FROM my_keyspace.new_table;
 name  | country | id
-------+---------+----
  John |     USA |  1
   Ann |     USA |  2
   Kim |     KOR |  3
 Hwang |     KOR |  4
(4 rows)

cqlsh:my_keyspace> SELECT * FROM my_keyspace.new_table WHERE name='John';
 name | country | id
------+---------+----
 John |     USA |  1
(1 rows)

cqlsh:my_keyspace> SELECT * FROM user;
 country | id | name
---------+----+-------
     KOR |  3 |   Kim
     KOR |  4 | Hwang
     USA |  1 |  John
     USA |  2 |   Ann
(4 rows)

cqlsh:my_keyspace> INSERT INTO user VALUES('KOR',5,'John');
SyntaxException: line 1:17 no viable alternative at input 'VALUES' (INSERT INTO [user] VALUES...)

cqlsh:my_keyspace> INSERT INTO user (country, id, name) VALUES('KOR',5,'John');

cqlsh:my_keyspace> SELECT * FROM user;
 country | id | name
---------+----+-------
     KOR |  3 |   Kim
     KOR |  4 | Hwang
     KOR |  5 |  John
     USA |  1 |  John
     USA |  2 |   Ann
(5 rows)

cqlsh:my_keyspace>  SELECT * FROM my_keyspace.new_table WHERE name='John';
 name | country | id
------+---------+----
 John |     KOR |  5
 John |     USA |  1
(2 rows)

cqlsh> CONSISTENCY; Current consistency level is ONE.

Reference