Postgres 잠금은 확장되지 않습니다: 15,000개 프로세스가 단일 GIN 인덱스에서 교착 상태를 일으켜 Recall.ai의 데이터베이스를 마비시킨 방법

Postgres locks do not scale

Postgres 잠금은 확장되지 않습니다: 15,000개 프로세스가 단일 GIN 인덱스에서 교착 상태를 일으켜 Recall.ai의 데이터베이스를 마비시킨 방법

Recall.ai의 Postgres 데이터베이스가 예고 없이 CPU 100%로 치솟아 전체 서비스가 마비된 사건을 분석한 글입니다. 원인은 수만 개의 봇이 동시에 'joining_call' 이벤트를 발생시키면서 GIN 인덱스 확장 잠금에 대한 대규모 convoy가 형성된 것이었습니다. 모든 프로세스가 동시에 교착 상태를 감지하려 하면서 잠금 관리자 파티션 잠금에 두 번째 convoy가 발생했고, 이로 인해 시스템 시간이 폭주했습니다. RDS의 관리형 서비스 특성상 상세 분석이 어려웠지만, 보안 그룹과 연결 제한을 활용해 복구했고, 사후 분석을 통해 동기화된 대규모 작업이 어떻게 데이터베이스를 마비시킬 수 있는지 보여줍니다.

동기화된 대규모 작업은 특별한 주의가 필요합니다. 작은 작업이라도 동기화되어 대규모로 발생하면 재앙이 될 수 있습니다.