IL-0487 Autumn · 2026-03-15database
Postgres 테이블 두 개의 콜레이션을 바꾼 뒤 데이터베이스 CPU가 치솟아 Autumn API 요청의 약 10%가 실패했다
Autumn은 가장 자주 도는 질의를 최적화하다가 부모 테이블과 자식 테이블의 콜레이션이 달라 인덱스가 쓰이지 않는 것을 찾았다. customers.internal_id는 KSUID 정렬을 위해 COLLATE "C"를 쓰는데, customer_entitlements.internal_customer_id 같은 외래 키 열은 기본 콜레이션을 썼다. Postgres는 콜레이션이 다른 열 사이에서 인덱스를 쓰지 못해, 10ms 안에 끝나야 할 이 질의가 약 150ms 걸렸다. customer_entitlements의 콜레이션을 바꾸자 CPU가 30% 줄고 질의가 훨씬 빨라졌다. 팀은 customer_entitlements, customer_products, entities, customers 네 테이블의 콜레이션을 이 순서로 맞추기로 했다.
2026-03-15 15:00 GMT 무렵 앞의 두 테이블을 바꾸자 주 질의가 인덱스를 잃어 성능이 크게 떨어졌고, 데이터베이스 CPU가 치솟으며 질의가 실패했다. ALTER TABLE로 되돌리려 했지만 배타 잠금이 필요했고, 잠금을 잡은 활성 질의가 늘 있어 교착 상태가 되풀이됐다. 질의 SQL에서 콜레이션을 맞추는 코드 수정도 부하 속에서 빨리 효과를 내지 못했다. 15:48에 PlanetScale 지원팀의 도움을 받아 모든 애플리케이션 연결을 끊고, 콜레이션 변경을 되돌리고, ANALYZE로 플래너 통계를 다시 만든 뒤 재시작했다. 질의는 바로 정상으로 돌아왔고, 16:15에 두 리전 모두에서 API와 대시보드가 정상임을 확인했다.
- 심각도
- –
- 영향 범위
- Autumn API: about 10% of requests failed from 15:00 to 16:15 GMT
- 영향 사용자
- –
- 지역
- both regions
- 감지까지
- 5m
- 복구까지
- 1h 15m
증상
2026-03-15 15:00 GMT 무렵 운영 데이터베이스의 두 테이블에 콜레이션 변경을 적용하자 데이터베이스 CPU가 치솟고 질의가 실패하기 시작했다. 16:15 GMT까지 Autumn API 요청의 약 10%가 실패했다.
고객 정보를 읽는 주 질의가 인덱스를 쓰지 못하게 되면서 성능이 크게 떨어졌다. 이 질의가 데이터베이스 CPU를 끌어올렸다.
15:05에 문제를 찾고 ALTER TABLE로 변경을 되돌리려 했다. ALTER TABLE은 테이블에 배타 잠금이 필요했는데 잠금을 잡은 활성 질의가 늘 있어서 교착 상태가 되풀이됐다.
15:20에는 스키마를 되돌리지 않고 인덱스를 쓰게 하려고 고객 정보를 읽는 주 질의에서 콜레이션을 명시적으로 캐스트하는 코드 수정을 배포했다. 데이터베이스 부하가 높아 이 수정은 충분히 빨리 효과를 내지 못했다.
원인
- 촉발
- 가장 자주 도는 질의를 최적화하던 중 관련 테이블 네 개의 콜레이션을 맞추기로 하고, 운영 데이터베이스에서 customer_entitlements와 customer_products의 콜레이션을 바꿨다.
감지
–
조치
- 15:48에 PlanetScale 지원팀의 도움을 받아 모든 애플리케이션 연결을 끊었다.
- 콜레이션 변경을 되돌렸다.
- ANALYZE로 플래너 통계를 다시 만든 뒤 재시작했다. 질의가 바로 정상으로 돌아왔고 CPU도 안정됐다.
후속 조치
- 앞으로 열과 스키마 마이그레이션은 모두 복제, 이중 쓰기, 전환 순서로 한다. 열을 제자리에서 바꾸지 않고 원하는 타입의 새 열을 만들어 두 열에 함께 쓰고, 기존 행을 작은 묶음으로 채우고, 인덱스를 동시 생성한 뒤 전환한다.
- 문제가 생겼을 때 상황을 투명하게 알리려고 상태 페이지를 만든다.
- 장애가 나도 유료 고객이 영향을 받지 않도록 check와 track SDK가 기본으로 fail-open 하게 바꾸는 방안을 검토한다.
교훈
–
출처
관련 사례
IL-0574운영 환경의 DB 접속 경로를 Amazon RDS Proxy로 바꾼 지 몇 분 만에 Aurora MySQL writer CPU가 100%에 이르고 에러가 났다Safie · 2026같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0179DEBUG 로그가 쏟아지자 동기 로깅을 하던 요청 스레드들이 가득 찬 stdout 파이프에서 멈춘 채 DB 커넥션을 쥐고 있어, HikariCP 커넥션 풀이 고갈되고 요청이 30초 주기로 한꺼번에 실패했다.MUSINSA · 2026같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0283Cloudflare 네트워크 전체에서 코어 프록시가 Bot Management 피처 파일을 읽다 실패해 사이트 방문자들이 HTTP 5xx 오류 페이지를 받았다Cloudflare · 2025같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0392데이터센터 전환을 앞두고 원형 복제를 설정하던 중 Wikimedia x1 섹션의 eqiad·codfw 사이 MariaDB 복제가 6분 멈췄다Wikimedia Foundation · 2024같은 원인 · 공통 데이터베이스
IL-0367Central US 의 Azure Storage 가 VM 디스크 요청을 거부해 VM 과 그 위의 SQL Database, Cosmos DB 가 멈췄다Microsoft Azure · 2024같은 원인 · 공통 데이터베이스
IL-0511Vault 가 새로 발급한 데이터베이스 자격 증명이 SCRAM 으로 만들어져 pgbouncer 가 RDS 에 로그인하지 못하고 xPro 운영 사이트가 멈췄다MIT Open Learning · 2023같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0487
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0487/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.