IL-0374 DigitalOcean · 2024-08-05database
DigitalOcean 내부 서비스 디스커버리가 전 리전에서 멈춰 생성, 이벤트 처리, 제어판과 API 관리가 실패했다
DigitalOcean 의 내부 서비스 디스커버리는 데이터스토어 하나에 기댄다. 2024년 8월 5일 16:30 UTC 에 새 데이터센터를 더하는 데이터스토어 클러스터 롤아웃이 시작됐고, 정규 유지보수 시간 밖에서 잘못된 복제 설정이 배포됐다. 이 설정은 키가 하나도 없는 새 데이터센터에 모든 키의 소유권 100%를 줬다. 설정은 곧바로 전 세계로 퍼져 모든 리전에서 데이터스토어 노드의 쿼럼을 깨뜨렸다. 서비스 디스커버리의 클라이언트는 데이터스토어를 읽고 쓰지 못했고, 내부 서비스는 의존하는 서비스를 찾지 못했다. 그 결과 전 세계에서 리소스 생성, 이벤트 처리, 여러 제품의 관리가 멈췄다. 기존 고객 리소스의 가용성은 영향을 받지 않았다.
엔지니어들은 16:42 UTC 에 쿼럼과 소유권 문제를 찾았고, 17:00 UTC 에 새 데이터센터를 더한 복제 설정 변경을 근본 원인으로 확인했다. 17:16 UTC 에 그 변경을 되돌려 데이터스토어 소유자가 된 리전에 적용했다. 일부 리전은 새 설정을 받아들이고 회복하기 시작했지만, 늦게 받아들이는 리전도 있었다. 18:25 UTC 부터 엔지니어들은 그런 리전의 노드에 직접 설정을 적용하고 로컬에서 데이터스토어 repair 를 돌려 데이터를 맞춘 뒤 다음 리전으로 넘어갔다. 남은 실패 이벤트를 정리하고 대기 중인 이벤트를 처리하자 19:10 UTC 에 플랫폼이 안정됐다.
- 심각도
- –
- 영향 범위
- Creates, event processing and management through the Cloud Control Panel and the API for Droplets, networking, login and authentication, Block Storage snapshots, Spaces and CDN, Managed Kubernetes and Managed Databases; existing resources stayed available
- 영향 사용자
- –
- 지역
- Global
- 감지까지
- 5m
- 복구까지
- 2h 40m
증상
2024년 8월 5일 16:30 UTC 부터 DigitalOcean 의 모든 리전에서 이벤트 처리가 실패해 Droplet 이벤트가 실패했고, 리소스 생성과 Cloud Control Panel, API 를 통한 관리가 멈췄다. Droplet 같은 기존 고객 리소스는 계속 온라인이었고 접근할 수 있었다.
내부 서비스들이 자신이 의존하는 다른 서비스를 제대로 찾지 못했다. 처음 보인 영향은 서비스 디스커버리 뒤에 있는 데이터스토어의 I/O 계층이 완전히 멈춘 것이었고, 클라이언트는 데이터스토어를 읽고 쓰지 못했다.
이벤트를 쓰는 Droplet 생성과 업데이트, 네트워크 생성, 로그인과 인증, Block Storage 볼륨 스냅샷 생성, Spaces 와 CDN 생성, Spaces 업데이트, Managed Kubernetes 클러스터 생성, Managed Databases 생성이 영향을 받았다. 이벤트 흐름 밖의 서비스도 서비스 디스커버리로 서로 통신하기 때문에, 고객이 Cloud Control Panel 이나 API 로 여러 서비스를 관리할 때도 영향이 있었을 수 있다.
16:42 UTC 에 엔지니어들은 데이터스토어에 쿼럼이 없고 소유권이 막혀 있다는 문제를 찾았다. 17:16 UTC 에 설정을 되돌리자 일부 이벤트는 더 빨리 실패하기 시작했고, 오류도 분명한 타임아웃 오류에서 엔드포인트를 찾지 못했다는 오류로 바뀌었다. 일부 리전은 되돌린 설정을 늦게 받아들였고, 19:10 UTC 에 남은 실패 이벤트가 풀리며 플랫폼이 안정됐다.
원인
- 촉발
- 새 데이터센터를 더하는 데이터스토어 클러스터 롤아웃에서 잘못된 복제 설정이 배포됐다. 이 설정은 키가 하나도 없는 새 데이터센터에 데이터스토어의 모든 키 소유권 100%를 줬다.
감지
16:35 UTC 에 서비스 디스커버리를 쓸 수 없다는 첫 보고가 내부에서 올라왔다. 데이터스토어 클러스터 롤아웃이 시작되고 5분 뒤였다.
조치
- 17:16 UTC 에 복제 설정 변경을 되돌리고, 데이터스토어 소유자가 된 리전에 되돌린 설정을 적용했다.
- 18:25 UTC 부터 되돌린 설정을 알아채거나 적용하지 못한 리전을 찾아, 엔지니어가 그 리전의 노드에 직접 설정을 적용하고 데이터스토어 repair 를 돌렸다.
- 남은 실패 이벤트를 정리하고, 아직 타임아웃되지 않은 대기 이벤트를 처리했다.
후속 조치
- 이런 확장 유지보수는 선언한 유지보수 시간 안에 하고, 고객 영향 가능성은 상태 페이지의 유지보수 공지로 알린다.
- 이런 배포의 절차 문서를 현재 요구 사항에 맞게 고치고, 새 배포의 단계마다 할 일과 기대하는 결과를 분명하게 적는다.
- 이번에 손으로 한 과정을 자동화해 사람의 실수 가능성을 줄인다.
- 여러 팀이 내부 데이터스토어의 현재 토폴로지가 알맞은지, 그리고 내부 서비스 디스커버리의 가용성을 지키도록 리전 단위로 나누거나 여러 계층으로 구성할 방법이 있는지 검토한다.
교훈
–
출처
- https://status.digitalocean.com/incidents/222822dwq709 · official-status · 보관본
관련 사례
같은 원인 · 공통 서비스 디스커버리
같은 원인 · 공통 코디네이션 키-값 저장소
같은 원인 · 공통 서비스 디스커버리
IL-0392데이터센터 전환을 앞두고 원형 복제를 설정하던 중 Wikimedia x1 섹션의 eqiad·codfw 사이 MariaDB 복제가 6분 멈췄다Wikimedia Foundation · 2024같은 원인 · 공통 데이터베이스 복제
IL-0191Loki distributor 서비스에 레이블 셀렉터가 하나 더 들어가 롤아웃 중 새 파드 몇 개에만 쓰기 트래픽이 몰렸고, 그 파드들이 OOM으로 죽으면서 로그 쓰기 경로가 약 25분간 멈췄다.Grafana Labs · 2022같은 원인 · 공통 서비스 디스커버리
같은 원인 · 공통 데이터베이스 복제
같은 원인 · 공통 데이터베이스 복제
같은 원인 · 공통 데이터베이스 복제
같은 원인 · 공통 데이터베이스 복제
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0374
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0374/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.