created at 2022-08-02
์นด์ฐ๋๋ผ๋ ๋ํ์ ์ธ AP ์์คํ ์ ์ฌ์ฉํ๋ ๋ถ์ฐ DB ์ค ํ๋์ ๋๋ค
ํด๋น ๊ด๋ จ๊ธ์ ์ฐพ๋ ์์ค ์ ๋ง ๋ง์ ๋ฌธ์๊ฐ ์กด์ฌํ์ง๋ง, ํ๊ธํ๋ ๋ฌธ์๋ ์ฐพ์๋ณด๊ธฐ ์ด๋ ค์ ์ต๋๋ค.
๋ฐ๋ผ์ ์ด ๊ธฐํ๋ฅผ ๋น์ด ์นด์ฐ๋๋ผ๋ฅผ ์์ธํ๊ฒ ์ ๋ฆฌํด๋ณผ๊น ํฉ๋๋ค.
(์๋ก ) ๋จผ์ ์ ์ฐ๋ฆฌ๋ ์นด์ฐ๋๋ผ๋ฅผ ์์์ผํ ๊น์?
ํ์์ RDB๋ฅผ ์์ฃผ ์ฌ์ฉํ์ ๋ถ๋ค์ ์๋์ ๊ฐ์ ๋ถ๋ถ๋ค์์ ์ด๋ ค์์ ๋๊ผ์๊ฑฐ์์.
- DB๋ฅผ ์ํ์ ์ผ๋ก ํ์ฅํ๊ธฐ ํ๋ ๊ตฌ์กฐ
- ์ ํด์ง ์คํค๋ง๋ง ์ฌ์ฉํ ์ ์์
- READ/WRITE๊ฐ ๋๋ฆผ
- ๋ฐ์ดํฐ ํน์ฑ์ ๊ณ ๋ คํ๊ธฐ ํ๋ฌ
- ์ฅ์ ๋์
๊ทธ๋์ ์นด์ฐ๋๋ผ๋ ์์ ๋ถ๋ถ๋ค์ ์๋์ ๊ฐ์ด ๊ณ ๋ คํ์ฌ ์ค๊ณ๋์์ต๋๋ค.
- DB๋ฅผ ์ํ์ ์ผ๋ก ์ถ๊ฐํ๊ธฐ ์ฌ์
- ์ ํด์ง ์คํค๋ง ์ด์ธ์ ์ถ๊ฐ๊ฐ๋ฅ
- ๋น ๋ฅธ READ/WRITE
- ๋ฐ์ดํฐ์ ์ง์ญ์ ์ธ ํน์ฑ ๊ณ ๋ ค
- replica๋ฅผ ํตํ ์ฅ์ ๋์ ์ฉ์ด
์ถ๊ฐ์ ์ผ๋ก ์๋๋ํ ๊ณ ๋ คํ๋ต๋๋ค.
- AP ์์คํ ์ด์ง๋ง, ์ฌ์ฉ์๋ฅผ ์ํ Consistency ๋ ๋ฒจ์ ์ถ๊ฐ์ ์ผ๋ก ์ค์ ๊ฐ๋ฅ
(์๋ก ) ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ์๋น์ค๊ฐ ์นด์ฐ๋๋ผ๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์๊น์?
- ๋ฐ์ดํฐ์ ์์/์ ํฉ์ฑ์ ๊ฒ์ฆํ ํ์๊ฐ ์์ ๊ฒฝ์ฐ( ex) ํธ์ํฐ ๊ฒ์๋ฌผ ์ ๋ก๋ )
- row ๋ณ ๋ค์ํ ์ปฌ๋ผํํ๊ฐ ํ์ํ ๋( ์ฆ ํ
์ด๋ธ ๋ด ์นผ๋ผ๋ค์ด ๋ง๊ณ , ๊ฐ row๋ค์ ์นผ๋ผ๋ค์ ๋ถ๋ถ์ ์ผ๋ก ๋ฝ์์ ์ฌ์ฉํ ๋ )
- ์ํ์ ์ผ๋ก ํ์ฅ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๊ฐ ํ์ํ ๋
- ๋ณด์กฐ INDEX๊ฐ ํ์ํ์ง ์๋ ๊ฒฝ์ฐ
์นด์ฐ๋๋ผ๋ฅผ ์ค๋ช ํ๊ธฐ์ ์์ ๋จผ์ RDB์ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ๊ตญ๊ฐ๋ณ ์ ์ ์ด๋ฆ์ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ ์์๋ก ๋ง์๋๋ฆด๊ฒ์.
1. ๊ธฐ์กด Relational DB
country | id(Primary Key) | name |
---|---|---|
USA | 1 | John |
USA | 2 | Ann |
KOR | 3 | Kim |
KOR | 4 | HWANG |
์์ ํ ์ด๋ธ์ ๋ง๋ค๊ธฐ ์ํด์๋ ์๋์ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
- ํ
์ด๋ธ ์์ฑ
CREATE TABLE user (country varchar, id int, name varchar, PRIMARY KEY (id));
- ๋ฐ์ดํฐ ์ฝ์
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 ์ค์น์ ์คํ
- ๋จผ์ ๋ณต์กํ install ํ์์์ด
docker pull cassandra:latest
์ terminal์์ ์คํํด์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ์์ฃผ์ธ์. docker run --name cass_cluster cassandra:latest
์ผ๋ก cass_cluster ์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์คํํด์ฃผ์ธ์.docker exec -it cass_cluster /bin/bash
๋ก ์คํ๋ ์ปจํ ์ด๋ ๋ด ํฐ๋ฏธ๋์ ๋์์ฃผ์ธ์.- ํฐ๋ฏธ๋ ๋ด,
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. ์นด์ฐ๋๋ผ ๋ ธ๋์ ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋๋ ๊ณผ์
์ด์ ์ ์ฐ๋ฆฌ๋ ์์ ์ ๋์ผํ ํ ์ด๋ธ์ ๋ง๋ค์์ต๋๋ค. ์ด์ ๋ฐ์ดํฐ์ 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 ์ ๋ต์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด, ๋ฐ์ดํฐ ์ผํฐ ๋ณ ๋ณต์ ๊ณ์๋ฅผ ์ค์ ํด์ผํ๋๋ฐ์. ์ฌ๊ธฐ์ ๋ฐ์ดํฐ ์ผํฐ๋ ๋ฌด์์ผ๊น์?
- 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.