์ด์ clickhouse ํด๋ฌ์คํฐ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐฉ์(Clickhouse ํด๋ฌ์คํฐ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ์ฝ์ ๋ฐ ์ ๋ฐ์ดํธ ์ฒ๋ฆฌ ๋ฐฉ์ ๐(part. 1)) ์ค๋ช ์ ์ด์ด ReplicatedMergetree ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
1. ClickHouse Kubernetes ์ํคํ ์ฒ ๊ฐ์ ๐ ๏ธ
์ด๋ฒ ์ค์ต์์๋ replica๋ฅผ ์ถ๊ฐํ์ฌ ๋ฐ์ดํฐ๊ฐ ๋ณต์ ๋๋๋ก ์ค์ ํ์ต๋๋ค. ๊ธฐ์กด clickhouse helm ๋ฐฐํฌ์ฉ yaml ํ์ผ์์ replicaCount๋ฅผ 2๋ก ์ค์ ํ์ต๋๋ค.(Clickhouse ์ค์น ๋ฐฉ๋ฒ)
NAME READY STATUS RESTARTS
clickhouse-shard0-0 1/1 Running 0
clickhouse-shard0-1 1/1 Running 0
clickhouse-shard1-0 1/1 Running 0
clickhouse-shard1-1 1/1 Running 0
clickhouse-zookeeper-0 1/1 Running 0
2. ๋ฐ์ดํฐ ์ฝ์ (Insert) ์ฒ๋ฆฌ ๋ฐฉ์ ๐
2.1 ReplicatedMergeTree
์ด์ ์ค์ต์์ ์ฌ์ฉํ๋ regular_db์ replicatedmergetree ์์ง์ ์ฌ์ฉํ๋ ํ ์ด๋ธ์ ์์ฑํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
-- ReplicatedMergetree ์์ง ํ
์ด๋ธ ์์ฑ
CREATE TABLE IF NOT EXISTS regular_db.test_replicated_merge_tree (
id UInt64,
event_date Date,
event_time DateTime,
user_id String,
event_type String,
payload String
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/regular/test_replicated_merge_tree', '{replica}')
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, id);
-- ๋ถ์ฐ ํ
์ด๋ธ
CREATE TABLE regular_db.distributed_replicated_table ON CLUSTER default
(
id UInt64,
event_date Date,
event_time DateTime,
user_id String,
event_type String,
payload String
)
ENGINE = Distributed(default, regular_db, test_replicated_merge_tree, cityHash64(id));
-- ๋ฐ์ดํฐ ์ถ๊ฐ
INSERT INTO regular_db.distributed_replicated_table
SELECT
number as id,
toDate('2024-03-01') + (number % 30) as event_date,
toDateTime(toDate('2024-03-01') + (number % 30) + (number % 24) / 24) as event_time,
concat('user_', toString(1 + number % 1000)) as user_id,
multiIf(
number % 5 = 0, 'click',
number % 5 = 1, 'view',
number % 5 = 2, 'purchase',
number % 5 = 3, 'login',
'logout'
) as event_type,
concat('{"data":"', repeat('X', 10 + number % 50), '","value":', toString(number % 100), '}') as payload
FROM numbers(1000000);
์์ ๊ฐ์ด ์ฝ 1,000,000 row์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋ select count(*) from regular_db.test_replicated_merge_tree
์์ ์๋ฌด ๋ฐ์ดํฐ๊ฐ ์กฐํ๋์ง ์๋ ํ์์ด ๋ฐ์ํฉ๋๋ค. ์ด๋ dbeaver์์ clickhouse cluster ์ฐ๊ฒฐ ์ ๊ฐ๊ฐ์ shard์ ์ฐ๊ฒฐ๋๊ธฐ์ ์์ง ๋ณต์ ๋์ง ์์ shard์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ์ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์
๋๋ค.
select *
from cluster('default', regular_db.test_replicated_merge_tree)
๋ง์ฝ ์ ์ฒด ํด๋ฌ์คํฐ์์ ๋ฐ์ดํฐ ์กฐํ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด table not found ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด๋ ์์ง clickhouse๊ฐ ๊ฐ shard์ ๋ณต์ ํ์ง ๋ชปํ์ฌ ๋ฐ์ํ๋ ๋ฌธ์ ๋ก ์๊ฐ์ด ์ง๋๋ฉด(clickhouse๊ฐ background copy๋ฅผ ์๋ฃํ๋ฉด) ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ฉฐ ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
MergeTree Vs ReplicatedMergetree์ ์ฐจ์ด์ ?
ReplicatedMergetree ์์ง์ ์ฌ์ฉํ ๊ฒฝ์ฐ shard ๋ด replica์ ํด๋น ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ๋ณต์ ๋ฉ๋๋ค. ๋ฐ์ดํฐ ์กฐํ ์์๋ฅผ ํตํด ์์๋ณด๋ฉด
Clickhouse-shard1-0๊ณผ Clickhouse-shard1-1์ ๋์ผํ ์ซ์์ ๋ฐ์ดํฐ๊ฐ ๋ณต์ ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ํ์ง๋ง mergetree์ ๊ฒฝ์ฐ ๊ณ ์ ๋ shard ๋ด์๋ง ์กด์ฌํ์ฌ replicated ๋์ง ์์ต๋๋ค.
3. ํ ์ด๋ธ ์์ง ๋ณ ๋ฐ์ดํฐ ์ฝ์ (Insert) ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ฐ๋ฅธ ์ฅ,๋จ์ ๋น๊ต
ํ ์ด๋ธ ์์ง | ์ฅ์ | ๋จ์ |
Distributed + MergeTree | 1. ์ํ ํ์ฅ์ฑ: ์ค๋๋ฅผ ์ถ๊ฐํ๋ฉด ์๋์ผ๋ก ํ์ฅ ๊ฐ๋ฅ 2. ์ค์ ์ง์ค์ ์กฐํ: ํด๋ผ์ด์ธํธ๋ Distributed ํ ์ด๋ธ์ ํตํด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์ 3. ํจ์จ์ ์ธ ์ค๋ฉ: ์ค๋ฉ ํค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐํ์ฌ ๋ถํ๋ฅผ ์ต์ํ |
1. ๋ฐ์ดํฐ ๋ณต์ ์์: ์ค๋ ๊ฐ ๋ฐ์ดํฐ๊ฐ ์ค๋ณต๋์ง ์์ ํน์ ์ค๋ ์ฅ์ ์ ๋ฐ์ดํฐ ์์ค ๊ฐ๋ฅ. 2.๋ณต๊ตฌ ์๊ฐ ์ฆ๊ฐ: ์ฅ์ ๋ฐ์ ์ ์๋ ๋ณต๊ตฌ๊ฐ ํ์ํจ. |
ReplicatedMergeTree | 1. ๊ณ ๊ฐ์ฉ์ฑ: ์ฅ์ ๋ฐ์ ์ ๋ค๋ฅธ ๋ ํ๋ฆฌ์นด์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ์ฌ ์๋น์ค ์ค๋จ ๋ฐฉ์ง. 2. ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ: ZooKeeper๋ฅผ ํตํด ๋ ํ๋ฆฌ์นด ๊ฐ ๋๊ธฐํ ๊ด๋ฆฌ. 3. ๋ณต๊ตฌ ์๋ํ: ์ฅ์ ๋ ธ๋ ๋ณต๊ตฌ ์ ZooKeeper๊ฐ ์๋์ผ๋ก ์ํ๋ฅผ ์กฐ์ ํจ. |
1. ์ด์ ๋น์ฉ ์ฆ๊ฐ: ๋ ํ๋ฆฌ์นด ๊ฐ ๋๊ธฐํ๋ก ์ธํด ์ถ๊ฐ์ ์ธ ๋ฆฌ์์ค ์๋ชจ ๋ฐ์. 2. ๋ณต์กํ ์ค์ ์๊ตฌ: ZooKeeper ๋ฐ ๋ ํ๋ฆฌ์นด ๊ด๋ฆฌ๊ฐ ํ์ํจ. |
๊ฐ ์ฃผ์ ์์ง๋ณ ์ฌ์ฉ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Distributed + MergeTree: ์ค์๊ฐ ๋ถ์ ์ค์ฌ ํ๊ฒฝ (๋๊ท๋ชจ ์ด๋ฒคํธ ์ฒ๋ฆฌ)
- ๐ ๋์ ์ฐ๊ธฐ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ด ํ์ํ๋ฉฐ, ์ฅ์ ๋ฐ์ ์ ์ผ๋ถ ๋ฐ์ดํฐ ์์ค์ด ํ์ฉ๋ ์ ์๋ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค
ReplicatedMergeTree: ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ์ค์ํ ํ๊ฒฝ (๊ธ์ต/์๋ฃ)
- ๐ ์ฅ์ ๋ฐ์ ์์๋ ๋ฐ์ดํฐ ์์ค ์์ด ์๋น์ค๋ฅผ ์ง์ํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค