본문으로 건너뛰기

3.3 핵심 Metric 지도

처음부터 모든 metric을 dashboard에 올리지 않습니다. Availability, workload, saturation, maintenance, durability라는 다섯 질문에 답할 최소 집합부터 고릅니다.

Availability

up{job="postgres"}
pg_up

up은 Prometheus가 exporter endpoint scrape에 성공했는지, pg_up은 exporter가 PostgreSQL 수집에 성공했는지를 나타냅니다.

uppg_up해석
0없음exporter/network/scrape 설정 문제
10exporter는 응답하지만 DB 접속 또는 수집 실패
11기본 수집 성공. 서비스 정상까지 보장하지는 않음

Connection과 saturation

현재 database별 backend 수는 gauge입니다.

sum by (instance) (
pg_stat_database_numbackends{datname!~"template.*"}
)

max_connections와 비교할 때는 superuser reserved slot, connection pool, 운영 접속 여유를 남깁니다. 숫자가 높다는 이유만으로 문제는 아닙니다. connection 대기나 신규 connection 실패와 함께 봅니다.

Transaction workload

sum by (instance) (
rate(pg_stat_database_xact_commit{datname!~"template.*"}[5m])
+ rate(pg_stat_database_xact_rollback{datname!~"template.*"}[5m])
)

Rollback 비율은 workload 성격에 따라 정상 범위가 다릅니다.

sum by (instance) (rate(pg_stat_database_xact_rollback[5m]))
/
sum by (instance) (
rate(pg_stat_database_xact_commit[5m])
+ rate(pg_stat_database_xact_rollback[5m])
)

Cache와 I/O

sum by (instance) (rate(pg_stat_database_blks_hit[5m]))
/
sum by (instance) (
rate(pg_stat_database_blks_hit[5m])
+ rate(pg_stat_database_blks_read[5m])
)

이 비율은 PostgreSQL shared buffer hit입니다. OS page cache hit는 포함하지 않으므로 낮은 비율을 곧바로 physical disk 병목으로 해석하지 않습니다. node_exporter의 disk latency와 PostgreSQL I/O timing을 함께 확인합니다.

Temporary file 증가량도 봅니다.

sum by (instance) (rate(pg_stat_database_temp_bytes[5m]))

증가가 크면 sort나 hash가 work_mem을 넘었을 가능성이 있지만, query workload와 실행계획을 확인하기 전까지 work_mem을 전역으로 올리지 않습니다.

Lock과 deadlock

sum by (instance, mode) (pg_locks_count)

pg_locks_count는 mode별 lock 개수이지 blocking session 수가 아닙니다. AccessExclusiveLock 증가를 탐지하는 데는 도움이 되지만 blocking chain은 pg_blocking_pids()로 확인합니다.

Deadlock은 counter 증가를 경보 후보로 삼습니다.

increase(pg_stat_database_deadlocks[10m]) > 0

WAL과 replication

Replica에서는 다음 gauge를 확인합니다.

pg_replication_is_replica
pg_replication_lag_seconds
pg_replication_last_replay_seconds

lag_seconds가 0이어도 WAL receive와 replay 위치가 같은 idle replica일 수 있습니다. 쓰기가 없는 시간에는 time lag만으로 복제 건강을 판정하기 어렵습니다. WAL byte 차이, receiver 상태, primary의 sender 상태를 함께 확인합니다.

Replication slot이 inactive인데 retained WAL이 계속 증가하면 disk capacity 문제로 이어질 수 있습니다. Slot active 상태와 WAL 보존량을 함께 경보화합니다.

Maintenance와 table 통계

stat_user_tables collector는 live/dead tuple, vacuum/analyze 시각과 횟수를 제공합니다. Table별 series가 생기므로 table 수가 많은 cluster에서는 cardinality를 먼저 계산합니다.

운영 우선순위는 다음과 같습니다.

  1. transaction ID wraparound까지 남은 여유
  2. 오래된 transaction과 vacuum 방해 session
  3. dead tuple 증가 속도
  4. autovacuum 실행 여부와 소요 시간
  5. table BLOAT 추정

Dashboard 최소 구성

  • up, pg_up
  • TPS와 rollback ratio
  • connection 사용량
  • lock mode와 deadlock 증가량
  • cache hit ratio와 temp bytes/s
  • WAL rate와 checkpoint
  • replica lag와 slot retained WAL
  • oldest transaction age와 dead tuple
  • node CPU pressure/memory pressure/disk latency

Metric 이름은 exporter release에 따라 달라질 수 있으므로 배포한 version의 /metrics를 기준으로 panel과 rule을 검증합니다.