[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