IL-0289 updown.io · 2019-04-03database
updown.io 의 주 MongoDB 서버가 쿼리에 평소보다 약 200배 느리게 응답해 사이트와 모니터링 데몬이 거의 멈췄는데 자동 페일오버가 일어나지 않았다
2019년 4월 3일 2:30 am CEST 에 updown.io 의 주 MongoDB 서버가 쿼리에 평소보다 약 200배 느리게 응답하기 시작해 웹사이트와 모니터링 데몬이 거의 다 멈췄다. 하트비트 검사는 계속 빠르게 답했기 때문에 MongoDB 의 자동 페일오버가 문제를 보지 못했고, 대기 중인 보조 서버가 주 서버로 선출되지 않았다. 운영자는 자고 있다가 8:45 에야 문제를 알았다. 운영자는 주 서버의 I/O 문제를 확인하고 보조 서버가 넘겨받을 준비가 됐는지 본 뒤 주 서버를 강제로 step down 시켰다. 8:56 에 플랫폼 전체가 돌아왔지만, 보조 서버의 사양이 낮아 성능은 떨어졌다. 원인은 RAID5 로 묶은 SSD 3개 가운데 하나였고, 이 디스크를 어레이에서 빼자 서버 성능이 원래대로 돌아왔다.
그 뒤 며칠 동안 보조 서버가 주 서버 역할을 하면서 장애가 더 이어졌다. 4월 4일 3:56 am 에는 매일 도는 clamscan 백신 검사와 MongoDB 가 메모리를 다 써, 커널의 OOM Killer 가 MongoDB 를 죽였다. 운영자는 8:40 에 MongoDB 를 재시작하고 스왑 공간을 더했다. 4월 5일 3:56 부터 5:30 까지는 clamscan 이 다시 MongoDB 를 느리게 했다. DNS 자동 페일오버가 이 서버를 죽은 것으로 보고 트래픽을 꺼져 있던 주 서버로 돌려, 일부 사용자가 연결 오류를 겪었을 수 있었다. 운영자는 clamscan 과 DNS 페일오버를 껐고, 4월 6일 12:48 pm 에 보조 서버를 더 높은 사양의 서버로 바꿔 응답 시간을 되돌렸다.
호스팅 업체가 4월 6일 밤 SSD 를 바꿨지만, 같은 날 밤 다른 SSD 하나가 같은 방식으로 죽어 운영자는 다시 교체를 요청했다. 두 디스크 모두 정격 내구 수명을 한참 넘긴 것으로 보였다. 두 번째 SSD 는 4월 16일에 교체됐고, 관찰 기간을 거쳐 4월 22일에 원래 서버를 다시 주 서버로 돌렸다. 운영자는 MongoDB 가 살아 있지만 응답하지 않는 상황을 찾아 자동으로 step down 시키는 스크립트를 만들었다. 2019년 11월 6일 세 번째 SSD 가 죽었을 때 이 스크립트 덕분에 중단 시간이 10분 아래로 줄었다.
- 심각도
- –
- 영향 범위
- The updown.io website and monitoring daemons were almost fully down from 2:30 am to 8:56 am CEST, then ran with lower performance on the less powerful secondary
- 영향 사용자
- –
- 지역
- –
- 감지까지
- 6h 15m
- 복구까지
- 6h 26m
증상
2019년 4월 3일 2:30 am CEST 부터 updown.io 의 주 MongoDB 서버가 쿼리에 평소보다 약 200배 느리게 응답했다. 웹사이트와 모니터링 데몬이 거의 전부 멈췄다.
MongoDB 의 하트비트 검사는 계속 빠르게 응답했다. 그래서 대기 중인 보조 서버가 있었는데도 자동 페일오버가 문제를 감지하지 못했고 보조 서버가 주 서버로 선출되지 않았다.
주 서버를 살펴보니 디스크 I/O 성능에 문제가 있었다. atop 출력에서 디스크 3개의 사용률을 뜻하는 busy 와 평균 지연을 뜻하는 avgio 를 보니, RAID5 로 묶은 SSD 3개 가운데 하나가 원인이었다.
원인
원인 하드웨어 고장
- 촉발
- 주 MongoDB 서버의 RAID5 를 이루는 SSD 3개 가운데 하나가 고장 나기 시작해 디스크 I/O 가 크게 느려졌다.
감지
MongoDB 의 자동 페일오버는 하트비트가 계속 빠르게 응답해 문제를 감지하지 못했다. 운영자는 자고 있다가 8:45 am CEST 에야 문제를 알아챘다.
조치
- 보조 서버가 넘겨받을 준비가 됐는지 확인한 뒤 주 서버를 강제로 step down 시켰다. 8:56 am CEST 에 웹과 데몬 전체가 돌아왔지만, 보조 서버의 사양이 낮아 성능은 떨어졌다.
- I/O 문제를 일으킨 SSD 를 RAID 어레이에서 빼자 서버가 원래 성능으로 돌아왔다.
- 호스팅 업체에 SSD 교체 일정을 잡는 티켓을 열었다.
- 4월 6일 12:48 pm 에 보조 서버를 더 높은 사양의 서버로 바꿨고, 그 뒤 응답 시간이 정상으로 돌아왔다.
후속 조치
- MongoDB 팀이 이 문제를 곧 고칠 것 같지 않아, MongoDB 가 살아 있지만 응답하지 않는 상황을 찾아 자동으로 step down 시키는 스크립트를 만든다.
- 더 조사할 것이 없다고 확인되면 옛 보조 서버를 내리고 지운다.
- 새 보조 서버가 며칠 동안 주 서버 역할을 버틸 수 있는지, clamscan 이 도는 밤까지 포함해 확인한다.
- 주 서버가 정상으로 돌아오면 자동 step down 스크립트를 시험한다.
- updown.io 의 제대로 된 상태 페이지를 만든다.
- MongoDB 가 Storage Node Watchdog 을 커뮤니티 에디션에도 제공하자 이를 켜서 한동안 시험했다. 잘 동작해 직접 만든 스크립트는 지웠다.
교훈
–
출처
참고 문서
관련 사례
IL-0306Neon us-east-1 에서 pageserver 를 돌리던 EC2 인스턴스가 예고 없이 죽어 프로젝트 0.4% 의 Postgres 가 최대 2시간 동안 멈췄다Neon · 2024같은 원인 · 공통 데이터베이스, 데이터베이스 장애 조치 관리자
IL-0219Postgres 프라이머리의 디스크 어레이가 망가진 뒤 Pacemaker 가 새 프라이머리를 승격하지 못해 GoCardless API 와 대시보드가 1시간 50분 멈췄다GoCardless · 2017같은 원인 · 공통 데이터베이스, 데이터베이스 장애 조치 관리자
같은 원인 · 공통 데이터베이스
IL-0370Frankfurt 에서 노드 하드웨어 장애 뒤 Render Postgres 데이터베이스가 다른 노드에서 시작하지 못해 최대 1시간 5분 멈췄다Render · 2022같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0289
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0289/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.