IL-0547 Buildkite · 2025-11-10database
Buildkite 의 Agent API, REST API, GraphQL 이 annotations 테이블 쿼리 타임아웃으로 4시간 가까이 저하됐다
2025년 11월 10일 04:48 UTC 에 Buildkite 는 Pipelines 제품의 annotations 를 저장하는 테이블에서 인덱스 하나를 지우는 데이터베이스 마이그레이션을 적용했다. 지운 인덱스를 대신할 인덱스가 이미 있었지만, 트래픽이 많은 소수의 쿼리가 예상과 달리 새 인덱스를 타지 않았다. 데이터베이스 마이그레이션은 모든 샤드에 동시에 적용된다.
04:53 UTC 에 annotations 테이블 쿼리의 타임아웃이 감지됐다. 타임아웃 난 쿼리 다수는 에이전트가 새 annotation 을 만드는 명령에서 나왔다. 이 쿼리들 때문에 영향을 받은 데이터베이스의 CPU 부하가 크게 올랐고 Pipelines 의 모든 기능이 느려졌다. 팀은 바로 지운 인덱스를 다시 만들기 시작해 05:30 UTC 까지 데이터베이스 샤드의 절반쯤에서 끝냈고, 서비스 일부가 돌아왔다. 나머지 샤드에서는 annotations 테이블로 계속 들어오는 쿼리 부하 때문에 인덱스를 효율적으로 다시 만들 수 없었다.
팀은 여럿으로 나뉘어 부하를 줄일 방법을 찾았다. 제품에서 annotation 기능을 끄는 방법, 새 annotation 을 다른 테이블로 보내는 방법, 테이블 수준 권한으로 annotations 테이블을 막는 방법을 살폈다. 가장 깔끔하고 효율적인 방법은 애플리케이션 사용자의 annotations 테이블 읽기·쓰기 권한을 잠시 빼는 것이었다. 여기에 Postgres 의 max_parallel_maintenance_workers 를 늘려 인덱스 생성 속도를 크게 올렸다. 07:50 UTC 부터 08:43 UTC 까지 읽기·쓰기 권한을 뺀 상태에서 나머지 샤드의 인덱스를 다시 만들었고, Agent API, REST API, GraphQL 의 지연과 오류율이 평소 수준으로 돌아왔다. 장애로 일관되지 않은 상태가 된 일부 에이전트와 잡은 이어진 4시간 동안 풀어 주고 정리했으며, 손으로 해야 했던 작업은 11:56 UTC 에 끝났다.
- 심각도
- –
- 영향 범위
- Agent API severely degraded for most customers from 04:48 to 05:30 UTC and for some until 08:43 UTC; REST API, GraphQL and Web UI degraded from 04:48 to 08:43 UTC; some agents and jobs left inconsistent until 11:56 UTC
- 영향 사용자
- Most Buildkite customers
- 지역
- –
- 감지까지
- 5m
- 복구까지
- 3h 55m
증상
2025년 11월 10일 04:48 UTC 부터 Buildkite 의 Agent API 가 대부분의 고객에게 심하게 저하됐고, REST API, GraphQL, Web UI 도 오류율이 오르고 느려졌다.
04:53 UTC 에 annotations 테이블의 쿼리가 타임아웃 나는 것이 보였다. 타임아웃 난 쿼리 가운데 다수는 에이전트가 새 annotation 을 만드는 명령에서 나왔다. 이 쿼리들 때문에 영향을 받은 데이터베이스의 CPU 부하가 크게 올라 Pipelines 의 모든 기능이 느려졌다.
상태 페이지에는 05:22 UTC 에 빌드 annotation 표시에 문제가 있어 웹 UI 에서 빌드를 보는 데 영향이 있을 수 있다는 글이 먼저 올라왔다. 05:30 UTC 에는 REST API, GraphQL API, Web UI 의 오류율 증가와 느린 성능을 알렸다.
05:30 UTC 까지 데이터베이스 샤드의 절반쯤에서 인덱스를 다시 만들어 서비스 일부가 돌아왔다. 나머지 샤드에서는 annotations 테이블로 계속 들어오는 쿼리 부하 때문에 인덱스를 효율적으로 다시 만들 수 없었고, 일부 고객의 Agent API 저하와 REST API, GraphQL 저하는 08:43 UTC 까지 이어졌다.
장애 뒤 일부 에이전트와 잡이 일관되지 않은 상태로 남았다. 스스로 회복하지 못한 경우는 손으로 처리했고 11:56 UTC 에 끝났다.
원인
- 촉발
- 2025년 11월 10일 04:48 UTC 에 Pipelines 제품의 annotations 를 저장하는 테이블에서 인덱스 하나를 지우는 데이터베이스 마이그레이션이 적용됐다. 대신할 인덱스가 이미 있었지만 트래픽이 많은 일부 쿼리가 새 인덱스를 타지 않았다.
감지
04:53 UTC 에 annotations 테이블 쿼리의 타임아웃으로 인덱스 삭제의 영향이 감지됐다.
조치
- 바로 지운 인덱스를 다시 만들기 시작해 05:30 UTC 까지 데이터베이스 샤드의 절반쯤에서 끝냈고, 서비스 일부가 돌아왔다.
- 나머지 샤드의 부하를 줄이려고 애플리케이션 사용자의 annotations 테이블 읽기·쓰기 권한을 잠시 뺐다.
- Postgres 의 max_parallel_maintenance_workers 를 늘려 인덱스 생성 속도를 크게 올렸다.
- 07:50 UTC 부터 08:43 UTC 까지 읽기·쓰기 권한을 뺀 상태에서 나머지 샤드의 인덱스를 다시 만들었고, Agent API, REST API, GraphQL 의 지연과 오류율이 평소 수준으로 돌아왔다.
- 일관되지 않은 상태로 남은 에이전트를 풀어 주고 잡 상태를 정리했다. 스스로 회복하지 못한 경우는 손으로 처리했고 11:56 UTC 에 끝났다.
후속 조치
- 코드 리뷰 때 위험한 마이그레이션을 짚어 주는 내부 도구가 인덱스 삭제도 다루도록 넓혔다. 이 도구는 인덱스를 지우는 마이그레이션을 배포하기 전에 그 인덱스가 더는 필요 없는지 엔지니어가 확인하게 한다.
- 지금은 데이터베이스 마이그레이션이 모든 샤드에 동시에 적용된다. 위험도가 높은 마이그레이션은 단계적으로 적용해 영향 범위를 좁히고, 문제가 생기면 더 빨리 복구할 수 있게 한다.
- 인덱스를 만들거나 지울 때의 분석을 개선하려고 HypoPG 같은 도구를 검토한다.
- pganalyze 의 인덱스 사용 데이터를 개발 흐름에서 더 잘 보이게 해, 엔지니어가 그 데이터를 보고 인덱스 변경을 결정하게 한다.
- 일부 에이전트의 일관되지 않은 상태를 풀 때 쓴 수작업 정리를 자동화해, 비슷한 문제에서 시스템이 스스로 회복하게 한다.
교훈
Buildkite 는 이 장애가 주로 데이터베이스 마이그레이션 하나에서 비롯됐고, 그 마이그레이션이 검토 과정의 빈틈을 드러냈다고 밝혔다.
출처
- https://www.buildkitestatus.com/incidents/sv6phcn6xwwg · official-status · 보관본
관련 사례
같은 원인 · 공통 데이터베이스
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-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-0523TANF-app 의 운영 배포가 PostgreSQL 마이그레이션 실패로 두 달 동안 막힘U.S. Department of Health and Human Services · 2023같은 원인 · 공통 데이터베이스
IL-0567쿠키런: 오븐브레이크의 패키지 매출 랭킹 기능을 배포한 뒤 Aurora MySQL CPU가 100%에 이르러 유저가 게임에 접속하지 못했다Devsisters · 2023같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0524인덱스를 다시 만드는 마이그레이션이 운영에서 Transactions 테이블을 잠가 Open Collective 서비스가 느려짐Open Collective · 2023같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0547
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0547/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.