[Clickhouse] Engine: Buffer (Legacy)

[์›๋ณธ ๋งํฌ]

Buffer๋Š” ๋ณด์กฐ์ ์ธ ์šฉ๋„๋ฅผ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ ํ…Œ์ด๋ธ” ์—”์ง„์ด๋‹ค.
ํŠนํžˆ ์“ฐ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ, ์“ฐ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ๋งํ–ˆ๋‹ค๊ฐ€ ํ•œ๋ฒˆ์— ๋ถ“๋Š” ์šฉ๋„๋กœ ์“ด๋‹ค.

๋งŒ์•ฝ ์ด๋Ÿฐ ์‹์œผ๋กœ ์›๋ณธ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์›๋ณธ์— ๋Œ€ํ•œ ๋ฒ„ํผ ํ…Œ์ด๋ธ”์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

CREATE TABLE ๋ฒ„ํผํ…Œ์ด๋ธ”๋ช… AS ์›๋ณธํ…Œ์ด๋ธ”๋ช…
ENGINE = Buffer(
    currentDatabase(), -- ๋Œ€์ƒ DB
    'ํ…Œ์ด๋ธ”๋ช…',          -- ๋Œ€์ƒ ํ…Œ์ด๋ธ”
    16,                -- num_layers
    5, 60,             -- min_time, max_time
    10000, 1000000,    -- min_rows, max_rows
    1048576, 104857600 -- min_bytes, max_bytes
);

๋•์ง€๋•์ง€ ๋ถ™์€ ์˜ต์…˜๋“ค์ด ์ž๋™ flush ์กฐ๊ฑด์„ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„๋“ค์ด๋‹ค.
min์€ ์ตœ์†Œํ•œ ์ €๋งŒํผ์€ ๋˜์–ด์•ผ flushํ•œ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , max๋Š” ์ตœ์ข… ์ž„๊ณ„์ ์ด๋‹ค. max์— ๋„๋‹ฌํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ์›๋ณธ ํ…Œ์ด๋ธ”์— ์“ฐ๊ธฐ๋ฅผ ๋„˜๊ธด๋‹ค.
๋ฒ„ํผ์— ์Œ“์ธ ๋ฐ”์ดํŠธ ํฌ๊ธฐ, ๋ฒ„ํผ์— ์Œ“์ธ ์‹œ๊ฐ„, ํ–‰ ๊ฐœ์ˆ˜ ๋‹จ์œ„๋กœ flush ๊ทœ์น™์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  buffer์— insertํ•˜๋ฉด

์ฒ˜์Œ์—๋Š” ๋ฒ„ํผ์—๋งŒ ๋ณด์ด๋‹ค๊ฐ€


๊ธฐ์ค€์„ ์ถฉ์กฑํ•˜๋ฉด ์›๋ณธ ํ…Œ์ด๋ธ”์—๋„ ๋ถ€์–ด์งˆ ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณ ๋กœ, buffer๋Š” ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.
events์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” buffer์—์„œ๋„ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.




Buffer์˜ ํ•œ๊ณ„

๊ทธ๋ƒฅ ์–ผํ• ๋ณด๋ฉด ์ข‹์•„๋ณด์ผ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ๋‹จ์ ์ด ๋งŽ๋‹ค.

์ผ๋‹จ Buffer -> MergeTree๋กœ์˜ Insert๋Š” exactly once๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค, ๋™์ผ ํ–‰์ด ์—ฌ๋Ÿฌ๋ฒˆ Insert๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹น์—ฐํ•˜์ง€๋งŒ ์œ ์‹ค ์œ„ํ—˜์ด ์žˆ๋‹ค. ์ธ๋ฉ”๋ชจ๋ฆฌ๋ผ์„œ ์„œ๋ฒ„๊ฐ€ ์…ง๋‹ค์šด๋˜๋ฉด ์ฆ๋ฐœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋‹จ์ ๋“ค์„ ๊ฐ์ˆ˜ํ•จ์—๋„, ์“ฐ๊ธฐ ์„ฑ๋Šฅ์ด ๊ทน์ ์ด์ง€๋Š” ์•Š๋‹ค. ํŠนํžˆ ํ•œ ํ–‰์”ฉ Insertํ•˜๋Š” ๊ฒƒ์€ Buffer๋ฅผ ์“ฐ๋”๋ผ๋„ ํšจ์œจ์ ์ด์ง€ ์•Šใ„ด๋‹ค.




Buffer vs async Insert

๊ฒŒ๋‹ค๊ฐ€ Buffer๋Š” ํ˜„ ์‹œ์ ์—๋Š” ๊ทธ๋‹ค์ง€ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. clickhouse ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” Buffer๋ฅผ ๋ ˆ๊ฑฐ์‹œ๋กœ ๊ฐ„์ฃผํ•˜๊ณ , async insert ๊ธฐ๋Šฅ์„ ์ข‹์€ ๋Œ€์•ˆ์œผ๋กœ์„œ ๊ถŒ์žฅํ•œ๋‹ค.
๋‘˜ ๋‹ค clickhouse๊ฐ€ ์ธ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ฒ„ํผ๋ง์„ ํ•˜๋‹ค๊ฐ€ ๋ชจ์•„์„œ ํ…Œ์ด๋ธ”์— write๋ฅผ ๋‚ ๋ฆฐ๋‹ค๋Š” ๋Œ€์ „์ œ๋Š” ๊ฐ™๋‹ค. ์‹ค์ œ๋กœ๋„ async insert๊ฐ€ buffer๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ธฐ๋Šฅ์ด๊ธฐ๋„ ํ•˜๋‹ค.

async insert๋Š” buffer๋ณด๋‹ค ๋งŽ์€ ๋ณด์žฅ ์ˆ˜์ค€์„ ์ œ๊ณตํ•˜๊ณ , batch insert ์ตœ์ ํ™”๋„ ์ž˜ ํ•ด์ค€๋‹ค.
wait_for_async_insert ๊ฐ™์€ ์˜ต์…˜์ด ์žˆ์–ด์„œ ์“ฐ๊ธฐ์— ๋Œ€ํ•œ ๋ณด์žฅ์„ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
https://blog.naver.com/sssang97/223973565751



์ฐธ์กฐ
https://clickhouse.com/docs/engines/table-engines/special/buffer