ClickHouse ํด๋ฌ์คํฐ๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ๋นํฉ์ค๋ฝ๋ค.
๋ถ๋ช
ํ ํน์ ๋ ์ง ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋๋ฐ, ์กฐํํด๋ณด๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฌ์ ํ ๋จ์์๋ค. ๋ถ๋ช
DROP PARTITION์ ์คํํ๋๋ฐ. ์๊ณ ๋ณด๋ฉด ์ญ์ ๋ ๊ฑด ํด๋ฌ์คํฐ ์ ์ฒด๊ฐ ์๋๋ผ ์ผ๋ถ Shard์ ๋ฐ์ดํฐ๋ฟ์ด๋ค.
์ด ๊ธ์์๋ ์ ์ด๋ฐ ์ผ์ด ์๊ธฐ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ํด์ผ ํด๋ฌ์คํฐ ์ ์ฒด์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉํ ์ ์๋์ง ์ ๋ฆฌํ๋ค.
๋ฐฐ๊ฒฝ: Distributed ํ ์ด๋ธ์ ๋ผ์ฐํฐ๋ค
์์ ๊ธ์์ ๋ค๋ค์ง๋ง ๋ค์ ์ง๊ณ ๋์ด๊ฐ์.
ClickHouse ํด๋ฌ์คํฐ์์ ํ ์ด๋ธ์ ๋ ๋ฒ์ด๋ค.
default.user_events ← Distributed ํ
์ด๋ธ (๋ผ์ฐํฐ, ๋ฐ์ดํฐ ์์)
local.user_events_local ← ๋ก์ปฌ ํ
์ด๋ธ (์ค์ ๋ฐ์ดํฐ ์ ์ฅ)

์ ํ๋ฆฌ์ผ์ด์
์ ๋ณดํต default.user_events (Distributed ํ
์ด๋ธ)๋ง ๋ฐ๋ผ๋ณธ๋ค. SELECT, INSERT ๋ชจ๋ ์ฌ๊ธฐ๋ก ๋ ๋ฆฌ๋ฉด ๋ด๋ถ์ ์ผ๋ก ๊ฐ Shard๋ก ๋ถ์ฐ๋๋ค.
๋ฌธ์ ๋ DDL ๋์์ด SELECT/INSERT์ ๋ค๋ฅด๋ค๋ ์ ์ด๋ค.
๋ฌด์จ ์ผ์ด ์ผ์ด๋๋๊ฐ?
Distributed ํ
์ด๋ธ์์ DROP PARTITION์ ์คํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
-- Distributed ํ
์ด๋ธ์์ ์คํ
ALTER TABLE default.user_events
DROP PARTITION '20260318';
์ง๊ด์ ์ผ๋ก๋ ํด๋ฌ์คํฐ ์ ์ฒด์์ ํด๋น ๋ ์ง ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ ๊ฒ ๊ฐ๋ค.
ํ์ง๋ง ์ค์ ๋ก๋ ์ฟผ๋ฆฌ๋ฅผ ์์ ํ ๋ ธ๋ ํ๋์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์ญ์ ๋๋ค.
ํด๋ฌ์คํฐ ๊ตฌ์ฑ
โโโ Shard 1 (์๋ฒ A, B)
โโโ Shard 2 (์๋ฒ C)
ALTER TABLE default.user_events DROP PARTITION '20260318'
→ ์ฟผ๋ฆฌ๊ฐ ์๋ฒ A๋ก ์ ์๋ ๊ฒฝ์ฐ: ์๋ฒ A์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ง ์ญ์
→ ์๋ฒ C์ ๋ฐ์ดํฐ๋ ๊ทธ๋๋ก ๋จ์
์กฐํํด๋ณด๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฌ์ ํ ๋ณด์ธ๋ค. Distributed ํ ์ด๋ธ์ ๋ชจ๋ Shard๋ฅผ ํฉ์ณ์ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์, Shard 2์ ๋ฐ์ดํฐ๊ฐ ๋จ์์์ผ๋ฉด ์ญ์ ๊ฐ ์ ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
์ ์ด๋ ๊ฒ ๋์ํ๋?
Distributed ํ ์ด๋ธ์ SELECT/INSERT๋ ๊ฐ Shard์ ๋ถ์ฐ์ํค์ง๋ง, DDL์ ๋ถ์ฐ์ํค์ง ์๋๋ค.
ClickHouse ๊ณต์ ๋ฌธ์์๋ ๋ช ์๋์ด ์๋ค.
Distributed table does not store any data itself. It only routes queries to remote servers.
DDL queries (like ALTER) are applied only to the current server.
์ฆ Distributed ํ
์ด๋ธ์์ ALTER๋ฅผ ์คํํ๋ฉด ํด๋น ์๋ฒ์ ๋ก์ปฌ ํ
์ด๋ธ์๋ง ์ ์ฉ๋๋ค. ๋ค๋ฅธ Shard๋ก ์ ํ๋์ง ์๋๋ค.
์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: ๋ก์ปฌ ํ ์ด๋ธ + ON CLUSTER
ํด๊ฒฐ์ฑ ์ ๋ ๊ฐ์ง๋ค.
๋ฐฉ๋ฒ 1: ON CLUSTER ์ฌ์ฉ (๊ถ์ฅ)
๋ก์ปฌ ํ
์ด๋ธ์ ์ง์ ์ง์ ํ๋, ON CLUSTER ๊ตฌ๋ฌธ์ ๋ถ์ด๋ฉด ClickHouse๊ฐ ZooKeeper๋ฅผ ํตํด ํด๋ฌ์คํฐ ๋ด ๋ชจ๋ ๋
ธ๋์ ์๋์ผ๋ก DDL์ ๋ฐฐํฌํ๋ค.
-- ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: ๋ก์ปฌ ํ
์ด๋ธ + ON CLUSTER
ALTER TABLE local.user_events_local ON CLUSTER my_cluster
DROP PARTITION '20260318';
ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ก ์๋ฒ A, B, C ๋ชจ๋์์ ํด๋น ํํฐ์ ์ด ์ญ์ ๋๋ค.
๋ฐฉ๋ฒ 2: ๊ฐ ๋ ธ๋์ ์ง์ ์ ์ํด์ ์คํ
ON CLUSTER ์์ด ๊ฐ Shard ์๋ฒ์ ์ง์ ์ ์ํด์ ๋ก์ปฌ ํ
์ด๋ธ์ ์คํํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
-- ์๋ฒ A์ ์ ์ํด์ ์คํ
ALTER TABLE local.user_events_local DROP PARTITION '20260318';
-- ์๋ฒ C์ ์ ์ํด์ ์คํ
ALTER TABLE local.user_events_local DROP PARTITION '20260318';
๋์ผํ ๊ฒฐ๊ณผ์ง๋ง, ์๋ฒ๊ฐ ๋์ด๋ ์๋ก ๋ฒ๊ฑฐ๋กญ๊ณ ์ค์ํ ์ฌ์ง๊ฐ ์๊ธด๋ค. ON CLUSTER๋ฅผ ์ฐ๋ ๊ฒ ํจ์ฌ ๋ซ๋ค.
์ ๋ฆฌ
| ์คํ ๋์ | ON CLUSTER | ๊ฒฐ๊ณผ |
|---|---|---|
| Distributed ํ ์ด๋ธ | X | ์ฟผ๋ฆฌ ์์ ๋ ธ๋ 1๊ฐ๋ง ์ ์ฉ |
| ๋ก์ปฌ ํ ์ด๋ธ | X | ํด๋น ๋ ธ๋ 1๊ฐ๋ง ์ ์ฉ |
| ๋ก์ปฌ ํ ์ด๋ธ | O | ํด๋ฌ์คํฐ ์ ์ฒด ์ ์ฉ |
Distributed ํ
์ด๋ธ์ SELECT/INSERT๋ง ๋ถ์ฐ์ํจ๋ค. DDL์ ๋ก์ปฌ ํ
์ด๋ธ + ON CLUSTER๋ก ์คํํด์ผ ํ๋ค.
๋ง๋ถ์: Replica ๋๊ธฐํ๋ ์๋์ด๋ค
ON CLUSTER๋ก ์คํํ๋ฉด ๊ฐ Shard์ Primary ๋
ธ๋์ DDL์ด ์ ๋ฌ๋๋ค. ๊ทธ๋ฌ๋ฉด Replica๋ ์ด๋ป๊ฒ ๋๋?
Replica ๊ฐ ๋๊ธฐํ๋ ZooKeeper๊ฐ ๋ด๋นํ๋ค. Primary์ DDL์ด ์ ์ฉ๋๋ฉด ZooKeeper๋ฅผ ํตํด ๊ฐ์ Shard์ Replica์ ์๋์ผ๋ก ๋ฐ์๋๋ค. ๋ณ๋๋ก Replica ์๋ฒ์ ์ ์ํด์ ์คํํ ํ์๊ฐ ์๋ค.
ALTER TABLE local.user_events_local ON CLUSTER my_cluster DROP PARTITION '20260318'
โ
โโโ Shard 1 - ์๋ฒ A (Primary) → ZooKeeper → ์๋ฒ B (Replica) ์๋ ๋ฐ์
โโโ Shard 2 - ์๋ฒ C → (Replica ์์ผ๋ฉด ๋ฐ๋ก ์๋ฃ)
๋ง์น๋ฉฐ
์ฒ์์ "Distributed ํ ์ด๋ธ์ ์ฟผ๋ฆฌ ๋ ๋ฆฌ๋ฉด ๋ค ๋๋ ๊ฑฐ ์๋์ผ?"๋ผ๊ณ ์๊ฐํ๋๋ฐ, DDL๋งํผ์ ์์ธ๋ผ๋ ๊ฑธ ์ง์ ๊ฒช์ด๋ณด๊ณ ๋์์ผ ์ ๋๋ก ์ดํดํ๋ค.
SELECT/INSERT์ DDL์ ๋์ ๋ฐฉ์์ด ๋ค๋ฅด๋ค๋ ์ , ON CLUSTER๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง๋ฅผ ์ดํดํ๋ฉด ClickHouse ํด๋ฌ์คํฐ ์ด์์์ ์๋์น ์์ ์ค์๋ฅผ ์ค์ผ ์ ์๋ค.