[Clickhouse] Asynchronous Insert

Clickhouse๋Š” ์žฆ์€ Insert ํŒจํ„ด์— ์ตœ์ ํ™”๋˜์–ด์žˆ๋Š” DB๋Š” ์•„๋‹ˆ๋‹ค. RDB๋ฅผ ๋น„๋กฏํ•œ ์ฃผ๋ฅ˜ DB๋“ค์— ๋น„ํ•˜๋ฉด ๋”์šฑ ๊ทธ๋ ‡๋‹ค.

๊ทธ๋ž˜์„œ 1000๊ฐœ์˜ ํ–‰์„ ํ•˜๋‚˜์”ฉ 1000๋ฒˆ ๋„ฃ๋Š”๊ฒƒ๋ณด๋‹ค ํ•œ๋ฒˆ์— ๋„ฃ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹๊ณ , ์›ฌ๋งŒํ•˜๋ฉด 1์ดˆ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ INSERT๋ฅผ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

๊ทผ๋ฐ ์ด๋Ÿฐ๊ฑธ ์ผ์ผ์ด ์ง€ํ‚ค๊ธฐ๋Š” ์•„๋ฌด๋ž˜๋„ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์˜ˆ๋ฅผ ํ…Œ๋ฉด writer๊ฐ€ ๋‹จ์ผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•„๋‹Œ ์ƒํ™ฉ์—์„œ, ๊ฐ๊ฐ์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฉ”ํŠธ๋ฆญ์ด๋‚˜ ๋กœ๊ทธ๋ฅผ INSERTํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•œ ๋ณด์กฐ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ async insert ๊ธฐ๋Šฅ์ด๋‹ค. ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด clickhouse๋Š” insert๋ฅผ ๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  buffer์— ์Œ“์•„๋‘” ๋‹ค์Œ์— ์ ๋‹นํžˆ ๋ชจ์•„์„œ flush๋ฅผ ํ•œ๋‹ค.

ํ”ํžˆ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋“ค์ด ์“ฐ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋†’์ด๊ณ ์ž ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๋‹ค/

์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ฐ˜์˜ ์ˆ˜์ค€์€ ์ „๋ณด๋‹ค ๋ชปํ•˜๊ฒ ์ง€๋งŒ, ๊ทธ๋ž˜๋„ write ์ฒ˜๋ฆฌ๋Ÿ‰์ด๋‚˜ write์— ๋”ฐ๋ฅธ ๋ถ€ํ•˜๋Š” ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.





์‚ฌ์šฉ๋ฒ•

์‚ฌ์šฉ์ž ์ž์ฒด์— async_insert๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋„ ์žˆ๊ณ 

ALTER USER default SETTINGS async_insert = 1

์ปค๋„ฅ์…˜ ์ˆ˜์ค€์—์„œ async insert๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ

"jdbc:ch://HOST.clickhouse.cloud:8443/?user=default&password=PASSWORD&ssl=true&custom_http_params=async_insert=1,wait_for_async_insert=1"

INSERT ์ฟผ๋ฆฌ ์ˆ˜์ค€์—์„œ๋„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

INSERT INTO table_name(...) SETTINGS async_insert=1, wait_for_async_insert=1 VALUES (...)

์ด๋Ÿฌ๋ฉด async ๋ชจ๋“œ๋กœ INSERT๋ฅผ ์‹œ๋„ํ•œ๋‹ค.

async_insert๋Š” ASYNC ๋ชจ๋“œ๋กœ insert๋ฅผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

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

์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” wait_for_async_insert=1๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. ์ด๋Ÿฌ๋ฉด ์‹ค์ œ๋กœ ํด๋ผ์–ธํŠธ๊ฐ€ ๋””์Šคํฌ์— flush๋˜๊ธฐ๊นŒ์ง€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ , ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ์‹คํŒจํ–ˆ๋Š”์ง€๋„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.





์ฒ˜๋ฆฌ๋Ÿ‰ ๋น„๊ต

์‹ค์ œ๋กœ async insert ์—ฌ๋ถ€์— ๋”ฐ๋ผ์„œ ์–ผ๋งˆ๋‚˜ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ฐจ์ด๊ฐ€ ๋‚˜๋‚˜ ๋น„๊ต๋ฅผ ํ•ด๋ดค๋‹ค.
1000๋งŒ๊ฐœ๋ฅผ ๋ณ„๋„ insert๋กœ ๋ฐ€์–ด๋„ฃ์„ ๋•Œ, non-async๋Š” ์ดˆ๋‹น 300๊ฐœ ์ •๋„ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๊ณ 

.png?type=w800)

async๋Š” ์ดˆ๋‹น 2000๊ฐœ ์ •๋„ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๋‹ค.

ํ™•์‹คํžˆ ์œ ์˜๋ฏธํ•˜๊ฒŒ ์ฐจ์ด๊ฐ€ ๋‚˜๊ธด ํ•œ๋‹ค.



์ฐธ์กฐ
https://clickhouse.com/docs/optimize/asynchronous-inserts
https://www.glassflow.dev/blog/asynchronous-inserts-clickhouse
https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse