IL-0524 Open Collective · 2023-04-04database
인덱스를 다시 만드는 마이그레이션이 운영에서 Transactions 테이블을 잠가 Open Collective 서비스가 느려짐
Open Collective 는 2023년 4월 4일 성능을 높이려고, 소프트 삭제된 행을 빼고 Transactions 테이블의 인덱스를 다시 만드는 마이그레이션을 배포했다. 마이그레이션은 로컬에서 시험했고 staging 에서도 성공했다. 운영에서는 이 마이그레이션이 Transactions 테이블 전체를 잠가 서비스가 느려졌다. 인덱스 생성은 `CONCURRENTLY` 로 돌렸지만, Transactions 테이블에 끊임없이 들어오는 많은 쿼리가 마이그레이션과 부딪쳐 테이블이 잠긴 것으로 보였다. 옛 인덱스를 먼저 지우고 새 인덱스를 만드는 방식이었기 때문에, 그 사이에 들어온 쿼리는 인덱스를 전혀 쓰지 못했고 이것이 성능 저하를 크게 키웠다.
엔지니어들은 마이그레이션을 죽였지만 테이블은 잠긴 채로 남았다. 쿼리를 줄이려고 프런트엔드를 점검 모드로 돌리고 데이터베이스의 다른 연결을 닫은 뒤, 새 인덱스 생성을 취소하고 10:00 UTC 부터 옛 인덱스를 되살렸다. 복원은 10:05 UTC 에 끝났고, 10:08 UTC 에 프런트엔드를 되살리고 문제가 해결됐다고 공식으로 확인했다.
- 심각도
- –
- 영향 범위
- Open Collective's service was degraded while the Transactions table was locked, and the frontend was in maintenance mode for part of that time, from 09:20 to 10:08 UTC
- 영향 사용자
- –
- 지역
- –
- 감지까지
- 7m
- 복구까지
- 55m
증상
2023년 4월 4일 09:13 UTC 에 배포를 시작하고 7분 뒤인 09:20 UTC 에 서비스 성능 저하가 보였다. 운영에서 실행한 마이그레이션이 Transactions 테이블 전체를 잠근 상태였다.
엔지니어들이 마이그레이션을 죽였지만 테이블은 계속 잠겨 있었다. 프런트엔드를 점검 모드로 돌리고 데이터베이스의 다른 연결을 닫은 뒤 옛 인덱스를 되살렸다.
원인
원인 배포 결함
- 촉발
- 2023년 4월 4일 09:13 UTC 에 성능을 높이려고, 소프트 삭제된 행을 빼고 Transactions 테이블의 인덱스를 다시 만드는 마이그레이션을 배포했다.
감지
배포를 시작하고 7분 뒤인 09:20 UTC 에 서비스 성능 저하를 알아챘다.
조치
- 마이그레이션을 죽였지만 Transactions 테이블은 잠긴 채로 남았다.
- 쿼리를 줄이려고 프런트엔드를 점검 모드로 돌렸다. 사용자에게는 분명한 안내 문구가 보였다.
- 데이터베이스에 붙어 있던 다른 연결을 닫았다.
- 새 인덱스 생성을 취소하고 10:00 UTC 부터 옛 인덱스를 되살렸으며, 10:05 UTC 에 복원이 끝나 성능이 정상으로 돌아왔다.
- 10:08 UTC 에 프런트엔드를 되살리고 문제가 해결됐다고 공식으로 확인했다.
후속 조치
- vegeta 같은 도구로 로컬에서 운영 부하를 흉내 내는 스크립트를 더한다.
- 이런 마이그레이션은 정해진 점검 시간대에 돌린다.
- 앞으로 마이그레이션은 새 인덱스를 먼저 만들고 옛 인덱스를 나중에 지운다.
- PR 을 머지하기 전에 다른 엔지니어의 리뷰를 꼭 받는다. 이번 PR 은 팀에 공유됐지만 리뷰되지 않았다.
교훈
옛 인덱스를 지우고 새 인덱스를 만드는 방식은 쿼리가 끊임없이 들어오는 테이블에서 너무 낙관적이었다. 로컬과 staging 에서 시험해도 부하가 걸린 환경에서 마이그레이션을 돌려 볼 도구가 없으면 이런 문제를 미리 잡지 못한다. 문제를 빨리 알아채고 엔지니어 두 명이 함께 조사한 것과, 사용자에게 분명한 안내를 보이면서 영향을 줄인 프런트엔드 점검 모드는 도움이 됐다.
출처
참고 문서
관련 사례
같은 원인 · 공통 데이터베이스, 스키마 마이그레이션
같은 원인 · 공통 데이터베이스, 스키마 마이그레이션
같은 원인 · 공통 데이터베이스, 스키마 마이그레이션
IL-0523TANF-app 의 운영 배포가 PostgreSQL 마이그레이션 실패로 두 달 동안 막힘U.S. Department of Health and Human Services · 2023같은 원인 · 공통 데이터베이스, 스키마 마이그레이션
같은 원인 · 공통 데이터베이스, 스키마 마이그레이션
같은 원인 · 공통 데이터베이스
IL-0136Sweden Central 리전에서 내부 서비스 배포가 캐시를 비워 메타데이터 백엔드에 평소 20배의 트래픽이 몰렸고, 데이터베이스 연결에 기대는 헬스 체크가 인스턴스를 계속 재시작시켜 Azure OpenAI 요청이 6시간 가까이 실패했다Microsoft Azure · 2026같은 원인 · 공통 데이터베이스
IL-0510MIT Learn 운영 RDS PostgreSQL 의 저장 공간이 임시 파일로 가득 차 learn.mit.edu 가 세 시간 동안 503 과 504 를 냈다MIT Open Learning · 2026같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0547Buildkite 의 Agent API, REST API, GraphQL 이 annotations 테이블 쿼리 타임아웃으로 4시간 가까이 저하됐다Buildkite · 2025같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0324External Storage 데이터베이스 클러스터에 과부하가 걸려 mw-api-int, mw-parsoid, mw-jobrunner 의 지연과 데이터베이스 오류가 늘었다Wikimedia Foundation · 2025같은 원인 · 공통 데이터베이스
IL-0307Supabase us-east-1 에서 Supavisor 2.0 업그레이드 뒤 Postgres 연결 풀러가 테넌트 약 80% 의 연결을 끊었다Supabase · 2025같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0567쿠키런: 오븐브레이크의 패키지 매출 랭킹 기능을 배포한 뒤 Aurora MySQL CPU가 100%에 이르러 유저가 게임에 접속하지 못했다Devsisters · 2023같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0524
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0524/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.