๊ฐ์
ClickHouse๋ ์ด๊ณ ์ ๋ถ์์ ์ํด ์ค๊ณ๋ ์ปฌ๋ผ ์งํฅ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก, ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง๊ณผ ํ ์ด๋ธ ์์ง์ ์ ๊ณตํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์๊ณผ ๋ฐฑ์๋๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ํ ์ด๋ธ ์์ง์ ๊ฐ๋ณ ํ ์ด๋ธ์ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ์, ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ฐฉ๋ฒ, ๋ณต์ ๋ฐฉ์ ๋ฑ์ ์ ์ํฉ๋๋ค.
์ด ๊ธ์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง๊ณผ ํ ์ด๋ธ ์์ง์ ์ฃผ์ ํน์ง, ์ฐจ์ด์ , ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํฌํจํ์ฌ ์์ธํ ๋ถ์ํฉ๋๋ค.
1. ClickHouse ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง์ ClickHouse ๋ด์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋จ์๋ก ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๊ด๋ฆฌ๋๋์ง ๊ฒฐ์ ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง ์ข ๋ฅ ๋ฐ ํน์ง
์์งํ์ | ์ฃผ์ ํน์ง | ์ฅ์ | ๋จ์ | ์ฌ์ฉ ์ํฉ |
Atomic | ๋ ผ๋ธ๋กํน DDL, ์์์ ํ ์ด๋ธ ๊ตํ, UUID ๊ธฐ๋ฐ ๊ด๋ฆฌ | ๋์ ๋์์ฑ ์ง์, ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ณด์ฅ | ํ ์ด๋ธ ์ญ์ ์ง์ฐ, UUID ๊ด๋ฆฌ ๋ณต์ก์ฑ | ์ผ๋ฐ์ ์ธ OLAP ์ํฌ๋ก๋ |
Backup | ๋ฐฑ์ ์ค๋ ์ท์์ ์ฝ๊ธฐ ์ ์ฉ ์ฐ๊ฒฐ ์ง์ | ๋ฐฑ์ ์ฆ์ ํ์ฉ ๊ฐ๋ฅ | ์ฐ๊ธฐ ์์ ๋ถ๊ฐ๋ฅ | ๋ฐฑ์ ๋ฐ์ดํฐ ๋ถ์ ์๋๋ฆฌ์ค |
Lazy | ์ง์ ์๊ฐ ๋์๋ง ๋ฉ๋ชจ๋ฆฌ ์ ์ง (Expiration Time ์ค์ ) | ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ต์ ํ | Log ์์ง๋ง ์ง์, ์ ํ๋ ์ฌ์ฉ ๋ฒ์ | ์์ ์บ์/๋ก๊ทธ ๋ฐ์ดํฐ ๋ถ์ |
Materialized*SQL | ์ธ๋ถ DB(PostgreSQL/MySQL ๋ฑ)์ ์ค์๊ฐ ์ฐ๋ | ์ธ๋ถ ์์คํ ํตํฉ ์ฉ์ด | ์ธ๋ถ DB ์ฑ๋ฅ ์ํฅ ๊ฐ๋ฅ | ํ์ด๋ธ๋ฆฌ๋ ๋ถ์ ํ๊ฒฝ |
Replicated | ZooKeeper ๊ธฐ๋ฐ ๋ฉํ๋ฐ์ดํฐ ๋ณต์ | ๊ณ ๊ฐ์ฉ์ฑ ๋ณด์ฅ | ZooKeeper ์์กด์ฑ ์ฆ๊ฐ | ํด๋ผ์ฐ๋/๋ถ์ฐ ํ๊ฒฝ |
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ ์์
1. Atomic ์์ง์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
-- Atomic ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ (๊ธฐ๋ณธ๊ฐ์ด๋ฏ๋ก ENGINE ์ง์ ๋ถํ์)
CREATE DATABASE my_database;
-- ๋ช
์์ ์ผ๋ก Atomic ์์ง ์ง์
CREATE DATABASE my_atomic_db ENGINE = Atomic;
-- ํ
์ด๋ธ ๊ตํ ์์ (์์์ ์์
)
EXCHANGE TABLES table1 AND table2;
2. Lazy ์์ง์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
CREATE DATABASE lazy_db ENGINE = Lazy(3600); -- 1์๊ฐ ๋์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง
3. ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ๊ณผ ์ฐ๊ฒฐํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ(Postgresql, mysql ๋ฑ)
CREATE DATABASE postgres_db ENGINE = PostgreSQL('host:port', 'database', 'user', 'password');
4. Replicated ์์ง
CREATE DATABASE replicated_db ENGINE = Replicated('/clickhouse/databases/db_name', 'shard1', 'replica1');
2. ClickHouse ํ ์ด๋ธ ์์ง
ํ ์ด๋ธ ์์ง์ ๊ฐ๋ณ ํ ์ด๋ธ์ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ์, ์ฝ๊ธฐ/์ฐ๊ธฐ ์ฑ๋ฅ, ๋ณต์ ๋ฉ์ปค๋์ฆ์ ๊ฒฐ์ ํฉ๋๋ค.
์ฃผ์ ์์ง ์ค๋ช ํน์ง
MergeTree | ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์์ง, ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ต์ ํ | โ ๋น ๋ฅธ ์ฟผ๋ฆฌ, โ ํํฐ์ ๋ ๊ฐ๋ฅ |
ReplacingMergeTree | ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํ MergeTree ๋ณํ | โ ์ต์ ๋ฐ์ดํฐ ์ ์ง |
SummingMergeTree | ์ง๊ณ๋ฅผ ์๋์ผ๋ก ์ํํ๋ MergeTree ๋ณํ | โ ์ฌ์ ์ง๊ณ ์ต์ ํ |
Distributed | ์ฌ๋ฌ ๋ ธ๋์ ๊ฑธ์ณ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ ์ ์ฅ | โ ์ค๋ฉ ๋ฐ ๋ก๋ ๋ฐธ๋ฐ์ฑ |
Log | ๊ฐ๋จํ ๋ก๊น ๋ฐ ๋น ๋ฅธ INSERT | โ ๋น ๋ฅธ ์ฐ๊ธฐ, โ ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ |
Memory | ๋ฐ์ดํฐ๋ฅผ RAM์ ์ ์ฅ | โ ์ด๊ณ ์ ์ฒ๋ฆฌ, โ ์๊ตฌ ์ ์ฅ ๋ถ๊ฐ |
ํ ์ด๋ธ ์์ง ๋น๊ตํ
MergeTree ๊ณ์ด
์์ง ํ์ | ์ฃผ์ ํน์ง | ์ฅ์ | ๋จ์ | ์ฌ์ฉ ์ํฉ |
MergeTree | ๊ธฐ๋ณธ ๊ณ์ด, ํ๋ผ์ด๋จธ๋ฆฌ ํค ๊ธฐ๋ฐ ์ ๋ ฌ | ๊ณ ์ฑ๋ฅ ๋ฒ์ฉ ์ฒ๋ฆฌ | ๋ณต์กํ ์ค์ ํ์ | ๋๊ท๋ชจ ์๊ณ์ด ๋ฐ์ดํฐ |
ReplacingMergeTree | ๋ฒ์ ์ปฌ๋ผ ๊ธฐ๋ฐ ์ค๋ณต ์ ๊ฑฐ | ๋ฐ์ดํฐ ์ค๋ณต ๋ฐฉ์ง | ์ต์ข ์ผ๊ด์ฑ๋ง ๋ณด์ฅ | CDC(Change Data Capture) ์์คํ |
SummingMergeTree | ๋์ผ ํค ๊ฐ์ ์ซ์ ์ปฌ๋ผ ํฉ์ฐ | ์ง๊ณ ์ฟผ๋ฆฌ ์ฑ๋ฅ ํฅ์ | ๋น์ง๊ณ ์ปฌ๋ผ ์ฒ๋ฆฌ ๋ณต์ก | ์ค์๊ฐ ๋์ ํต๊ณ |
AggregatingMergeTree | ์ฌ์ฉ์ ์ ์ ์ง๊ณ ํจ์ ์ ์ฉ | ๋ณต์ก ์ง๊ณ ์ฐ์ฐ ์ต์ ํ | ์ฟผ๋ฆฌ ์์ฑ ๋ณต์ก๋ ์ฆ๊ฐ | ๋กค์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ |
CollapsingMergeTree | Sign ๋ง์ปค ๊ธฐ๋ฐ ํ ์ํ ๊ด๋ฆฌ | ๋ณ๊ฒฝ ์ด๋ ฅ ์ถ์ ๊ฐ๋ฅ | ๋ฐ์ดํฐ ์ ๋ ฅ ์์ ์ํฅ ๋ฐ์ | ์ํ ๋ณ๊ฒฝ ์ถ์ ์์คํ |
VersionedCollapsing | ๋ฒ์ ์ปฌ๋ผ ์ถ๊ฐ๋ก ์์ ๋ฌธ์ ํด๊ฒฐ | ์ ๋ขฐ์ฑ ์๋ ์ํ ๊ด๋ฆฌ | ์คํค๋ง ์ค๊ณ ๋ณต์ก | ๊ธ์ต ๊ฑฐ๋ ์ด๋ ฅ ๊ด๋ฆฌ |
Log ๊ณ์ด
์์ง ํ์ | ์ฃผ์ ํน์ง | ์ฅ์ | ๋จ์ | ์ฌ์ฉ ์ํฉ |
TinyLog | ๋จ์ผ ํ์ผ ์ ์ฅ, ์ต์ ๊ธฐ๋ฅ | ์ด๊ฒฝ๋ ๊ตฌํ | ๋์ ์ ๊ทผ ๋ถ๊ฐ๋ฅ | ํ ์คํธ ํ๊ฒฝ/์๋ ์ฐธ์กฐ ๋ฐ์ดํฐ |
StripeLog | ์ปฌ๋ผ ๋จ์ ์ ์ฅ ์ง์ | TinyLog๋ณด๋ค ์ฑ๋ฅ ํฅ์ | ํ ๋จ์ ์ ๊ทผ ๋นํจ์จ์ | ์ค๊ฐ ํฌ๊ธฐ ๋ก๊ทธ ๋ฐ์ดํฐ(10๋ง ํ ์ดํ) |
Log | ๋ฉํฐ์ค๋ ๋ ์ฝ๊ธฐ ์ง์ | ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ | ์ฐ๊ธฐ ์ ํ ์ด๋ธ ์ ๊ธ ๋ฐ์ | ์๊ท๋ชจ ๋ฐฐ์น ์ฒ๋ฆฌ ์์ |
Integration ๊ณ์ด
์์ง ํ์ | ์ฃผ์ ํน์ง | ์ฅ์ | ๋จ์ | ์ฌ์ฉ ์ํฉ |
Kafka | ์ค์๊ฐ ์คํธ๋ฆผ ๋ฐ์ดํฐ ์์ | ์ค์๊ฐ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ | ์คํ์ ๊ด๋ฆฌ ํ์ | ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ ์ฒ๋ฆฌ |
MySQL | MySQL ํ ์ด๋ธ ๋งคํ | ์ค์๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ | ์กฐ์ธ ์ฑ๋ฅ ์ ํ์ | ํ์ด๋ธ๋ฆฌ๋ ํธ๋์ญ์ -๋ถ์ ์์คํ |
PostgreSQL | PostgreSQL ์ฐ๋ | ๋ณตํฉ ์์คํ ํตํฉ | ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋ ์ ํ | ํฌ๋ก์คํ๋ซํผ ๋ถ์ |
*์ด ์ธ์๋ s3, iceberg, hudi ๋ฑ ๋ค์ํ ์๋น์ค์ ์ฐ๋์ด ๊ฐ๋ฅํจ
Special ๊ณ์ด
์์ง ํ์ | ์ฃผ์ ํน์ง | ์ฅ์ | ๋จ์ | ์ฌ์ฉ ์ํฉ |
Memory | ์ ์ฒด ๋ฐ์ดํฐ RAM ์ ์ฅ | ์ด๊ณ ์ ์ ๊ทผ | ๋ฐ์ดํฐ ํ๋ฐ์ฑ | ์์ ๊ณ์ฐ์ฉ ๋ฒํผ |
Distributed | ํด๋ฌ์คํฐ ๋ ธ๋ ๋ถ์ฐ ์ฒ๋ฆฌ | ์ํ์ ํ์ฅ ๊ฐ๋ฅ | ๋คํธ์ํฌ ์ง์ฐ ๋ฐ์ ๊ฐ๋ฅ | ๋๊ท๋ชจ ๋ถ์ฐ ์์คํ |
Dictionary | ์ธ๋ถ ์ฌ์ ๋ฐ์ดํฐ ๋งคํ | ์กฐ์ธ ์ฑ๋ฅ ํฅ์ | ์ฌ์ ๊ฐฑ์ ๊ด๋ฆฌ ํ์ | ๊ณตํต ์ฝ๋ ๊ด๋ฆฌ ์์คํ |
ํ ์ด๋ธ ์์ง ์ ํ ๊ฐ์ด๋
1. ๋ฐ์ดํฐ ๊ท๋ชจ:
- 1M(1,000,000) ํ ๋ฏธ๋ง -> Log ๊ณ์ด
- 1M ~ 1B(1,000,000,000) ํ -> MergeTree ๊ณ์ด
- 1B ํ ์ด์ -> Distributed + ReplicatedMergeTree
2. ๋ฐ์ดํฐ ํน์ฑ:
- ์๊ณ์ด -> MergeTree with TTL
- ์คํธ๋ฆฌ๋ฐ -> Kafka Engine + Materialized View
- ์์ ๋ฐ์ดํฐ -> Memory Engine
3. ์์คํ ์๊ตฌ์ฌํญ:
- ๊ณ ๊ฐ์ฉ์ฑ -> ReplicatedMergeTree
- ์ธ๋ถ ์ฐ๋ -> Integration ๊ณ์ด
- ์ค์๊ฐ ์ง๊ณ -> SummingMergeTree
ํ ์ด๋ธ ์์ฑ ์์ - MergeTree ์์ง
-- MergeTree ์์ง ํ
์ด๋ธ (ํํฐ์
๋ ๋ฐ ์ ๋ ฌ ํฌํจ)
CREATE TABLE logs (
timestamp DateTime,
user_id UInt32,
event_type String
) ENGINE = MergeTree()
ORDER BY timestamp
PARTITION BY toYYYYMM(timestamp);
-- Distributed ํ
์ด๋ธ ์์ฑ (๋ค์ค ๋
ธ๋ ๋ถ์ฐ)
CREATE TABLE distributed_logs AS logs
ENGINE = Distributed(cluster_name, default, logs, rand());
3. ๊ฒฐ๋ก
ClickHouse๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง๊ณผ ํ ์ด๋ธ ์์ง์ ์กฐํฉํ์ฌ ์ต์ ์ ์ฑ๋ฅ์ ๊ตฌํํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง: Atomic์ด ๊ธฐ๋ณธ์ด๋ฉฐ, MySQL ์ฐ๋ ๋ฐ ๋ณต์ ๊ฐ ํ์ํ ๊ฒฝ์ฐ ํน์ ์์ง ์ฌ์ฉ
- ํ ์ด๋ธ ์์ง: MergeTree ๊ณ์ด์ด ๊ธฐ๋ณธ์ด๋ฉฐ, ๋ถ์ฐ, ์ค์๊ฐ ๋ถ์, ์ง๊ณ ์ต์ ํ ๋ฑ ๋ค์ํ ๋ณํ ์์ง ์กด์ฌ
์ถ์ฒ ์กฐํฉ ์์
- ๋จ์ผ ์๋ฒ: Atomic + MergeTree
- ๊ณ ๊ฐ์ฉ์ฑ (ํด๋ฌ์คํฐ ํ๊ฒฝ): Replicated + Distributed
- ์ค์๊ฐ ๋ถ์ (Kafka ์ฐ๋): Atomic + Kafka + MergeTree
- ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ๋น ๋ฅธ ์ฟผ๋ฆฌ: Memory
๐ ๋ค์ ๊ธ์์๋ ๊ฐ๊ฐ์ ์์ง ํ ์ด๋ธ์ ์์ฑํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ์ค์ต์ ์งํํ๊ฒ ์ต๋๋ค.
- ํนํ ๋ถ์ฐ ํด๋ฌ์คํฐ ํ๊ฒฝ์์ ํ ์ด๋ธ ์์ฑ ํ ์ฃผ์ ์์ง๋ณ ๋ฐ์ดํฐ ์กฐํ ๋ฐฉ๋ฒ๊ณผ ์ด์ ๊ธ(https://jongwho.tistory.com/26)์์ ๋ค๋ค๋ ์ค์๊ฐ ๋ถ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ค์ ์ ๋์ด ์ค๋ช ํ๊ฒ ์ต๋๋ค.