IL-0369 Railway · 2025-12-09database
데이터베이스 마이그레이션이 잠금에 막히는 동안 Railway 백엔드 복제본이 헬스 체크에 실패해 대시보드와 API 가 멈췄다
Railway 는 공유 PostgreSQL 데이터베이스에 연결된 백엔드로 돌아가고, 연결 풀링은 PgBouncer 가 맡는다. 백엔드 요청은 여러 복제본이 나눠 받고, 복제본은 주기적인 헬스 체크를 통과해야 트래픽을 계속 받는다. 데이터베이스 연결을 얻지 못한 복제본은 비정상으로 표시되어 트래픽을 받지 않는다.
12월 9일 Railway 는 약 10억 행이 있는 테이블에 nullable 열을 더하는 마이그레이션을 배포했다. 이 테이블에서 오래 도는 쿼리가 잠금을 잡고 있어 마이그레이션이 멈췄다. 그 사이 연결 시도가 쌓여 PgBouncer 가 데이터베이스의 연결 한도를 넘었고, 복제본들이 헬스 체크에 실패해 트래픽 대상에서 빠졌다. 오래 돌던 쿼리가 끝나 잠금을 풀자 마이그레이션이 곧바로 적용됐다. 복제본은 다시 연결하고 헬스 체크를 통과해 트래픽 대상으로 돌아왔다. 15:26 UTC 에 백엔드가 안정돼 다시 트래픽을 받았다.
- 심각도
- –
- 영향 범위
- Railway backend API: dashboard access, CLI operations, GitHub-based deployment processing, login and API functionality; running deployments stayed online
- 영향 사용자
- –
- 지역
- –
- 감지까지
- –
- 복구까지
- 8m
증상
Railway 백엔드 API 가 트래픽을 받지 못해 대시보드 접속, CLI 작업, GitHub 기반 배포 처리, 로그인, API 가 멈췄다. 이미 돌고 있던 배포는 계속 온라인이었고, 이 시스템들을 쓰지 않은 사용자는 영향을 받지 않았다.
백엔드 복제본은 주기적인 헬스 체크를 통과해야 트래픽을 받는다. 데이터베이스 연결을 얻지 못한 복제본은 비정상으로 표시되어 트래픽을 받지 않는다. 마이그레이션이 잠금에 막힌 사이 연결 시도가 쌓여 PgBouncer 가 데이터베이스의 연결 한도를 넘었고, 복제본이 헬스 체크에 실패해 트래픽 대상에서 빠졌다.
12월 9일 15:17 UTC 에 데이터베이스 마이그레이션이 적용되기 시작했고, 15:18 UTC 에 데이터베이스의 잠금 충돌로 백엔드 복제본이 비정상이 됐다. 15:26 UTC 에 데이터 마이그레이션이 끝나자 모든 백엔드 복제본이 돌아왔다.
원인
- 촉발
- 엔지니어들이 15:03 UTC 에 데이터 마이그레이션이 들어간 데이터베이스 스키마 변경을 머지했다. 이 마이그레이션은 약 10억 행이 있고 많이 쓰는 테이블에 nullable 열을 더하는 것이었다.
감지
–
조치
–
후속 조치
- 데이터베이스 연결 수를 늘리고, PgBouncer 가 그 한도 안에서 동작하도록 다시 설정한다.
- 오래 도는 쿼리를 고쳐 행 잠금 문제가 다시 나지 않게 한다.
교훈
–
출처
관련 사례
같은 원인 · 공통 스키마 마이그레이션, 데이터베이스
같은 원인 · 공통 데이터베이스, 데이터베이스 프록시와 커넥션 풀러
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-0524인덱스를 다시 만드는 마이그레이션이 운영에서 Transactions 테이블을 잠가 Open Collective 서비스가 느려짐Open Collective · 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-0567쿠키런: 오븐브레이크의 패키지 매출 랭킹 기능을 배포한 뒤 Aurora MySQL CPU가 100%에 이르러 유저가 게임에 접속하지 못했다Devsisters · 2023같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0369
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0369/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.