IL-0322 GitLab · 2026-06-11databasegcp
GitLab.com 의 모든 주요 서비스에서 HTTP 503 오류가 두 차례 쏟아졌다가 저절로 멎었다
2026-06-11 https://gitlab.com 의 모든 주요 서비스가 06:16~06:22 UTC 와 07:03~07:12 UTC 두 차례 HTTP 503 오류를 냈다. 오류는 넓은 범위에서 끊겼다 이어지기를 반복했다. 영향은 06:12 에 시작됐다. 06:16 에 Pingdom 알림이 이를 잡았고 06:17 에 Severity 1 로 올라갔다. 두 번 모두 5~10분 안에 저절로 회복했다.
원인은 us-east1-b 존의 GCP 스토리지 장애였고, 이 장애가 주 데이터베이스 노드가 쓰는 디스크에 영향을 줬다. 디스크 IO 가 떨어지자 주 노드에서 IO 큐 깊이가 치솟고 LWLock 경합, 복제 지연, pgBouncer 연결 풀 포화가 뒤따랐다. Postgres 와 Redis 로 가는 호출이 막혀 요청이 60초 Rack 제한에 걸려 타임아웃됐다. 주 데이터베이스로 가는 트래픽은 모두 주 노드 하나를 거쳤다. 애플리케이션의 데이터베이스 부하 분산은 주 노드가 응답하지 않을 때 요청을 덜어 내거나 다른 곳으로 보내지 못했다. 그래서 요청이 빨리 실패하지 않고 Rack 타임아웃까지 쌓였다. 장애 조치는 사람이 판단해야 했고 미리 정한 기준이 없었다.
팀은 데이터베이스 운영 전문가에게 장애를 에스컬레이션하고 배포를 멈췄다. 08:13 에 주 노드의 디스크 IO 큐 깊이 급증 두 번을 찾아 GCP TAM 에 연락했고, 08:56 에 GCP 지원 케이스를 열었다. 12:15 에 클라우드 제공자 장애가 원인으로 확인됐다. 12:29 에 us-east1-d 의 04 노드로 Patroni 주 노드 전환을 준비했지만 실행하지는 않았다. 서비스는 07:25 부터 안정적이었고, 15:19 에 장애를 멈춰 두고 3시간 동안 검토해 재발이 없음을 확인한 뒤 해결로 처리했다.
- 심각도
- sev1
- 영향 범위
- Web, frontend, API, git, websockets, web-pages and CI runners on https://gitlab.com returned HTTP 503 errors during 06:16-06:22 and 07:03-07:12 UTC
- 영향 사용자
- All external customers and users of https://gitlab.com
- 지역
- GCP us-east1-b (zone of the degraded disk)
- 감지까지
- 4m
- 복구까지
- 1h
증상
2026-06-11 06:16 UTC 에 Pingdom 알림이 https://gitlab.com 의 HTTP 503 오류를 알렸다. 웹, 프런트엔드, API, git, 웹소켓, web-pages, CI 러너가 06:16~06:22 UTC 와 07:03~07:12 UTC 두 차례 503 을 냈다. 오류는 여러 서비스에 걸쳐 끊겼다 이어지기를 반복했고, 매번 5~10분 안에 저절로 회복했다.
요청은 60초 Rack 제한에 걸려 타임아웃됐다. Redis 와 Postgres 로 가는 네트워크 호출이 막혀 있었다. HAProxy 5xx 오류는 06:18~06:20 과 07:06~07:08 에 가장 많았다.
주 데이터베이스 인스턴스 patroni-main-v17-01-db-gprd 의 디스크 IO 큐 깊이가 06:16 에 약 219, 07:00~07:02 에 약 353 에서 405 로 치솟아 오류 구간과 겹쳤다. 같은 구간에 LWLock 경합, pg_wait_sampling_buffer_mapping, 복제 지연, sync 와 async pgBouncer 풀 포화가 함께 튀었다.
첫 번째 구간이 지난 뒤 팀은 일시적인 외부 네트워크 문제로 판단하고 06:30 에 상태를 Monitoring 으로 바꿨다. 07:03 에 두 번째 구간이 시작되고 07:10 에 sync 와 async 풀 모두에서 pgBouncer 풀 포화가 보이자 상태를 Investigating 으로 되돌리고 데이터베이스 운영 tier2 로 에스컬레이션했다. Cloudflare 데이터로 DDoS 와 느린 쿼리는 일찍 배제했고, 장애 전에 이상한 요청량도 없었다.
원인
원인 클라우드 제공자 장애
- 촉발
- us-east1-b 존의 GCP 스토리지 장애로 주 데이터베이스 노드가 쓰는 디스크의 스토리지 IO 성능이 떨어졌다.
감지
06:16:12 UTC 에 Pingdom 알림이 장애를 알렸다. 영향은 06:12 에 시작됐으므로 감지까지 약 4분이 걸렸다. 사용자에게 보이는 503 은 알림이 잡았지만, 먼저 나타난 신호인 디스크 IO 포화, pgBouncer 풀 포화, LWLock 경합에는 알림이 없었다.
조치
- 두 번째 구간이 데이터베이스와 연결 계층을 가리키자 07:11 UTC 에 데이터베이스 운영 tier2 로 장애를 에스컬레이션했다. 데이터베이스 전문가가 LWLock 경합, pg_wait_sampling_buffer_mapping 급증, 복제 지연을 깊이 진단했다.
- 배포를 멈췄다.
- 08:13 UTC 에 GCP TAM 에 연락하고 08:56 에 GCP 지원 케이스를 열었다. 클라우드 제공자가 스토리지 장애를 확인해 줬다.
- 다시 나빠지면 바로 실행할 수 있게 us-east1-d 의 04 노드로 Patroni 주 노드 전환을 준비했다. 쓰기 처리량에 줄 영향도 따져 두었지만 실행하지는 않았다.
- GCP 쪽 문제가 가라앉은 것으로 보이자 15:19 UTC 에 장애를 멈춰 두고 3시간 동안 지켜봤고, 재발이 없음을 확인한 뒤 해결로 처리했다.
후속 조치
- Patroni 주 데이터베이스 노드에 디스크 IO 포화와 큐 깊이 알림을 넣는다.
- 명시적인 실행 기준을 담은 Patroni 주 노드 전환 런북을 쓴다.
- 끊겼다 저절로 회복하는 장애에서 장애 상태를 언제 바꿀지 지침을 분명히 한다.
- 디스크 IO 가 떨어지는 동안 자동으로 장애 조치했어야 했는지 검토한다.
- Cells 는 장기적으로 영향 범위를 줄이도록 설계됐다. 그와 별도로 디스크 하나가 GitLab.com 전체를 멈추지 않도록 단기 완화책을 마련한다.
- 주 노드가 응답하지 않을 때 애플리케이션의 데이터베이스 부하 분산이 요청을 덜어 내거나 다른 곳으로 보내, 요청이 60초 Rack 타임아웃까지 쌓이지 않고 빨리 실패하게 한다.
- pgBouncer 풀 포화와 LWLock 경합이 전면 장애보다 먼저 튀었으므로, 이 둘을 먼저 나타나는 신호로 보고 알림을 걸지 검토한다.
교훈
디스크 하나가 나빠진 것만으로 GitLab.com 전체가 멈췄다. 데이터베이스 부하 분산이 빨리 실패하지 않아 요청이 60초 Rack 타임아웃까지 쌓였다. 빨리 실패하지 않는 문제는 이전 장애 #18269 에서 얻은 교훈과 겹쳤다. 장애 조치 기준이 미리 정해져 있지 않아 문제가 다시 날지 몰라 지켜보고 기다리는 데 많은 시간을 썼다. 클라우드 제공자 장애가 넓게 퍼진 상황이라 어느 존이 정상인지 미리 확인할 수도 없었다. 끊겼다 저절로 회복하는 장애에서는 장애 상태를 언제 Fixing 이나 Monitoring 으로 옮길지 정하기 어려웠다.
출처
참고 문서
- https://gitlab.com/gitlab-com/gl-infra/production/-/issues/18269
- https://gitlab.com/gitlab-com/gl-infra/production-engineering/-/work_items/29220
- https://gitlab.com/gitlab-com/gl-infra/production-engineering/-/work_items/29221
- https://gitlab.com/gitlab-com/gl-infra/production-engineering/-/work_items/29222
- https://gitlab.com/gitlab-com/gl-infra/production-engineering/-/work_items/29192
관련 사례
같은 원인 · 공통 데이터베이스, 클라우드 블록 스토리지
같은 원인 · 공통 데이터베이스
IL-0368AWS us-east-1 장애 동안 PlanetScale 컨트롤 플레인이 멈추고, 이어 일부 데이터베이스 브랜치가 네트워크 분할로 쿼리에 실패했다PlanetScale · 2025같은 원인 · 공통 데이터베이스
IL-0284Workers KV 의 저장소 인프라가 멈춰 KV 에 기대는 Access, WARP, Gateway, 대시보드 같은 Cloudflare 서비스 여럿이 2시간 28분 동안 전 세계에서 실패했다Cloudflare · 2025같은 원인 · 공통 데이터베이스
IL-0119Cosmos DB 장애 뒤 ChatGPT 웹 서비스 파드가 헬스 체크 실패로 크래시 루프에 빠져 chatgpt.com 과 일부 API 의 오류율이 높아졌다.OpenAI · 2025같은 원인 · 공통 데이터베이스
IL-0145Australia East 의 전압 강하로 냉각기가 멈춰 데이터 홀 장비가 꺼지면서, 영역 중복이 아닌 AKS 작업 큐 데이터베이스가 내려가 두 리전의 AKS 생성, 수정, 삭제 작업이 막혔다Microsoft Azure · 2023같은 원인 · 공통 데이터베이스
IL-0172AWS 도쿄 리전 한 AZ 의 냉각 장애로 쿠버네티스 위에서 돌던 CockroachDB 노드 60대 중 6대가 22분 만에 죽었고, AZ 토폴로지 설정이 없어 일부 Range 가 정족수를 잃었다.Devsisters · 2021같은 원인 · 공통 데이터베이스
IL-0193GCP SSD 영구 디스크 장애로 Cassandra 파드가 볼륨을 붙이지 못했고, OrderedReady 정책 때문에 나머지 파드도 다시 뜨지 못한 데다 Metrictank 가 바뀐 Cassandra IP 로 다시 연결하지 못해, Grafana Cloud Graphite 쿼리 일부가 최대 23시간 실패했다.Grafana Labs · 2019같은 원인 · 공통 데이터베이스
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0322
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0322/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.