IL-0270 Discord · 2023-11-06database
인증용 ScyllaDB 클러스터가 과부하로 조회를 처리하지 못해 Discord 에서 약 50분 동안 접속과 로그인이 되지 않았다
Discord 의 scylla-authentication 클러스터는 사용자 세션 정보를 담고, Rust 로 만든 인증 서비스가 그 앞에서 모든 API 요청의 인증을 확인한다. 이 클러스터는 표준 구성대로, 빠르지만 재부팅하면 지워지는 NVMe 로컬 SSD 와 느리지만 지워지지 않는 영구 디스크를 RAID 로 미러링한다. 데이터는 세 존에 복제하고 쿼럼 읽기를 써서, 존 하나를 잃어도 요청을 처리하도록 설계됐다. 인스턴스가 뜰 때 영구 디스크의 데이터를 NVMe 로 복사하는 RAID 동기화가 40분쯤 걸리고, 이것이 끝나야 Scylla 가 시작한다.
11월 3일부터 영속성 인프라 팀은 존을 하나씩 내려 디스크를 떼고 인스턴스를 종료한 뒤, 새 운영체제의 인스턴스에 디스크를 다시 붙이는 방식으로 Scylla 클러스터들의 운영체제를 업그레이드했다. 존 하나를 내리면 연산 용량이 3분의 1 줄고 여유가 없어져서, 다른 존에 문제가 하나만 더 생겨도 쿼럼을 잃는다. 디스크를 뗀 뒤에는 RAID 재구축 때문에 적어도 45분 동안 용량을 되돌릴 수 없다. 팀은 인증 클러스터를 업그레이드하기 전에 존 b 를 10분 동안 내려 성능을 시험했고 문제가 없었다. 9:16 AM 에 업그레이드를 시작해 10:42 AM 에 존 b 를 마쳤다. 이때 scylla-authentication-b-2 의 RAID 재구축이 유난히 느렸지만 팀은 이상한 점으로만 보고 넘겼다. 운영자는 클러스터가 정상인 것을 확인하고 다음 존으로 넘겼고, 10:52 AM 에 존 c 의 연결이 모두 비워지면서 장애가 시작됐다.
원인은 여러 가지가 겹친 것이었다. 클러스터는 용량이 부족했다. scylla-authentication-b-2 의 NVMe 로컬 SSD 하나가 성능이 떨어져 디스크 I/O 가 나빴다. 이 클러스터는 행 캐시 적중률이 일정 수준이 돼야 노드를 안전하게 재시작할 수 있다. 그런데 팀은 앞선 시험으로 잘못된 확신을 얻어, 방금 재시작한 존 b 노드의 캐시 적중률을 확인하지 않았다. 애플리케이션의 재시도 폭주가 부하를 더 키웠다. 존 c 는 디스크가 이미 떼어져 다시 올리려면 45분쯤 기다려야 했다. 팀은 11:05 AM 에 입력 중 표시와 읽음 표시를 꺼 부하를 덜었고 사용자의 약 50% 가 회복됐다. 노드를 재시작하면 쿼럼이 확실히 깨질 수 있어서, 팀은 재시작하지 않고 원인을 찾았다. 존 b 노드들이 과부하라는 것을 알아낸 11:35 AM 에는 RAID 재구축이 5분 남아 있어 기다리기로 했다. 11:41 AM 에 존 c 의 두 노드가 올라오자 존 b 노드를 한 대씩 재시작했고 11:43 AM 에 사용자 활동이 정상으로 돌아왔다. 장애는 서비스 가용성에만 영향을 줬고, 인증 서비스가 내놓은 결과의 정확성에는 영향이 없었다. 외부 공격이나 무단 접근 때문도 아니었다.
- 심각도
- –
- 영향 범위
- Discord authentication: users could not connect, log in, read or send messages; availability fell to about 25%, then about 50% of users could use Discord until 11:43 AM PST
- 영향 사용자
- Discord users; about 50% could use the service from 11:05 AM until recovery
- 지역
- –
- 감지까지
- 4m
- 복구까지
- 51m
증상
2023년 11월 6일 10:52 AM PST 에 업그레이드 스크립트가 scylla-authentication 클러스터의 존 c 연결을 모두 비우자, 2xx 응답 비율로 재는 Discord 의 가용성이 곧바로 약 25% 로 떨어졌다. 사용자는 접속, 로그인, 메시지 읽기와 보내기를 거의 할 수 없었다. 첫 알림은 4분쯤 뒤인 10:56 AM 에 울렸다.
하위 서비스별 소요 시간 그래프에서 인증 서비스가 사용자 요청을 처리하는 데 평소보다 훨씬 오래 걸리는 것이 보였다. 시점이 겹쳐 팀은 진행 중이던 인증 클러스터 업그레이드를 곧바로 의심했고, 잠시 뒤 인증 알림이 울려 의심이 맞았음을 확인했다.
인증 클러스터는 쿼리로 포화돼 지연이 높았다. 11:05 AM 에 입력 중 표시 이벤트와 메시지 읽음 표시를 끄자 사용자의 약 50% 가 다시 인증됐지만 완전히 회복되지는 않았다. 노드 네 대가 모두 과부하였고, 노드마다 일부 샤드의 부하가 100% 였다.
서버 오류가 나면 애플리케이션이 인증 엔드포인트 요청을 다시 보냈다. 요청이 타임아웃되기 시작하자 재시도가 폭주해 Scylla 클러스터의 부하가 더 커졌다.
인증 서비스의 오류 메시지가 엉뚱한 쪽을 가리켜 조사가 한 번 빗나갔다. 그 뒤 Scylla 로그에서 존 b 의 두 노드 scylla-authentication-b-1 과 scylla-authentication-b-2 에 연결하는 오류가 나오는 것을 보고 두 노드가 과부하임을 알았다.
업그레이드 중 존 b 를 내렸을 때 클러스터의 지연과 오류율은 정상이었다. 다만 scylla-authentication-b-2 는 짝 노드보다 RAID 배열을 훨씬 느리게 다시 만들었다. 팀은 이를 이상한 점 정도로만 보고 넘겼다. 이 노드에 붙은 NVMe 로컬 SSD 하나가 성능이 떨어져 있었다.
원인
- 촉발
- 2023년 11월 6일 운영체제 업그레이드 절차가 scylla-authentication 클러스터의 존 b 를 마친 뒤, 10:52 AM 에 스크립트가 존 c 의 연결을 모두 비우고 업그레이드를 시작했다. 존 b 에는 디스크 성능이 떨어진 노드가 있었다.
감지
첫 알림이 장애 시작 4분쯤 뒤인 10:56 AM 에 울렸지만, 팀은 그 전에 이미 사고 대응 통화를 열고 조사하고 있었다. 하위 서비스별 소요 시간 그래프가 인증 서비스를 가리켰고, 잠시 뒤 인증 알림이 울렸다.
조치
- 11:05 AM 에 인증 클러스터의 부하를 덜려고 입력 중 표시 이벤트와 메시지 읽음 표시를 껐다.
- RAID 재구축이 끝나기를 기다려 11:41 AM 에 존 c 의 두 노드를 다시 올렸다.
- 과부하였던 존 b 의 두 노드를 한 대씩 재시작했다.
후속 조치
- 사고 직후 scylla-authentication 클러스터를 두 배로 늘려 용량을 더했다.
- scylla-authentication-b-2 를 성능이 떨어지지 않은 새 디스크로 다시 만들었다.
- 전체 지연에는 드러나지 않을 만큼 약하지만 서비스 신뢰성에 위험이 될 수 있는 디스크 성능 저하를 찾아내는 방법을 만든다.
- Scylla 클러스터의 컨트롤 플레인을 더 자동화하고 업그레이드 작업을 그곳으로 옮겨, 캐시 적중률 같은 클러스터 분석을 업그레이드 절차에 넣는다.
- 복제 계수를 늘리거나 다른 리전에 핫 스탠바이 클러스터를 두는 방안을 검토해, 이 작고 중요한 클러스터의 이중화를 늘린다.
교훈
클러스터는 존 하나를 잃어도 견디게 설계했지만, 존 하나가 내려간 상태에서 다른 존의 노드 하나 성능이 떨어진 것만으로 이 정도 장애가 났다는 것은 클러스터의 용량이 부족했다는 뜻이다. 노드 재시작 전에 캐시 적중률이 일정 수준이 돼야 하는 것도 용량 부족의 신호다. 업그레이드 전 존 중단 시험은 계속 진행해도 안전하다는 잘못된 확신을 줬다. 이 작고 중요한 클러스터는 훨씬 큰 다른 클러스터들과 다르게 운영해야 한다.
출처
관련 사례
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0288CDN77 의 ClickHouse 데이터 파이프라인에서 이중화된 인스턴스 세 곳의 ZooKeeperWait 가 수천 초로 치솟아 복제가 한 시간 넘게 느려졌다CDN77 · 2026같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0305Intercom 의 PlanetScale 샤드 하나에서 복제본이 CPU 100% 로 주 데이터베이스를 따라가지 못해 받은편지함에 최대 2.2시간 전의 데이터가 보였다Intercom · 2026같은 원인 · 공통 데이터베이스
IL-0390PostHog US Cloud 의 Persons Postgres 데이터베이스 쓰기가 크게 느려져 이벤트와 persons 수집이 최대 2일 지연됐다PostHog · 2025같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0287Atlas 와 Cloud Manager 의 모니터링을 받치는 내부 데이터베이스 클러스터의 샤드 하나가 과부하되어 지표 수집과 클러스터 작업이 늦어졌다MongoDB · 2025같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0298Wikimedia sessionstore 의 Cassandra 노드가 디스크가 가득 차 잇따라 죽고 쿼럼을 잃어 편집이 실패했다Wikimedia Foundation · 2025같은 원인 · 공통 데이터베이스
IL-0312max_connections 를 올리려고 재시작한 주 PostgreSQL 데이터베이스가 다시 올라오지 않아 Gadget 의 모든 앱 요청이 멈췄다Gadget · 2024같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0110Grafana Agent 파드가 메모리를 많이 쓰던 노드에 Hangfire 파드가 함께 올라가 시스템 OOM 으로 CrashLoopBackOff 를 반복했고, 노드가 응답을 멈추고 NotReady 가 됐다.DFDS · 2024같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0202갑자기 몰린 쿼리와 데이터베이스 쓰기로 Honeycomb 수집 호스트가 메모리 부족으로 죽었고, 쿠버네티스 CrashLoopBackOff 가 용량 회복을 막아 US1 이벤트 수집이 한 시간 넘게 불안정했다Honeycomb · 2023 · sev1같은 원인 · 공통 데이터베이스
IL-0386Google Cloud 로 옮긴 뒤 GKE 노드에서 Postgres 연결 타임아웃과 memcached i/o timeout 이 간헐적으로 튀었다incident.io · 2023같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0206GKE 파드 안의 Consul 에이전트가 메모리 급증으로 거듭 OOM kill 되어 Rails 파드가 데이터베이스 복제본을 찾지 못했고, 모든 쿼리가 primary 로 몰려 GitLab.com 이 느려졌다.GitLab · 2022같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0496전역 복제 Cassandra 클러스터에서 모든 리전의 인스턴스 CPU 가 100% 로 치솟아 쿼리가 타임아웃됐고, 같은 부하가 이틀 저녁 더 찾아왔다Ably · 2020같은 원인 · 공통 데이터베이스
IL-0443Aurora MySQL reader 가 이유 없이 재시작한 뒤 writer 의 insert latency 가 7배쯤 오르고 replication lag 가 하루 넘게 이어졌다Repro · 2019같은 원인 · 공통 데이터베이스
IL-0037imagePullPolicy가 Always인 DaemonSet이 크래시 루프를 돌며 이미지를 계속 받아, NAT 세 대를 같이 쓰던 리전 전체가 이미지 레지스트리에서 429로 막혔다Datadog · 2019같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0211Mandrill 의 PostgreSQL 샤드 하나가 트랜잭션 ID 랩어라운드를 막으려고 쓰기를 멈춰 약 40시간 동안 메일 발송이 줄었다Mailchimp · 2019같은 원인 · 공통 데이터베이스
IL-0064CPU 를 많이 쓰는 파드가 Google Cloud 노드 하나에 몰려 노드가 커널 패닉으로 죽었고, 다시 배치된 파드가 다음 노드를 또 죽이며 웹사이트와 API 가 멈췄다.Moonlight · 2019같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0334RDS MySQL 의 bookmarks 테이블이 2TB 파일 크기 한도에 닿아 INSERT 가 실패하고 Instapaper 가 31시간 동안 멈췄다Instapaper · 2017같은 원인 · 공통 데이터베이스
IL-0333사양을 낮춘 RDS PostgreSQL 인스턴스가 피크 부하를 못 버텨 헬스 체크가 실패하고 Buildkite 대시보드가 몇 시간 동안 내려갔다Buildkite · 2016같은 원인 · 공통 데이터베이스
IL-0282US-East 리전의 DynamoDB 스토리지 서버들이 멤버십 정보를 받지 못해 스스로 요청 처리에서 빠지면서 고객 요청의 약 55% 가 실패했다Amazon Web Services · 2015같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0270
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0270/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.