[Clickhouse] Engine: MaterializedPostgreSQL

MaterializedPostgreSQL๋Š” PostgreSQL ๋ฐ์ดํ„ฐ๋ฅผ clickhouse๋กœ ํผ์˜ค๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์˜ ์‹คํ—˜์  ์—”์ง„์ด๋‹ค.

์›๋ณธ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ 10๋งŒ๊ฐœ ๋ฏธ๋งŒ ์ •๋„๋กœ ์ž‘๊ณ , ๋ณต์ œ๋ฅผ ์‹ค์ œ๋กœ ํ•  ํ•„์š”๋„ ์—†๋‹ค๋ฉด PostgreSQL Engine์ด ๊ฐ„๋‹จํ•œ ๋Œ€์•ˆ์ด๋‹ค.
https://blog.naver.com/sssang97/223913979700




ํŠน์ง•๊ณผ ํ•œ๊ณ„

์‹คํ—˜์  ๊ธฐ๋Šฅ์ด๋ผ์„œ ๋ญ ์•ˆ๋˜๋Š”๊ฒŒ ๋งŽ๋‹ค.
์ผ๋‹จ, ๋ณด์กฐ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ๋˜๊ณ  DDL ๋ณ€๊ฒฝ ๊ฐ™์€ ๊ฒƒ๋„ ์•ˆ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋Œ€๊ทœ๋ชจ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์œผ๋ฉด ๋†’์€ ํ™•๋ฅ ๋กœ ์ค‘๋‹จ์— ๊ฐ€๊นŒ์šด ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ๊ผฌ์—ฌ๋ฒ„๋ฆฌ๋Š” ๋ฌธ์ œ๊ณ  ์ข…์ข… ๋ฐœ์ƒํ•œ๋‹ค.

์ด๊ฒƒ๋„ ํ˜„ ์‹œ์ ์—์„œ๋Š” ์ˆ˜์‹ญGB๋ฅผ ๋„˜๋Š” ๋Œ€ํ˜• ๋ฐ์ดํ„ฐ์—์„œ๋Š” ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ReplicingMergeTree์™€ ๊ตฌ์กฐ๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๋‹น ์—”์ง„์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์žฅ๋‹จ์ ์„ ๊ณ ์œ ํ•œ๋‹ค.
https://blog.naver.com/sssang97/223926254595





ํ”Œ๋ž˜๊ทธ

์ด๊ฑด ์•ˆ์ •ํ™”๋œ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ์„œ ๊ทธ๋ƒฅ์€ ๋ชป์“ด๋‹ค.

ํ•ด๋‹น ์„ธ์…˜์—์„œ SET ๋ช…๋ น์„ ํ†ตํ•ด ํ™œ์„ฑํ™”๋ฅผ ํ•ด์•ผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

SET allow_experimental_database_materialized_postgresql=1

ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์–ด์„œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.




์ œ์•ฝ๊ณผ ํ•œ๊ณ„

ํ…Œ์ด๋ธ” ์ •์˜์‹œ PRIMARY KEY๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๊ทธ๊ฑธ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋•ก๊ฒจ์˜ฌ์ง€ ๋ง์ง€ ์„ ํƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ด๋ธ” ์ƒ์„ฑ์‹œ ํ•„์š”ํ•œ PostgreSQL ๊ณ„์ •์€ ๋งŒ๋“œ์‹œ ํ…Œ์ด๋ธ”์˜ owner์ด๋ฉด์„œ, replication/superuser role์„ ์ค˜์•ผ ํ•œ๋‹ค.




๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•: Table Engine

์‚ฌ์šฉ๋ฒ•์€ PostgreSQL Engine๊ณผ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๋‹ค.
ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ ์ •์˜ํ•˜๊ณ , Engine ์ ˆ์— ์ ‘์†์ •๋ณด ์ฃผ๋ฅด๋ฅต ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

๋งŒ๋“ค๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ ํ…Œ์ด๋ธ”์ด 2๊ฐœ ๋งŒ๋“ค์–ด์ง„๋‹ค.
์ € ์ด์ƒํ•œ uuid๋กœ ๋งŒ๋“ค์–ด์ง„๊ฒŒ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์„œ ์ €์žฅํ•˜๋Š” ๋ถ€๋ถ„์ธ ๊ฒƒ ๊ฐ™๋‹ค. PK๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ upsert๋ฅผ ํ•ด์„œ์ธ์ง€ RepliacedMergeTree๋กœ ๋˜์–ด์žˆ๋‹ค.

๋ฐ์ดํ„ฐ ๊ทœ๋ชจ๊ฐ€ ์ข€ ๋œ๋‹ค๋ฉด ์ € uuid ํ…Œ์ด๋ธ”์ด ๋จผ์ € ๋งŒ๋“ค์–ด์ง€๊ณ , ๋™๊ธฐํ™”๊ฐ€ ์ข€ ๋๋‚œ ๋’ค์—์•ผ ๋‹ค ์™„์„ฑ์ด ๋œ๋‹ค.

๊ทธ๋Ÿผ PostgreSQL์—์„œ INSERT,UPDATE,DELETE๋ฅผ ํ• ๋•Œ๋งˆ๋‹ค

์ž๋™์œผ๋กœ ๋™๊ธฐํ™”๋ฅผ ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.




๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์ค€ ๋™๊ธฐํ™”

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ†ต์งธ๋กœ ๋ณต์ œํ•˜๊ฑฐ๋‚˜, ํ…Œ์ด๋ธ”์„ ์—ฌ๋Ÿฌ๊ฐœ ๋ณต์ œํ•ด์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด CREATE DATABASE ๋ช…๋ น์„ ํ†ตํ•ด์„œ ๋Œ€์ถฉ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
์ด ๊ฒฝ์šฐ ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ ๋ณ€ํ™˜์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค.

์ด๊ฑธ ์“ฐ๋ ค๋ฉด ๋˜ ๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ผœ์•ผ ํ•œ๋‹ค.

SET allow_experimental_database_materialized_postgresql=1;

์ด๋Ÿฌ๋ฉด ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๊ฑฐ๊ณ 

CREATE DATABASE DB๋ช…
ENGINE = MaterializedPostgreSQL('host:port', 'database', 'user', 'password');

์ผ๋ถ€ ํ…Œ์ด๋ธ”๋งŒ ๊ฐ€์ ธ์˜ค๋„๋ก ๋ช…์‹œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

CREATE DATABASE DB๋ช…
ENGINE = MaterializedPostgreSQL('host:port', 'database', 'user', 'password')
SETTINGS materialized_postgresql_tables_list='ํ…Œ์ด๋ธ”1,ํ…Œ์ด๋ธ”2,ํ…Œ์ด๋ธ”3';

์˜ˆ๋ฅผ ๋“ค์–ด, ํ…Œ์ด๋ธ” 2๊ฐœ๋งŒ ๋™๊ธฐํ™”์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด,

์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ทธ๋Ÿผ ์ž๋™์œผ๋กœ ์Šคํ‚ค๋งˆ๊นŒ์ง€ ์ •์˜ํ•ด์„œ ๋ฐ์ดํ„ฐ๋„ ๋ถ€์–ด์ค„ ๊ฒƒ์ด๋‹ค.
Database๋กœ ๋งŒ๋“ค ๋•Œ๋Š” Table์„ ์ง์ ‘ ๋งŒ๋“ค ๋•Œ์™€ ๋‹ค๋ฅด๊ฒŒ, MaterializedPostgreSQL ์—”์ง„ ํ…Œ์ด๋ธ”์ด ๋”ฐ๋กœ ์ƒ๊ธฐ์ง€ ์•Š๊ณ  ReplacingMergeTree๋งŒ ๋งŒ๋“ค์–ด์ง„๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” ์ดํ›„์— ๋™๊ธฐํ™”ํ•  ํ…Œ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ATTACH ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ATTACH TABLE load_test.color;

๊ทธ๋ƒฅ ํ…Œ์ด๋ธ”๋ช…๋งŒ ๋„ฃ์–ด์„œ ์‹คํ–‰ํ•˜๋ฉด


์ž๋™์œผ๋กœ ๋ถ€์–ด์ค€๋‹ค.

ํ…Œ์ด๋ธ”์„ ๋™๊ธฐํ™” ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•˜๊ณ  ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด DETACH๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค.

DETACH TABLE load_test.color PERMANENTLY;



์ฐธ์กฐ
https://clickhouse.com/docs/engines/database-engines/materialized-postgresql
https://clickhouse.com/docs/engines/table-engines/integrations/materialized-postgresql