피드로 돌아가기
APScheduler's Advisory Lock Failure: My Solo VM's Scheduler Died Permanently
Dev.toDev.to
Backend

PostgreSQL Advisory Lock 대체 및 Lease 기반 Leader Election 구현을 통한 스케줄러 안정화

APScheduler's Advisory Lock Failure: My Solo VM's Scheduler Died Permanently

박준희2026년 6월 5일4intermediate

Context

Single VM 환경에서 APScheduler의 중복 실행 방지를 위해 PostgreSQL Advisory Lock을 활용한 Leader Election 구조를 채택함. 하지만 Connection Pooler 부재 및 asyncpg 전용 연결 환경에서 Session State 불일치로 인해 Lock이 암묵적으로 해제되어 스케줄러가 영구 중단되는 장애 발생.

Technical Solution

  • Session State 의존성을 완전히 제거하기 위해 DB Table 기반의 Time-based Lease 메커니즘으로 전환
  • 모든 Worker의 Scheduler를 paused=True 상태로 시작하여 임의 실행을 원천 차단하는 구조 설계
  • 25초 주기로 Atomic DML(UPDATE)을 실행하여 Holder 갱신 및 Leadership 획득을 시도하는 로직 구현
  • Heartbeat 컬럼에 75초의 Lease Time을 설정하여 Leader 장애 시 자동 Failover가 가능한 가용성 확보
  • 깨끗한 종료 시 Lease를 즉시 해제하여 새로운 Leader의 빠른 승격을 유도하는 최적화 적용
  • Application State보다 Database의 실제 레코드를 유일한 Source of Truth로 간주하는 검증 체계 구축

- 분산 환경의 Leader Election 설계 시 Session 기반 Lock보다 상태 저장형 Table 기반 Lease 방식 검토 - DB Lock 사용 시 Application이 인식하는 Lock 상태와 DB 실제 상태의 불일치 가능성 검증 - 장애 복구 자동화를 위해 Heartbeat 기반의 Lease 유효 기간(TTL) 설정 및 Failover 시나리오 설계

원문 읽기