[Clickhouse] Engine: PostgreSQL

clickhouse๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 1์ฐจ ์ €์žฅ์†Œ๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€์–ด์„œ ๋น ๋ฅด๊ฒŒ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ ๋ถ„์„์šฉ DB์— ๊ฐ€๊น๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ DB์™€์˜ ์†Œ์Šค ํ†ตํ•ฉ์„ ๊ฝค ์ž˜ ์ง€์›ํ•˜๋Š” ํŽธ์ด๋‹ค. PostgreSQL ์†Œ์Šค๋ฅผ ์—”์ง„์˜ ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•œ๋‹ค.

๊ทธ๋ƒฅ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋งŒ๋“ค๋ฉด, clickhouse๊ฐ€ ์•Œ์•„์„œ ์›๋ณธ DB์—์„œ ๊ฐ€์ ธ์™€์„œ ์ฟผ๋ฆฌ๋ฅผ ์˜์•„์ค€๋‹ค.

CREATE TABLE default.postgresql_table
(
    `float_nullable` Nullable(Float32),
    `str` String,
    `int_id` Int32
)
ENGINE = PostgreSQL('localhost', 'db๋ช…', '์›๋ณธํ…Œ์ด๋ธ”', 'username', 'password');



ํ•œ๊ณ„

์ด๊ฑด ์‹ค์ œ๋กœ clickhouse์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€์–ด์ฃผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๋Œ€์‹  ์ด์ฃผ๋Š” ๊ฒƒ์— ๋ถˆ๊ณผํ•˜๋‹ค.

๊ทธ๋ƒฅ ์‹ค์‹œ๊ฐ„์œผ๋กœ PostgreSQL์— ์ฟผ๋ฆฌ๋ฅผ ์ด์„œ clickhouse ๋‚ด์—์„œ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ๊ฒƒ์ด๋ผ์„œ, PostgreSQL์˜ ์›๋ณธ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ํฌ๋‹ค๋ฉด ๋”ฐ๋ผ์„œ ๋А๋ ค์ง„๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” COPY(SELECT ...)์˜ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค์„œ ๊ฐ€์ ธ์˜จ๋‹ค.

PostgreSQL์„ clickhouse๋กœ ๊ฐ€์ ธ์™€์„œ ๊ณ ์„ฑ๋Šฅ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด, ์ง์ ‘ CDC๋กœ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์‹คํ—˜์  ๋Œ€์•ˆ์ธ MaterializedPostgreSQL๋ฅผ ์จ์•ผ ํ•œ๋‹ค.
https://blog.naver.com/sssang97/223918168727




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

ํ•œ๋ฒˆ ์จ๋ณด์ž.
์ด๋Ÿฐ ๋‹จ์ˆœํ•œ key-valueํ˜• ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ๋‹ค.

CREATE TABLE public.global_state (
	id bigserial NOT NULL,
	created_at timestamptz NULL,
	updated_at timestamptz NULL,
	deleted_at timestamptz NULL,
	"key" text NULL,
	value text NULL,
	CONSTRAINT global_state_pkey PRIMARY KEY (id)
);

์ •์˜ ์ž์ฒด๋Š” ๊ฐ„๋‹จํ•˜๋‹ค.

์ด๊ฑธ ๋‹ค์‹œ clickhouse ํ˜•ํƒœ์— ๋งž์ถฐ์„œ ์žฌ์ •์˜ํ•ด์ฃผ๊ณ 

CREATE TABLE acloset_qa.global_state
(
    id bigserial NOT NULL,
	created_at timestamptz NULL,
	updated_at timestamptz NULL,
	deleted_at timestamptz NULL,
	"key" text NULL,
	value text NULL,
) 
ENGINE = PostgreSQL('์—”๋“œํฌ์ธํŠธ', 'db๋ช…', '์›๋ณธํ…Œ์ด๋ธ”', 'username', 'password');

์—”์ง„์—๋‹ค๊ฐ€ DB ์ ‘์†์ •๋ณด๋งŒ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด clickhouse๊ฐ€ ์ € ์ •๋ณด๋กœ ์ ‘์†ํ•ด์„œ ์•Œ์•„์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๊ณ  ๋“ค์–ด๊ฐ€๋ณด๋ฉด

๋ฐ์ดํ„ฐ๋Š” ๋‹ค ์ž˜ ๋“ค์–ด๊ฐ€์žˆ๊ณ 

๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ๋„ฃ์œผ๋ฉด

๋งž์ถฐ์„œ ๋ฐ˜์˜๋˜๊ณ 

์ˆ˜์ •ํ•ด๋„

์•Œ์•„์„œ ๋ฐ˜์˜ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Œ€๋กœ ์ž˜ ์“ฐ๋ฉด ๋œ๋‹ค.




named collection ๊ธฐ๋Šฅ

๊ทผ๋ฐ ์œ„์—์„œ ์‚ฌ์šฉํ•œ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๋•Œ๋งˆ๋‹ค ์ ‘์†์ •๋ณด๋ฅผ ๊ณ„์† ๋ฐ˜๋ณต์ ์œผ๋กœ, ์ค‘๋ณต๋˜๊ฒŒ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
named collection์„ ์“ฐ๋ฉด ์ ‘์†์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

/etc/clickhouse-server/config.d/named_collections.xml ๊ฐ™์€ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ 

<clickhouse>

<named_collections>
    <mypg>
        <host>localhost</host>
        <port>5432</port>
        <user>postgres</user>
        <password>****</password>
        <schema>schema1</schema>
    </mypg>
</named_collections>

<clickhouse>

์ด๋Ÿฐ ์‹์œผ๋กœ ์ž…๋ ฅํ•ด์ค€ ๋’ค์—, clickhouse ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ฉด ๋œ๋‹ค.
mypg๊ฐ€ ์ดํ›„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ ‘์†์ •๋ณด์˜ ์ด๋ฆ„์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๊ทธ๋ƒฅ ๋ฐ”๋กœ postgresql ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ๋„

SELECT * FROM postgresql(mypg, table='table1');

์ด๋Ÿฐ ์‹์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๊ณ 

ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ๋„

CREATE TABLE mypgtable (
...
) 
ENGINE = PostgreSQL(mypg, table = 'test', schema = 'public');

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.




๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „์ฒด ๋ฏธ๋Ÿฌ๋ง

ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ •์˜ํ•ด์„œ ์˜ฎ๊ธฐ๊ธฐ ๊ท€์ฐฎ๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „์ฒด๋ฅผ ๋ฏธ๋Ÿฌ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.
๊ทธ๋ƒฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๋•Œ ์—”์ง„ ์˜ต์…˜์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

CREATE database DB๋ช…
ENGINE = PostgreSQL('์—”๋“œํฌ์ธํŠธ', 'DBNAME', 'user', 'password');

๊ทธ๋Ÿผ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ „์ฒด ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.



์ฐธ์กฐ
https://clickhouse.com/docs/integrations/postgresql
https://clickhouse.com/docs/operations/named-collections#example-of-using-named-collections-with-the-postgresql-function
https://clickhouse.com/docs/engines/table-engines/integrations/postgresql
https://clickhouse.com/docs/engines/database-engines/postgresql