[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