PostgreSQL 4

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ ์ •๋ฆฌ (3) PostgreSQL

ํ•ต์‹ฌ ์š”์•ฝ์ตœ๊ทผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ผ์ผ ์ ๊ฒ€์„ ์ž๋™ํ™”ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋งก๊ฒŒ ๋˜๋ฉด์„œ, DBA๊ฐ€ ๋งค์ผ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ๋“ค์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ •๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๊ธ€์—์„œ MySQL, ๋‘ ๋ฒˆ์งธ ๊ธ€์—์„œ Oracle์„ ๋‹ค๋ค˜๋Š”๋ฐ, ์ด๋ฒˆ PostgreSQL์ด ์‹œ๋ฆฌ์ฆˆ์˜ ๋งˆ์ง€๋ง‰์ž…๋‹ˆ๋‹ค. PostgreSQL์€ ๊ฐ™์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฉด์„œ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ์•ž์˜ ๋‘˜๊ณผ ๋˜ ๋‹ฌ๋ผ์„œ, ์ง€ํ‘œ ์ด๋ฆ„์—๋„ ๋‹ค๋ฅธ DB์—๋Š” ์—†๋Š” ๋‹จ์–ด๋“ค์ด ๋ณด์˜€์Šต๋‹ˆ๋‹ค. Dead Tuple, VACUUM, Age, autovacuum ๊ฐ™์€ ๋ง์ด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋„ ํ•˜๋‚˜์”ฉ ์ •๋ฆฌํ•ด ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.์ด ๊ธ€์—์„œ๋Š” PostgreSQL(๋ฐ PostgreSQL on RDS)์—์„œ ์ž์ฃผ ๋ณด๋Š” ์ง€ํ‘œ๋“ค์„ โ‘  ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ โ‘ก ํ‰์†Œ ์–ด๋А ์ •๋„ ๊ฐ’์ด ์ •์ƒ์ธ์ง€(์‹ค์ œ ๊ด€์ธก ..

DBA์™€ ์†Œํ†ตํ•˜๊ธฐ ์œ„ํ•œ DB ๋ชจ๋‹ˆํ„ฐ๋ง ์ง€ํ‘œ ๊ธฐ์ดˆ

ํ•ต์‹ฌ ์š”์•ฝDB ์ผ์ผ ์ ๊ฒ€ ์ž๋™ํ™” POC๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋จผ์ € ๋ง‰ํžŒ ๋ถ€๋ถ„์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๋ผ ์ง€ํ‘œ ๊ทธ ์ž์ฒด์˜€์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ผ DBA๊ฐ€ ๋งค์ผ ๋ณด๋Š” ์ง€ํ‘œ(Active Session, Row Lock Waits, Redo, Vacuum ๊ฐ™์€ ๊ฒƒ๋“ค)๊ฐ€ ๋ฌด์—‡์„ ๋œปํ•˜๋Š”์ง€, ์–ด๋–ค ๊ฐ’์ด ์ •์ƒ์ด๊ณ  ์–ด๋–ค ๊ฐ’์ด ์œ„ํ—˜์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฐ’์ด ์ด์ƒํ•˜๋ฉด ๋ฌด์—‡์„ ๋“ค์—ฌ๋‹ค๋ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์ž๋™ ์ ๊ฒ€ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๋ ค๋ฉด ๊ฒฐ๊ตญ ์ด ์ง€ํ‘œ๋“ค์„ ์ œ๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.์ด ๊ธ€์€ ๊ทธ ๊ณผ์ •์—์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. DB ๋ชจ๋‹ˆํ„ฐ๋ง์—์„œ ์ž์ฃผ ๋ณด๋Š” ์ง€ํ‘œ๋ฅผ 9๊ฐœ ๋ฌถ์Œ(CPU·์„ธ์…˜·์—ฐ๊ฒฐ·๋ฝ·์žฅ๊ธฐ์ฟผ๋ฆฌ·์“ฐ๊ธฐ·IO·๋ฉ”๋ชจ๋ฆฌ·์Šคํ† ๋ฆฌ์ง€)์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ์ง€ํ‘œ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€, ์ผ์ƒ์ ์ธ ๋น„์œ ๋กœ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•˜๋ฉด ๋˜๋Š”์ง€, Oracle·MySQL·..

DB ์ผ์ผ ์ ๊ฒ€ ์ž๋™ํ™” POC (1) ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

ํ•ต์‹ฌ ์š”์•ฝํ•œ ๋Œ€๊ธฐ์—… ์ œ์กฐ์‚ฌ์—์„œ DBA๊ฐ€ ๋งค์ผ ์•„์นจ 30๋ถ„~1์‹œ๊ฐ„์”ฉ ์†์œผ๋กœ ํ•˜๋˜ DB ์ ๊ฒ€์„, AI๊ฐ€ ์ž๋™ ๋ถ„์„ํ•ด ๋งค์ผ ์˜ค์ „ 8์‹œ HTML ๋ฉ”์ผ๋กœ ๋ณด๋‚ด์ฃผ๋Š” ์‹œ์Šคํ…œ์„ 2์ฃผ POC๋กœ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.๋Œ€์ƒ์€ AWS RDS ์œ„์˜ Oracle·MySQL·PostgreSQL 3์ข…. ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ์†”๋ฃจ์…˜(DPM)์ด 1๋ถ„ ๋‹จ์œ„๋กœ ์ง‘๊ณ„ํ•œ ์‹œ๊ณ„์—ด ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.์ „์ฒด๋Š” main.py๊ฐ€ collector → detector → reporter → mailer 4๊ฐœ ๋ชจ๋“ˆ์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด๋ฒˆ ๊ธ€์€ ๊ทธ ์ฒซ ๋‹จ๊ณ„์ธ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(collector.py)์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.collector์˜ ํ•ต์‹ฌ ์„ค๊ณ„ ๋ชฉํ‘œ๋Š” "๋‚˜์ค‘์— ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜๊ฐ€ ์—‘์…€์—์„œ ์‹ค์ œ API๋กœ ๋ฐ”๋€Œ์–ด๋„, ์ด ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ๊ณ ์น˜๋ฉด ๋˜๊ฒŒ" ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค...

PgBouncer ๋’ค์—์„œ @Transactional ์“ฐ๊ธฐ๋งŒ ์ฃฝ์—ˆ๋‹ค — log4jdbc๊ฐ€ ๋ถ€๋ฅธ ํŠธ๋žœ์žญ์…˜ ์žฅ์•  ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

์ฝ๊ธฐ๋Š” ๋ฉ€์ฉกํ•œ๋ฐ ์“ฐ๊ธฐ๋งŒ ์ „๋ถ€ 500์œผ๋กœ ์ฃฝ์—ˆ๋‹ค. ๊ทธ๊ฒƒ๋„ ์–ด์ œ๊นŒ์ง€ ์ž˜ ๋Œ๋˜ ์„œ๋น„์Šค๊ฐ€. ๋ฒ”์ธ์€ ์˜์™ธ๋กœ "SQL ๋กœ๊ทธ ์ข€ ์˜ˆ์˜๊ฒŒ ๋ณด๋ ค๊ณ " ๋ผ์›Œ ๋„ฃ์€ ๋“œ๋ผ์ด๋ฒ„์˜€๋‹ค. PgBouncer ๋’ค์—์„œ @Transactional ์“ฐ๊ธฐ ์š”์ฒญ๋งŒ ๊ณจ๋ผ ์ฃฝ์ด๋˜ ์ด ์žฅ์• ๋ฅผ ์–ด๋–ป๊ฒŒ ์žก์•˜๋Š”์ง€ ์ •๋ฆฌํ•œ๋‹ค.ํ•ต์‹ฌ ์š”์•ฝ์ฆ์ƒ: ์กฐํšŒ(SELECT)๋Š” ์ •์ƒ, @Transactional ์“ฐ๊ธฐ ์š”์ฒญ๋งŒ ์ „๋ถ€ 500 (CannotCreateTransactionException). ํ—ฌ์Šค์ฒดํฌ๋„ DOWN.ํ™˜๊ฒฝ: ์•ฑ์ด PostgreSQL์— ์ง์ ‘ ๋ถ™์ง€ ์•Š๊ณ  PgBouncer(์ปค๋„ฅ์…˜ ํ’€๋Ÿฌ)๋ฅผ ๊ฒฝ์œ . pool_mode = transaction.๋ฐฉ์•„์‡ : ๋ˆ„๊ตฐ๊ฐ€ JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ org.postgresql.Driver → log4jdbc(DriverSpy, SQL ๋กœ๊น… ..