ClickHouse๋ฅผ ์ฒ์ ์ ํ์ ๋ ๊ฐ์ฅ ํผ๋์ค๋ฌ์ ๋ ๊ฑด ์ฉ์ด์๋ค.
MySQL์ด๋ MariaDB์์๋ ๊ทธ๋ฅ ํ ์ด๋ธ ๋ง๋ค๊ณ ์ฟผ๋ฆฌ ๋ ๋ฆฌ๋ฉด ๋๋๋ฐ, ClickHouse๋ ์ฒ์๋ถํฐ "Shard", "Replica", "Distributed ํ ์ด๋ธ", "ZooKeeper"๊ฐ ํ์ด๋์จ๋ค. ์ฌ์ง์ด ํ ์ด๋ธ๋ ๋ ์ข ๋ฅ๊ฐ ์๋ค๊ณ ํ๋ค.
์ด ๊ธ์์๋ ClickHouse ํด๋ฌ์คํฐ๊ฐ ์ด๋ค ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋์ง, ๊ฐ ๊ฐ๋ ์ด ๋ฌด์จ ์ญํ ์ ํ๋์ง ํ ๋์ ์ดํดํ ์ ์๋๋ก ์ ๋ฆฌํด๋ณธ๋ค.
ClickHouse๋ ์ ํด๋ฌ์คํฐ ๊ตฌ์กฐ๋ฅผ ์ธ๊น?

ClickHouse๋ ๋์ฉ๋ ๋ถ์ ์ฟผ๋ฆฌ์ ์ต์ ํ๋ ์ปฌ๋ผํ DB๋ค. ์์ต ๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ง๊ณํ๋ ๊ฒ ์ฃผ ๋ชฉ์ ์ด๋ค ๋ณด๋, ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์๋ฒ์ ๋๋ ์ ์ฅํ๊ณ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ๊ฐ ๊ธฐ๋ณธ์ด ๋๋ค.
์ด๋ ๋ฑ์ฅํ๋ ๋ ๊ฐ์ง ํต์ฌ ๊ฐ๋ ์ด Shard์ Replica๋ค.
Shard - ๋ฐ์ดํฐ๋ฅผ ๋๋ ๊ฐ๋๋ค
Shard๋ ๋ฐ์ดํฐ๋ฅผ ์ํ์ผ๋ก ๋ถํ ํ๋ ๋จ์๋ค.

์๋ฅผ ๋ค์ด 1์ต ๊ฑด์ ๋ฐ์ดํฐ๊ฐ ์์ ๋, Shard 1์ 5์ฒ๋ง ๊ฑด, Shard 2์ 5์ฒ๋ง ๊ฑด์ ๋๋ ์ ์ฅํ๋ค. ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ฉด ๋ Shard๊ฐ ๋์์ ๊ฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ฐํ๋ค. ์๋ฒ๊ฐ 2๋๋ฉด ์ฒ๋ฆฌ ์๋๊ฐ 2๋ฐฐ์ ๊ฐ๊น์์ง๋ค.
์ ์ฒด ๋ฐ์ดํฐ 1์ต ๊ฑด
โโโ Shard 1 (์๋ฒ A): 5์ฒ๋ง ๊ฑด
โโโ Shard 2 (์๋ฒ B): 5์ฒ๋ง ๊ฑด
Shard๋ "์ฑ๋ฅ๊ณผ ์ฉ๋"์ ์ํ ๊ฐ๋ ์ด๋ค.
Replica - ๋๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ค
Replica๋ ๊ฐ์ Shard์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ์๋ฒ์ ๋ณต์ ํ ๊ฒ์ด๋ค. ์๋ฒ ํ๋๊ฐ ์ฃฝ์ด๋ ๋ฐ์ดํฐ๊ฐ ๋ ์๊ฐ์ง ์๋๋ก ํ๋ค.

Shard 1
โโโ ์๋ฒ A (Primary) - 5์ฒ๋ง ๊ฑด
โโโ ์๋ฒ B (Replica) - 5์ฒ๋ง ๊ฑด (A์ ๋ณต์ ๋ณธ)
Replica๋ "๊ฐ์ฉ์ฑ๊ณผ ์์ ์ฑ"์ ์ํ ๊ฐ๋ ์ด๋ค.
Shard๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋๋๋ ๊ฒ์ด๋ผ๋ฉด, Replica๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ด๋ค. ๋์ ๋ ๋ฆฝ์ ์ธ ๊ฐ๋ ์ด์ง๋ง ํจ๊ป ์ฐ์ธ๋ค.
ZooKeeper๋ ๋ฌด์จ ์ญํ ์ ํ๋?

Replica ๊ฐ ๋๊ธฐํ๋ฅผ ์กฐ์จํ๋ ์ฝ๋๋ค์ดํฐ๋ค. Primary์ ๋ฐ์ดํฐ๊ฐ ์ฐ์ด๋ฉด ZooKeeper๋ฅผ ํตํด Replica์ ๋ณต์ ์์ ์ด ํธ๋ฆฌ๊ฑฐ๋๋ค.
ํด๋ฌ์คํฐ DDL์ ์คํํ ๋๋ ZooKeeper๊ฐ ๊ฐ ๋ ธ๋์ ์์ ์ ๋ฐฐํฌํ๋ค.
๋ก์ปฌ ํ ์ด๋ธ vs Distributed ํ ์ด๋ธ
์ฌ๊ธฐ์ ํท๊ฐ๋ฆฌ๊ธฐ ์์ํ๋ค. ClickHouse์๋ ๊ฐ์ ์ด๋ฆ์ฒ๋ผ ๋ณด์ด๋ ํ ์ด๋ธ์ด ๋ ๋ฒ ์กด์ฌํ ์ ์๋ค.

๋ก์ปฌ ํ ์ด๋ธ (ReplicatedMergeTree)
๊ฐ ์๋ฒ(๋
ธ๋)์ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํ
์ด๋ธ์ด๋ค. ReplicatedMergeTree ์์ง์ ์ฌ์ฉํ๋ฉฐ, ZooKeeper๋ฅผ ํตํด ๊ฐ์ Shard ๋ด Replica๋ผ๋ฆฌ ์๋์ผ๋ก ๋๊ธฐํ๋๋ค.
-- local ์คํค๋ง์ ์์ฑ (๊ฐ ๋
ธ๋์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์กด์ฌ)
CREATE TABLE local.user_events_local (
event_date Date,
user_id UInt64,
event_type String,
created_at DateTime
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/user_events', '{replica}')
PARTITION BY toYYYYMMDD(event_date)
ORDER BY (event_date, user_id);
Distributed ํ ์ด๋ธ
๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ์ฅํ์ง ์๋๋ค. ๊ฐ Shard์ ๋ก์ปฌ ํ ์ด๋ธ์ ๊ฐ๋ฆฌํค๋ ๋ผ์ฐํฐ ์ญํ ๋ง ํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด ํ ์ด๋ธ์๋ง ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ฉด ๋๊ณ , ๋ด๋ถ์ ์ผ๋ก ์์์ ๊ฐ Shard๋ก ๋ถ์ฐ์์ผ ์ค๋ค.
-- ์คํค๋ง์ ์์ฑ (๋ผ์ฐํฐ ์ญํ )
CREATE TABLE default.user_events
ENGINE = Distributed('my_cluster', 'local', 'user_events_local', rand());
rand()๋ INSERT ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ Shard๋ก ๋ณด๋ผ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ์์ด๋ค. rand()๋ฅผ ์ฐ๋ฉด ๋ฌด์์๋ก ๋ถ์ฐ๋๋ค.
Distributed ํ ์ด๋ธ = ๋น ๊ป๋ฐ๊ธฐ. ๋ฐ์ดํฐ๋ ๋ก์ปฌ ํ ์ด๋ธ์๋ง ์๋ค.
์ ์ฒด ๊ตฌ์กฐ ํ๋์ ๋ณด๊ธฐ
์ ํ๋ฆฌ์ผ์ด์
โ
โผ
[default.user_events] ← Distributed ํ
์ด๋ธ (๋ผ์ฐํฐ)
โ โ
โผ โผ
[Shard 1] [Shard 2]
์๋ฒ A (Primary) ์๋ฒ C
์๋ฒ B (Replica) โ
โ โ โ
โโโโโโโโโดโโโโโโโโโโโโโ
โ
[ZooKeeper]
(๋ ํ๋ฆฌ์นด ๋๊ธฐํ)
| ๊ฐ๋ | ์ญํ | ํค์๋ |
|---|---|---|
| Shard | ๋ฐ์ดํฐ๋ฅผ ์ํ ๋ถํ | ์ฑ๋ฅ, ์ฉ๋ |
| Replica | ๋์ผ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ | ๊ฐ์ฉ์ฑ, ์์ ์ฑ |
| ๋ก์ปฌ ํ ์ด๋ธ | ์ค์ ๋ฐ์ดํฐ ์ ์ฅ (ReplicatedMergeTree) | ๋ฌผ๋ฆฌ ์ ์ฅ์ |
| Distributed ํ ์ด๋ธ | ์ฟผ๋ฆฌ ๋ถ์ฐ ๋ผ์ฐํฐ | ๋น ๊ป๋ฐ๊ธฐ |
| ZooKeeper | ๋ ํ๋ฆฌ์นด ๋๊ธฐํ ์กฐ์จ | ์ฝ๋๋ค์ดํฐ |
๋ง์น๋ฉฐ
์ฒ์์ "ํ ์ด๋ธ์ด ์ ๋ ๊ฐ์ผ?"๋ผ๋ ์๋ฌธ์์ ์ถ๋ฐํ๋๋ฐ, ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ๋๋ฉด ์คํ๋ ค ์์ฐ์ค๋ฝ๋ค. Distributed ํ ์ด๋ธ์ด ๋ผ์ฐํฐ ์ญํ ์ ๋ถ๋ฆฌํด์ค์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋ฌ์คํฐ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋ ๋๋ ์ค๊ณ๋ค.
๋ค๋ง ์ด ๊ตฌ์กฐ๋ฅผ ์ ๋๋ก ์ดํดํ์ง ์์ผ๋ฉด ์ค์ํ๊ธฐ ์ข์ ์ง์ ์ด ์๋ค. ๋ํ์ ์ธ ๊ฒ์ด DROP PARTITION์ Distributed ํ
์ด๋ธ์์ ์คํํ๋ ๊ฒฝ์ฐ์ธ๋ฐ, ์ด๊ฑด ๋ค์ ๊ธ์์ ๋ค๋ค๋ณผ ์์ ์ด๋ค.
'DB > ClickHouse' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Clickhouse ๋ฐ์ดํฐ ์ญ์ - ALTER DELETE vs DROP PARTITION (0) | 2026.03.31 |
|---|