๐คฆโโ๏ธ "๋น์ฐํ ๊ฑธ ์งํค๋ ๊ฒ ์ด๋ ๊ฒ ์ด๋ ค์ด๊ฐ"
EC2 ํ๊ฒฝ์์ DuckDB๋ฅผ ์ฌ์ฉํ๋ ์๋น์ค์์ Collector writer๊ฐ ๊ฐํ์ ์ผ๋ก ๋ฝ ํ๋์ ์คํจํ๋ค.
์๋ฌ๋ ์ด๊ฑฐ์๋ค.
Could not set lock on file "analytics.db": Conflicting lock is held in PID 0
โ๋ฆฌ์์ค๋ ์ฐ๊ณ ๋๋ฉด ๋ซ์์ผ ํ๋ค.โ
๋๋ฌด ๋น์ฐํ ์๊ธฐ๋ผ ํ ๊ตฐ๋ฐ์์ ๋์ณค์ ๊ฑฐ๋ผ๊ณ ๋ ์ฒ์์ ์๊ฐ๋ ๋ชป ํ๋ค. ๊ทธ๋ฐ๋ฐ ๊ฒฐ๊ตญ ๐
๐งฑ "์ด๋ฏธ ๋ค ํ๊ณ ์๋ค๊ณ ์๊ฐํ๋๋ฐ"
๊ตฌ์กฐ๋ ์ฒ์๋ถํฐ ๋จ์ํ๊ฒ ์ก์๋ค.
Writer 1๋ช
, Reader N๋ช
.
Collector ํ๋๋ง DuckDB์ ์ฐ๊ณ , Detector์ API๋ read_only=True๋ก๋ง ์ ๊ทผํ๋ค. ๋์๋ณด๋๋ React + Vite๊ณ , ๋ฐ์ดํฐ๋ API๋ฅผ ํตํด์๋ง ๋ด๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ DuckDB์ ์ง์ ๋ถ๋ ์ปดํฌ๋ํธ๋ ์๋์๋ค.
Collector์ API๋ DuckDB ์ฐ๊ฒฐ์ ์ด๊ณ ๋๋ฉด ํญ์ ๋ซ๋๋ก ๊ตฌํํด ๋ ์ํ์๋ค.
๊ทธ๋์ ์ด๋ก ์์ผ๋ก๋ ๋ค ๋ง์ ๋ ๊ตฌ์กฐ๋ผ๊ณ ์๊ฐํ๋ค.
๐ "์ด๋์ ๋ฝ์ด ๊ฑธ๋ฆฐ ๊ฑด์ง"
์๋ฌ ๋ฉ์์ง์ ์ฐํ PID 0 ๋๋ฌธ์ ์ฒ์์ โ์ด๋ฏธ ์ฃฝ์ ํ๋ก์ธ์ค๊ฐ ๋จ๊ธด stale lockโ ์ชฝ์ผ๋ก๋ง ์๊ฐํ๋ค.
๊ทธ๋์ ์ด๋ฐ์๋ close() ๋ฌธ์ ์ผ ๊ฑฐ๋ผ๊ณ ๋ฐ๋ก ์ฐ๊ฒฐํ์ง ๋ชปํ๋ค.
๊ฐ๋ฅ์ฑ์ ์ธ ๊ฐ์ง๋ก ๋๋ด๋ค.
ํ๋๋ stale lock,
ํ๋๋ ์ฐ๊ฒฐ ๋์,
ํ๋๋ reader์ writer ์ ๊ทผ ํ์ด๋ฐ ๋ฌธ์ .
๊ทธ๋์ ํ๋์ฉ ํ์ธํ๋ค.
๋จผ์ Detector ์ฝ๋๋ถํฐ ๋ดค๋ค.
detect_spikes()์์ DuckDB read_only ์ฐ๊ฒฐ์ ์ฐ ๋ค, ๋ฐ์ดํฐ๊ฐ ๋ถ์กฑํ๋ฉด early return ํ๋ ๊ฒฝ๋ก๊ฐ ์์๊ณ ๊ทธ ๊ฒฝ๋ก์์๋ close()๊ฐ ํธ์ถ๋์ง ์์๋ค.
๊ทธ๋ค์ ๋ก๊ทธ ํ์๋ผ์ธ์ ๋ค์ ๋ดค๋ค.
์ฌ์์ ์งํ์๋ ์คํจํ๊ณ , ์๊ฐ์ด ์ง๋๋ฉด ์ฑ๊ณตํ๋ ํจํด์ด์๋ค.
์ผ์์ ์ธ ๋ฝ์ด๊ฑฐ๋, ์ฐ๊ฒฐ์ด ์๊ฐ์ด ์ง๋๋ฉฐ ์ ๋ฆฌ๋๋ ์ํฉ๊ณผ ๋ง์๋จ์ด์ก๋ค.
๋ง์ง๋ง์ผ๋ก ์ฌ์์ ์์๋ฅผ ๋ฐ๊ฟ๋ดค๋ค.
detector์ api๋ฅผ ๋จผ์ ๋ด๋ฆฌ๊ณ , collector๋ฅผ ๋์ค์ ์ฌ๋ฆฌ์ ๋ฐ๋ก ํด๊ฒฐ๋๋ค.
๊ธฐ์กด reader ์ฐ๊ฒฐ์ ๋จผ์ ์ ๋ฆฌํด์ผ writer๊ฐ ๋ฝ์ ์ก์ ์ ์๋ค๋ ๊ฒ ๋ช
ํํด์ก๋ค.
๐งฉ ๊ฒฐ๋ก
ํ ๋น ์ง๊ฒ๋ ์์ธ์ ๋ณต์กํ์ง ์์๋ค.
๋ซํ์ง ์์ reader ์ฐ๊ฒฐ,
์ด์ ํ๋ก์ธ์ค๊ฐ ๋จ๊ธด stale lock,
์ฌ๋ฌ reader๊ฐ ๊ฐ์ ํ์ผ์ ๋์์ ๋ถ๋ค๊ณ ์๋ ์ํฉ.
์ด ์ธ ๊ฐ์ง๊ฐ ๊ฒน์ณค๋ค.
๐ง 1์ฐจ ํด๊ฒฐ
detector์ api๋ฅผ ๋จผ์ ์ฌ์์ํ๊ณ ,
dashboard๋ ์ ์ ๋ด๋ ค๋๊ณ ,
collector๋ฅผ ์ฌ์์ํ ๋ค
๋ค์ dashboard๋ฅผ ์ฌ๋ ธ๋ค.
DB์ ๋ถ์ด ์๋ ์ฐ๊ฒฐ์ ์ ๋ถ ๋๊ณ writer๋ง ๊นจ๋ํ ์ํ์์ ๋ค์ ๋ถ์ธ๋ค.
์ด๊ฒ ๋์ด์๋ค.
๐ ๊ทผ๋ณธ ํด๊ฒฐ
Detector ์ชฝ DuckDB ์ ๊ทผ์ ์ ๋ถ try/finally๋ก ๊ฐ์๋ค.
early return์ด๋ ์ฟผ๋ฆฌ ๋์ค ์์ธ๊ฐ ๋๋ reader๊ฐ DB๋ฅผ ์ค๋ ๋ถ๋ค๊ณ ์์ง ์๊ฒ ํ๊ธฐ ์ํด์๋ค.
Collector ์ชฝ์๋ ๋ฝ ๊ด๋ จ ์์ธ๋ง ๊ณจ๋ผ exponential backoff๋ฅผ 3ํ๊น์ง๋ง ๋์๋ค. ์์งํ ๋ฝ ์์ธ๋ฅผ ์ง์ ๋ค๋ค๋ณธ ๊ฑด ์ด๋ฒ์ด ์ฒ์์ด์๋ค. ์๊ฐ์ ์ธ ๊ฒฝํฉ์ด๋ stale lock์ ์ฌ์๋๋ก ํก์ํ ํ์๊ฐ ์์๋ค.
๊ทธ๋ฆฌ๊ณ runbook.md์ DuckDB ๋ฝ ์ถฉ๋ ์ ์กฐ์น ์ ์ฐจ๋ฅผ ๋ฐ๋ก ์ ๋ฆฌํด ๋์๋ค.
OLAP ์ฉ์ผ๋ก DuckDB, OLTP ์ฉ์ผ๋ก Postgres๋ฅผ ์ฐ๊ณ ์์ด์
๋ฌธ์ ๊ฐ ๋๋ค๋ฉด DB ๊ฐ ์ถฉ๋์ด๊ฑฐ๋ Postgres ์ชฝ์ผ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์๋ค.
์ ์ ๋ฐ๋ชฉ์ ์ก์ ๊ฑด ํ์ผ ๊ธฐ๋ฐ DB ์ชฝ์ด์๋ค.
๐ฏ ์ ๋ฆฌ
๊ธฐ๋ณธ์ด๋ผ๊ณ ์๊ฐํ ๊ฒ๋ถํฐ ๋ค์ ๋ณด๊ฒ ๋๋ค.
์์ธ์ ํ๋๋ผ๊ณ ๋จ์ ์ง์ผ๋ฉด ์ ๋๋ค๋ ๊ฒ๋.
๊ทธ๋ฆฌ๊ณ ๊ตฌ์กฐ์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์ํ๋ ์๋ฌ๋ ๋ถ๋ช
ํ ์กด์ฌํ๋ค๋ ๊ฒ.
์ค์ํ ๊ฑด,
๊ทธ ์๋ฌ๋ฅผ โ์ด์ฉ ์ ์๋ ๊ฒโ์ผ๋ก ๋๊ธฐ์ง ์๊ณ
์ด์์์ ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ํ๋ก ๋ง๋๋ ์ฅ์น๋ฅผ ๋๋ ๊ฒ. ๐ข


์ฝํ
์ธ ๋ฅผ ๋ ์ฝ๊ณ ์ถ๋ค๋ฉด?
์ํฐ๋์ ๊ฐ์
ํด ์ฃผ์ธ์.
๋ก๊ทธ์ธ ํ ๋ชจ๋ ๊ธ์ ๋ณผ ์ ์์ต๋๋ค.
๋ก๊ทธ์ธ ํ ๋ชจ๋ ๊ธ์ ๋ณผ ์ ์์ต๋๋ค.
ใป๋๊ธ 1