PostgreSQL ํ™œ์„ฑ ์„ธ์…˜ ๊ธฐ๋ก - ์ƒˆ๋กœ์šด pgsentinel ํ™•์žฅ

ํšŒ์‚ฌ pgsentinel ๊ฐ™์€ ์ด๋ฆ„์˜ pgsentinel ํ™•์žฅ์ž๋ฅผ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค(๊นƒํ—ˆ๋ธŒ ์ €์žฅ์†Œ), PostgreSQL์— pg_active_session_history ๋ณด๊ธฐ(ํ™œ์„ฑ ์„ธ์…˜ ๊ธฐ๋ก(Oracle์˜ v$active_session_history์™€ ์œ ์‚ฌ))๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ณธ์งˆ์ ์œผ๋กœ ์ด๋Š” ๋‹จ์ˆœํžˆ pg_stat_activity์˜ ์ดˆ ๋‹จ์œ„ ์Šค๋ƒ…์ƒท์ด์ง€๋งŒ ์ค‘์š”ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ถ•์ ๋œ ๋ชจ๋“  ์ •๋ณด๋Š” RAM์—๋งŒ ์ €์žฅ๋˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋Ÿ‰์€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ €์žฅ๋œ ๋ ˆ์ฝ”๋“œ ์ˆ˜์— ๋”ฐ๋ผ ๊ทœ์ œ๋ฉ๋‹ˆ๋‹ค.
  2. queryid ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค - pg_stat_statements ํ™•์žฅ์˜ ๋™์ผํ•œ queryid์ž…๋‹ˆ๋‹ค(์‚ฌ์ „ ์„ค์น˜ ํ•„์š”).
  3. top_level_query ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค - ํ˜„์žฌ ์ฟผ๋ฆฌ๊ฐ€ ํ˜ธ์ถœ๋œ ์ฟผ๋ฆฌ์˜ ํ…์ŠคํŠธ(pl/pgsql์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)


pg_active_session_history ํ•„๋“œ์˜ ์ „์ฒด ๋ชฉ๋ก:

      ์นผ๋Ÿผ | ์œ ํ˜• ------+------------ ash_time | ์‹œ๊ฐ„๋Œ€๊ฐ€ ํฌํ•จ๋œ ํƒ€์ž„์Šคํƒฌํ”„ datid | oid ๋‚ ์งœ ์ด๋ฆ„ | ํ…์ŠคํŠธ PID | ์ •์ˆ˜ usesysid | oid ์‚ฌ์šฉ์ž ์ด๋ฆ„ | ํ…์ŠคํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜_์ด๋ฆ„ | ํ…์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ_์ฃผ์†Œ | ํ…์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ_ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ | ํ…์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ_ํฌํŠธ | ์ •์ˆ˜ backend_start | ์‹œ๊ฐ„๋Œ€๊ฐ€ ํฌํ•จ๋œ ํƒ€์ž„์Šคํƒฌํ”„ xact_start | ์‹œ๊ฐ„๋Œ€๊ฐ€ ํฌํ•จ๋œ ํƒ€์ž„์Šคํƒฌํ”„ query_start | ์‹œ๊ฐ„๋Œ€๊ฐ€ ํฌํ•จ๋œ ํƒ€์ž„์Šคํƒฌํ”„ state_change | ์‹œ๊ฐ„๋Œ€๊ฐ€ ํฌํ•จ๋œ ํƒ€์ž„์Šคํƒฌํ”„ wait_event_type | ํ…์ŠคํŠธ wait_event | ํ…์ŠคํŠธ ์ƒํƒœ | ํ…์ŠคํŠธ backend_xid | xid ๋ฐฑ์—”๋“œ_xmin | xid top_level_query | ํ…์ŠคํŠธ ์ฟผ๋ฆฌ | ํ…์ŠคํŠธ ์ฟผ๋ฆฌ ID | bigint backend_type | ํ…์ŠคํŠธ                     

์•„์ง ์„ค์น˜๋ฅผ ์œ„ํ•ด ๊ธฐ์„ฑํ’ˆ ํŒจํ‚ค์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์†Œ์Šค๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ์กฐ๋ฆฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์„œ๋ฒ„์— "devel" ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ  PATH ๋ณ€์ˆ˜์— pg_config ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค:

CD pgsentinel/src
ํ™•์ธ
์„ค์น˜ ๋งŒ๋“ ๋‹ค

postgres.conf์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

shared_preload_libraries = 'pg_stat_statements,pgsentinel'
track_activity_query_size = 2048
pg_stat_statements.track = ๋ชจ๋‘

# ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€๋œ ์ตœ๊ทผ ๋ ˆ์ฝ”๋“œ ์ˆ˜
pgsentinel_ash.max_entries = 10000

PostgreSQL์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ณ  ํ™•์žฅ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ํ™•์žฅ pgsentinel ์ƒ์„ฑ;

์ถ•์ ๋œ ์ •๋ณด๋ฅผ ํ†ตํ•ด ๋‹น์‚ฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์— ๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์–ด๋–ค ๋Œ€๊ธฐ ์„ธ์…˜์— ๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๋‚˜์š”?
  • ์–ด๋–ค ์„ธ์…˜์ด ๊ฐ€์žฅ ํ™œ๋ฐœํ–ˆ๋‚˜์š”?
  • ์–ด๋–ค ์š”์ฒญ์ด ๊ฐ€์žฅ ํ™œ๋ฐœํ–ˆ๋‚˜์š”?

๋ฌผ๋ก  SQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ด€์‹ฌ ์žˆ๋Š” ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ๋งˆ์šฐ์Šค๋กœ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜์—ฌ ๊ทธ๋ž˜ํ”„์—์„œ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌด๋ฃŒ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์–ด์š” PASH-๋ทฐ์–ด (์ˆ˜์ง‘๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ์„น์…˜์—์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋„ ์ž๋ฃŒ).

PASH-Viewer(๋ฒ„์ „ 0.4.0๋ถ€ํ„ฐ)๋Š” ์‹œ์ž‘ ์‹œ pg_active_session_history ๋ทฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋ˆ„์ ๋œ ์ „์ฒด ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์ƒˆ๋กœ์šด ์ˆ˜์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ฝ์–ด 15์ดˆ๋งˆ๋‹ค ๊ทธ๋ž˜ํ”„๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL ํ™œ์„ฑ ์„ธ์…˜ ๊ธฐ๋ก - ์ƒˆ๋กœ์šด pgsentinel ํ™•์žฅ

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€