피드로 돌아가기
Dev.toDatabase
원문 읽기
PostgreSQL AccessExclusiveLock 제거를 통한 Zero Downtime Migration 전략
Zero Downtime Database Migrations: A Practical Guide for PostgreSQL
AI 요약
Context
PostgreSQL의 DDL 작업 시 발생하는 AccessExclusiveLock으로 인한 모든 읽기/쓰기 쿼리 차단 및 서비스 장애 가능성 분석. 특히 대규모 테이블의 인덱스 생성 및 컬럼 타입 변경 시 발생하는 Table Rewrite로 인한 가용성 저하 문제를 해결하고자 함.
Technical Solution
- CREATE INDEX CONCURRENTLY 활용을 통한 쓰기 쿼리 차단 없는 인덱스 구축 및 Non-transactional 설정 적용
- PostgreSQL 11+의 Catalog-stored defaults 기능을 이용한 즉각적인 컬럼 추가 구조 설계
- Expand-Contract 패턴 및 View 레이어 도입을 통한 서비스 중단 없는 컬럼 이름 변경 프로세스 구축
- New Column 생성, Trigger 기반 Dual Write, Batch Backfill 단계를 거치는 컬럼 타입 변경 아키텍처 설계
- lock_timeout 설정을 통한 DDL 대기 큐 적체 및 연쇄적 API 장애 방지 장치 마련
- golang-migrate 및 Flyway의 트랜잭션 제어를 통한 DDL 실행 제약 조건 최적화
실천 포인트
1. 모든 DDL 문에 lock_timeout(예: 5s) 설정 적용 여부 확인
2. 인덱스 생성 시 반드시 CONCURRENTLY 옵션 사용 및 트랜잭션 제외 설정 검토
3. 10만 건 이상의 데이터 업데이트 시 단일 쿼리가 아닌 Batch 단위 처리 설계
4. 컬럼 타입 변경 시 Direct Alter 대신 '신규 컬럼 생성 → 트리거 동기화 → 데이터 이관 → 스왑' 단계 준수