
백엔드
RDS PostgreSQL 트랜잭션 ID 랩어라운드 방지를 위한 autovacuum 모니터링에 postgres_get_av_diag() 사용하기
두줄요약
RDS PostgreSQL의 autovacuum 지연과 XID 랩어라운드 위험을 줄이기 위해 postgres_get_av_diag() 활용법을 소개했습니다. Lambda, EventBridge, SES를 연결해 차단 원인을 주기적으로 감지하고 알림하는 방법을 설명했습니다.
문제 상황
- RDS PostgreSQL에서 autovacuum 지연으로 트랜잭션 수행 불가, 성능 저하, 가용성 위험이 발생하는 상황
- 장기 실행 트랜잭션, 준비된 트랜잭션, 복제 슬롯, hot_standby_feedback 등으로 freeze 작업이 막혀 XID 랩어라운드 위험이 커짐
- 20억 개 미고정 트랜잭션 임계값에 근접하면 쓰기 트랜잭션이 중단될 수 있음
원인 분석
- 공격적 autovacuum이 테이블 전체 페이지를 스캔하며 XID freeze를 수행해야 하지만, 여러 블로커에 의해 지연됨
- CloudWatch의 MaximumUsedTransactionIDs는 조기 경보용이지만, 실제 차단 원인 식별에는 상세 진단이 부족함
- postgres_get_av_diag()는 적응형 autovacuum 기준과 autovacuum_freeze_max_age를 반영해 차단을 진단
해결 방법
- rds_tools 확장을 설치하고 postgres_get_av_diag()로 autovacuum 차단 정보를 조회
- autovacuum_lagging_by 기준으로 블로커를 정렬해 우선순위 파악
- Lambda, Secrets Manager, CloudWatch Logs, SES, EventBridge를 조합해 주기적 모니터링과 이메일 알림 구성
주의할 점
- 함수 지원 버전은 RDS PostgreSQL 17.2+, 16.7+, 15.11+, 14.16+, 13.19+로 제한
- Lambda는 VPC, IAM 권한, SES 확인, Secrets Manager 비밀 구성, pg8000/boto3 패키징이 필요
- 모니터링 후 불필요한 AWS 리소스 정리 필요
적용해볼 점
- XID 임계값에 가까워지기 전에 CloudWatch 지표와 postgres_get_av_diag()를 함께 사용
- 반복 점검이 필요한 환경에서 EventBridge 기반 예약 실행 적용
- 복제 슬롯과 장기 트랜잭션 같은 autovacuum 블로커를 우선 점검
